写在前面:
文章转载请注明出处,谢谢!
对于计算四个点表达的两条直线交点这个问题其实网上相应的代码与数学模型比较好找,所以这里无法保证提供的思路就是最正确或效率最高的,如果能帮助到你那真的是万分荣幸
正文:
首先确定其中一条直线的表达方式
假设两点分别为:p1(x1,y1), p2(x2,y2)
思路一:
设想直线方程表达式为 y = kx + b
根据给定两点 x1 , y1 求出直线斜率k,再将k带入一般式 y=kx + b 求出 b ,这样表达其中的一条直线,再对 x2,y2 使用同样的方法求出另一条直线
思路二:
设想直线方程表达式为 Ax + by + C = 0
其中:
A = p2.y - p1.y
B = p2.x - p1.x
C = p2.x * p1.y - p2.y * p1.x
习惯上会对ABC进行normalize处理,因为AB其实为该直线的法线向量,即n = (A,B)为直线Ax + by + C = 0 的法线向量
normalize具体过程其实就是该直线法向量单位化的过程:n/|n|
对于直线Ax + by + C = 0来说,法线向量的模 D = √(A*A + B*B)
最终我们得到的直线方程为: lineFunc = {A:A/D, B: B/D, C: C/D}
好了,到这里直线的表达方式和需要填充的参数已经填充完毕。接下来是交点的计算(此处不再赘述推导过程):
对于思路一:
y = k1 * x + b1
y = k2 * x + b2
其中k和b都为已知变量,交点即为二元一次方程组的解
此处需要注意的是,斜截式表达直线的时候,当直线为垂直于x轴的直线时需要进行特殊的判断和处理
对于思路二:
A1 * x + B1* Y + C1 = 0
A2 * x + B2* Y + C2 = 0
D = A1 * B2 - A2 * B1
这里的D可以表达两条直线的位置关系,当D = -1的时候表示两条直线垂直,当D = 0的时候表示两条直线平行或共线
接下来交点为:
p.x = (B1 * C2 - B2 * C1)/ D
p.y = (C1 * A2 - C2 * A1)/ D
那么问题来了,既然上文提到过D可以为0,当D = 0的情况出现的时会导致p的xy取值为无穷,这显然是错误的
所以用一般式表达直线时,当D = 0的时候要进行特殊的处理和判断,此时两直线位置关系为平行或共线