计算结果如下
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,否则无解,或者无穷大(你可以认为这是另一种无解的情况)。
考虑到线段的法 vector ,您可以很容易地获得a
和b
系数(如果vect(AB) = (x,y)
code> 然后 normal(AB) = (-y,x) = (a,b)
。然后通过在方程中引入 A 的坐标来确定 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)
就是这样,你就有了解决方案!
关于java - 识别两条线的交点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779371/