回覆列表
  • 1 # 使用者1382703983695

    首先我先說一點,樓主你要的是兩個線段的交點,那麼首先我們得判斷兩個線段有沒有交點。兩個線段有交點的重要條件是每個線段都跨過了另一個線段的所在直線。反之,其中任何一個線段沒有跨過另一個線段的所在直線,則兩線段不相交。

    OK,第一步,我們做相交檢測。舉兩個栗子,上圖

    向量b,c(深綠,淺綠)分別為與向量a (藍色)不相交和相交兩種情況。

    以a的起點開始計算,到向量b的起點終點構成兩條向量b1和b2。

    向量b與向量a不相交,則a與b1的叉乘和a與b2叉乘的結果符號相同。

    向量c與向量a相交,則a與b1的叉乘和a與b2的叉乘結果符號不同。

    以上的計算不要忘了需要兩個向量正反算一遍

    寫程式最煩什麼?—— Corner case, 比如檢查除數為0不為0啊之類的。所以我要給出的答案必須是非零向量計算,極力避免除0檢測(高中解析幾何斜率式深入人心真是坑爹啊!)

    對於不相交的線段,我們就不再計算了。

    第二部,相交線段計算交點

    為了避免程式碼做各種蛋疼的判斷,我們依然堅持使用向量計算,避免各種檢測。繼續上圖:

    綠色線段的兩個點分別投影到藍色的向量上,則得到兩個投影點(x5, y5)和(x6, y6).

    交點(x, y)距離兩點的比例則和d1, d2的比例相同

    那麼交點就可以表示成兩個點座標的線性組合:

    什麼?你說投影不好做?那麼請看下面這個方法

    第三步(拜託,我不是第三,其實算第二部之前應該先算我的),透過向量輕鬆解投影點順便計算投影距離

    給定一個直線外點(x0, y0)和直線上兩點(x1, y1), (x2, y2),計算投影點(x, y)

    先計算目標線向量(藍色),(x2, y2)減去(x1, y1),再取單位向量得到紫色向量。然後紅色向量和紫色向量內積,得到紅色向量在紫色向量方向的投影長度,即黃色向量長度。用(x1, y1)加上黃色向量即為投影點。投影距離即為投影點和(x2, y2)的距離。在多數語言的數學庫中,有一個特別基本的函式來計算:

    hypot(x-x2, y-y2)

  • 中秋節和大豐收的關聯?
  • 哪些,屬於,石化行業?