[英]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,否则没有解或无穷大(您可以考虑是无解的另一种情况)。
考虑段的法线向量,可以很容易地获得a
和b
系数(如果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.