2014-10-06 86 views
1

我有:弧相切於結束點的圓弧,以及線

弧:由P1X定義,P1Y - P2X,P2Y,半徑,中心,初始 - 最終昂。

線:由ax,ay - bx,by定義。

正如你可以在圖像中看到的,我想要找出一條弧線和直線的反正切,並通過第一弧線的終點。

我認爲有一個獨特的解決方案。 (或者兩個,R +和R - )

我想這樣看如何實現的算法,無果......

任何想法,將不勝感激......

enter image description here

+0

你是指在線上任何地方的無限線相切,還是你試圖擊中段的末尾? – agentp 2014-10-06 20:20:53

回答

1

你要做的是找到一個無限長線「L」的圓切線,並與該圓上特定點處的圓相切。關鍵的觀察結果是,自從tangent vector to any circle at a given angle is perpendicular to the radius vector for that angle以來,我們需要找到的是「TC」(「切線中心」)點和距離d的距離「d」,在距離d處給定線偏移距離d與正常向外拉從圓爲相同距離(原諒我的壞技術):

bad art is bad

求解「d」是最簡單的方法如下:

  1. 構建標準化法向矢量「R 「在點」P「通過PC並正常化。 (這構成了圓的外切線,如果你想要一個內切線,你可以翻轉)。

  2. 構造歸一化的垂直向量「N」到線「L」。我並不確定你的變量「ax,ay - bx,by」是什麼意思,所以讓我們用一個起點「A =(ax,ay)」和一個方向矢量「DA =(dax,day) 」。在這種情況下,正常情況是+/- (-day, dax)/sqrt(day*day+dax*dax)。 (歸一化互與3D中的(0,0,1)向量。)

  3. 選擇的「N」的符號,以使其指向遠離從P,即如果(PA)的點積和N是正數,如果點積(幾乎)爲零,則翻轉N,那麼正切圓的半徑(幾乎)爲零,所以沒有定義。

  4. 現在考慮對於某些d由P2 = P + d *(R + N)定義的點TC。如果P2位於線L上,那麼d就是我們尋找的切線圓的半徑!當且僅當(P2 - A)和N的點積爲零時,P2位於線上。這在一個變量中定義了一個線性方程 - d - 所以你可以解決它。請注意,如果R + N的長度(幾乎)爲零,則P距離圓和線之間的最近點180度;您需要明確檢查並處理。

  5. 一旦你有d,你可以得到圓圈的中心TC = P + d * R。

當P處的圓的切線平行或接近平行於線時,該方法應具有良好的數值穩定性。

你沒有指定一種語言,但希望這可以讓你開始。我的主要語言是c#。

+0

我沒有看到第4點...對不起,謝謝 – civiltomain 2014-10-07 06:35:19

+0

@civiltomain - 你不明白爲什麼「d」是P2在線時的切線圓的半徑,或者如何設置和求解方程? – dbc 2014-10-07 15:03:47

+0

感謝dbc。我正在處理自己的代碼,因爲問題比我預期的要大,因爲我有帶方位角的段和弧。釷。爲你的時間。 – civiltomain 2014-10-08 09:42:12