c++ - 在较小角度的圆上找到两点之间的点
问题描述
所以我的想法是我想在一个圆圈上两次点击之间的 X,Y 坐标中获得 20 个点。唯一的标准是这些点必须始终位于 2 次点击之间的较小角度之间。
假设圆的中点是cx,cy,半径是cr,两次点击是p1.x,p1.y和p2.x,p2.y
到目前为止,我试图做的是从 X 轴相对于圆心获得两次点击的角度。
float from = std::fmod(atan2(p1.y - c.y, p1.x - c.x), 2 * M_PI); //Update range to 0-2pi
float to = std::fmod(atan2(p2.y - c.y, p2.x - c.x), 2 * M_PI);
然后得到两次点击之间的距离。并计算循环中点的坐标。
float fi = from + ((to - from)* i / 20); // 20 points needed
vertices[i] = vec2(c.x + c.r * cosf(fi), c.y + c.r * sinf(fi)); // x = cx+r*cos(fi), y=cy+r*sin(fi)
这种方法的问题在于,在某些情况下,它会返回圆的外曲线。图片显示了 3 次点击后的 3 条这样的曲线。计算的曲线以白色显示,蓝色是所需的输出。 使成为
解决方案
您需要计算差异,因此它在 [-PI;PI] 范围内。
你可以这样做:
float from = atan2(p1.y - pos.y, p1.x - pos.x);
float to = atan2(p2.y - pos.y, p2.x - pos.x);
float diff = to - from;
if (diff<-PI) {
diff += 2*PI;
} else if (diff>PI) {
diff -= 2*PI;
}
然后你可以像这样计算“插值”角度:
float fi = from + diff*t; // t is a number between 0 and 1
这是可行的,因为atan2
返回 -PI 和 PI 之间的角度,所以简单的差异将在 -2*PI 和 2*PI 之间。并且if
会将这个范围限制在 -PI 和 PI 之间(加/减 2*PI 不会改变实际的“可见”角度)。
推荐阅读
- laravel - many to many relationship - save in multiple database column and retrieve
- reactjs - React native 无法从 '10' 确定 java 版本
- angular - How to get firestore timestamp
- angular - Got a sass-loader error when I upgraded my dependencies from angular 2 to angular 5
- bash - Linux date 命令生成电子邮件标头
- php - 如何用sql计算数组中的每个项目
- ios - 如何从 SKscene 检测设备旋转
- javascript - 隐藏表格行的包含超链接文本,直到搜索到
- excel - 如果合并的单元格为空,则删除行
- javafx - 如何单击 GridPane 单元并让它执行操作?