以下是计算
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)
为什么会出现这样的问题?如何使用数学处理这个问题,以便它可以在程序中实现。
答案 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}}
就是这样,你有解决方案!