这个问题有两个部分:
- 如何找到通过第三点的两点之间的弧?
- 如何在找到的弧上生成一组点?
让我们从第一部分开始。给定(O, r) 圆上的三个点A、B 和C,我们希望找到通过B 的A 和C 之间的弧。要找到圆弧的内角,我们需要计算AB 和AC 圆弧的oriented angles。如果AB 的角度大于AC,则方向错误:
Va.x = A.x - O.x;
Va.y = A.y - O.y;
Vb.x = B.x - O.x;
Vb.y = B.y - O.y;
Vc.x = C.x - O.x;
Vc.y = C.y - O.y;
tb = orientedAngle(Va.x, Va.y, Vb.x, Vb.y);
tc = orientedAngle(Va.x, Va.y, Vc.x, Vc.y);
if tc<tb
tc = tc - 2 * pi;
end
function t = orientedAngle(x1, y1, x2, y2)
t = atan2(x1*y2 - y1*x2, x1*x2 + y1*y2);
if t<0
t = t + 2 * pi;
end
end
现在是第二部分。你说:
我可能需要一个循环,通过旋转一点来计算每个点
在它计算了一个点之后。
但问题是,有多少?由于圆的周长随着半径的增加而增加,因此您无法以固定的角度达到固定的精度。换句话说,要绘制两条角度相同、半径不同的圆弧,我们需要不同数量的点。我们可以假设[几乎]恒定的是这些点之间的距离,或者我们为模拟弧线而绘制的线段的长度:
segLen = someConstantLength;
arcLen = abs(tc)*r;
segNum = ceil(arcLen/segLen);
segAngle = tc / segNum;
t = atan2(Va.y, Va.x);
for i from 0 to segNum
P[i].x = O.x + r * cos(t);
P[i].y = O.y + r * sin(t);
t = t + segAngle;
end
请注意,虽然在此方法中A 和C 肯定会创建,但B 不一定是创建的点之一。但是,这个点到最近的线段的距离会很小。