因此,我想在两次单击之间在X,Y坐标中获得20点。唯一的标准是,这些点必须始终在两次单击之间的较小角度之间。
假设圆的中点是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条这样的曲线。计算出的曲线以白色显示,蓝色是所需的输出。render
您需要计算差异,所以它在[-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不会更改实际的“可见”角度)。