寫在前面:
文章轉載請注明出處,謝謝!
對於計算四個點表達的兩條直線交點這個問題其實網上相應的代碼與數學模型比較好找,所以這里無法保證提供的思路就是最正確或效率最高的,如果能幫助到你那真的是萬分榮幸
正文:
首先確定其中一條直線的表達方式
假設兩點分別為: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的時候要進行特殊的處理和判斷,此時兩直線位置關系為平行或共線
