确定算法的算法,该算法计算与圆相交的点,其中线段从圆的内部到外部相交

时间:2019-04-30 05:33:04

标签: algorithm geometry intersect

我在点A和点B之间有一个线段。A在一个以0,0为中心,半径为R的圆内。我很困惑,试图提出一种有效的方法来计算线段的交点AB与这个圈子。

2 个答案:

答案 0 :(得分:0)

这仅仅是二级方程的解析度

线是y = A.x + B,其中A和B是常数 圆为y ^ 2 = R ^ 2--x ^ 2,其中R为半径,圆心为0,0

所以(A.x + B)^ 2 = R ^ 2-x ^ 2 => A ^ 2.x ^ 2 + 2.A.x.B + B ^ 2 = R ^ 2- -x ^ 2 => (A ^ 2 + 1).x ^ 2 + 2.A.B.x + B ^ 2-R ^ 2 = 0

算法为:

让P = A ^ 2 + 1,G = 2.A.B,H = B ^ 2-R ^ 2 等式为:P.x ^ 2 + G.x + H = 0

根据增量给出3种情况 delta = G ^ 2-4 * P * H

如果delta <0 =>没有交集 如果delta = 0 =>相交于1点:x = -G / 2 * P和y = Ax + B 如果delta> 0 =>相交于2个点:x1 =(-G-sqrt(delta))/(2 * P),y1 = Ax1 + B和x2 =(-G + sqrt(delta))/(2 * P),y2 = Ax2 + B(其中sqrt是平方根)

答案 1 :(得分:0)

  

然后,您只需确定两个结果答案中哪个给出的点在A和B之间即可。

我们将两个结果称为I1I2。要确定哪个是答案,您需要对照A->I1检查A->I2A->B向量的方向,其中A是位于圆内的点:< / p>

% line: y = mx + b
m = (yB - yA) / (xB - xA);
b = yA - m * xA;

% circle: x^2 + y^2 = r^2
% intersection: x^2 + (mx + b)^2 = r^2
% ...           x^2 + m^2x^2 + b^2 + 2mbx - r^2 = 0
% ...           (1 + m^2)x^2 + 2mbx + (b^2 - r^2) = 0

A = 1 + m^2;
B = 2 * m * b;
C = b^2 - r^2;
sqrtD = sqrt(B^2 - 4*A*C);

xI = (-B+sqrtD) / (2*A);
yI = m * xI + b;

if (abs(atan2(yB - yA, xB - xA)-atan2(yI - yA, xI - xA)) > 1e-5)
    xI = (-B-sqrtD) / (2*A);
    yI = m * xI + b;
end

注释1:我没有检查增量是否为负值,因为您说一个点在圆内,而另一点在圆外。

备注2::您需要介绍A == B的特殊情况。

注释3::您需要介绍xA == xB的特殊情况。

注释#4:与找出两个向量的斜率,计算它们之间的绝对方差并将结果与​​epsilon相比,您可以花更少的成本来选择正确的答案! :)