[英]Identification of the intersection point of two lines
這是計算
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,否則沒有解或無窮大(您可以考慮是無解的另一種情況)。
考慮段的法線向量,可以很容易地獲得a
和b
系數(如果vect(AB) = (x,y)
則normal(AB) = (-y,x) = (a,b)
然后確定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)
就是這樣,您有解決方案!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.