繁体   English   中英

识别两条线的交点

[英]Identification of the intersection point of two lines

这是计算

L1 =线连接点A(x1,y1)和B(x2,y2)L2 =线连接点c(x3,y3)和D(x4,y4)

对于线L1

线方程式:y = m1 * x + c1

斜率m1:(y2-y1)/(x2-x1)

Y截距:c1 =(y1-m1 * x1)

对于L2线

线方程式:y = m2 * x + c2

斜率m2:(y4-y3)/(x4-x3)

Y截距:c2 =(y3-m2 * x3)

对于交叉点

解决上述方程式,我们得到

x =(c2 -c1)/(m1-m2)

y =(c1 * m2-c2 * m1)/(m2-m1)

以上这些计算用于计算Java程序中的交点。

问题

当两条线分别平行于x轴和y轴时,就会出现问题。 例如,如果连接点如下

L1 = A(34,112)B(34,180)...(x坐标值保持不变)

L2 = C(72,100)D(88,100)...(y坐标值保持不变)

现在m1将变为无穷大,并且m2将变为0,因此c1将变为无穷大,并且c2 = y3作为结果,尽管线L1和L2必须相交于(34,100),但使用以下给定公式计算交点会得出奇怪的(NaN)结果。

x =(c2 -c1)/(m1-m2)

y =(c1 * m2-c2 * m1)/(m2-m1)

为什么会有这样的问题? 如何使用数学处理此问题,以便可以在程序中实现它。

平行于y轴的线不能表示为y = ax + b 您需要使用ax + by + c = 0的线的通用方程式。 确定两条直线方程的系数,并求解它们的交点的线性系统。 确保系统的行列式不同于0,否则没有解或无穷大(您可以考虑是无解的另一种情况)。

考虑段的法线向量,可以很容易地获得ab系数(如果vect(AB) = (x,y)normal(AB) = (-y,x) = (a,b)然后确定c通过引入的坐标方程式中: c = -a*x_A - b*y_A

您现在有了一个线性系统来解决:

(S) : { a1*x + b1*y + c1 = 0    
      { a2*x + b2*y + c2 = 0

如果det = a1*b2 - a2*b1 = 0 (请注意精度损失,以epsilon方式进行比较),则系统没有unic解。 否则,您可以找到系统矩阵的逆:

M = (a1  b1), M^(-1) = 1/det * ( b2  -b1) 
    (a2  b2)                   (-a2   a1) 

现在您只需要计算

M^(-1) * (-c1) = 1/det * (-b2*c1 + b1*c2)
         (-c2)           ( a2*c1 - a1*c2)

就是这样,您有解决方案!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM