与终点处的圆弧相切的圆弧和直线

时间:2014-10-06 18:57:16

标签: geometry computational-geometry

我有:

弧:由p1x,p1y - p2x,p2y,radius,center,initial - final ang定义。

线:由ax,ay-bx,by。定义。

正如你在图像中看到的那样,我想要找出一个与圆弧和直线相切并且经过第一个圆弧终点的圆弧。

我认为有一个独特的解决方案。 (或者两个,R +和R - )

我试着看看如何实现算法,没有结果...

任何想法都会受到赞赏......

enter image description here

1 个答案:

答案 0 :(得分:1)

您要做的是找到一条与无限线“L”相切的圆,并与圆上特定点的圆相切。关键的观察是,由于tangent vector to any circle at a given angle is perpendicular to the radius vector for that angle,我们需要找到的是点“TC”(“切线中心”)和距离“d”,在该距离处,从给定线偏移距离d的线相交从圆圈向外拉出相同距离的法线(原谅我的坏艺术):

bad art is bad

解决“d”的最简单方法如下:

  1. 通过P-C和归一化在点“P”构造归一化法向量“R”。 (这构造了圆的外切线。如果你想要一个内切线,你可以翻转。)

  2. 将标准化的垂直向量“N”构造成“L”行。我不确定你的变量“ax,ay - bx,by”是什么意思,所以让我们用起点“A =(ax,ay)”和方向矢量“DA =(dax,day)定义线条”。在这种情况下,法线为+/- (-day, dax)/sqrt(day*day+dax*dax)。 (与3d中的(0,0,1)向量的归一化交叉。)

  3. 选择符号“N”,使其从P指向,即如果(PA)和N的点积为正,则翻转N.如果点积是(接近)为零,那么切线圆将具有半径(接近)零,因此未定义。

  4. 现在考虑对于某些d,由P2 = P + d *(R + N)定义的点TC。如果P2位于线L上,则d是我们寻找的切线圆的半径!当且仅当(P2-A)和N的点积为零时,P2才位于该线上。这在一个变量中定义了一个线性方程 - d - 所以你可以解决它。注意,如果R + N(几乎)长度为零,则P与圆和线之间的最近点相差180度;您需要明确检查并处理它。

  5. 一旦你有了d,你可以得到圆圈的中心TC = P + d * R.

  6. 当P处圆的切线与线平行或几乎平行时,此方法应具有良好的数值稳定性。

    您没有指定语言,但希望这可以帮助您入门。我的主要语言是c#。