识别两条线的交点

时间:2014-11-06 12:21:12

标签: java graphics coordinate-systems

以下是计算

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将变为 Infinity 并且m2将变为0因此c1将变为 Infinity 并且c2 = y3因此使用下面给出的公式计算交点奇怪的(NaN)结果虽然线L1和L2必须在(34,100)处相遇。

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

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

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

1 个答案:

答案 0 :(得分:1)

与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在等式中引入A的坐标:(S) : { a1*x + b1*y + c1 = 0 { a2*x + b2*y + c2 = 0

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

det = a1*b2 - a2*b1 = 0

如果M = (a1 b1), M^(-1) = 1/det * ( b2 -b1) (a2 b2) (-a2 a1) (注意精度损失,请进行比较epsilon),那么系统没有单一的解决方案。否则,您可以找到系统矩阵的逆矩阵:

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

现在你只需要计算

{{1}}

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