2014-06-18 37 views
0

我需要按輸出切線按點排列三次貝塞爾樣條。我的第一個嘗試是確定輸出的切線角度並按此排序。對於具有四個點p0, p1, p2, p3的花鍵,輸出切線角度是:按輸出切線排列點周圍的三次貝塞爾樣條

p0 != p1 ? angle(p0, p1) : p0 != p2 ? angle(p0, p2) : angle(p0, p3) 

此處理退化的立方體,它實際上是一個二次或甚至一個線。但是,該點可能有兩個具有相同切線角度的出線樣條曲線,但後面的樣條曲線上的控制點或終點位置會影響排序順序。

是否有一個很好的封閉形式的算法來排序兩個任意貝塞爾樣條出處理角度處理退化的情況,還使用樣條的其餘部分消歧的情況下,當切線相等?我可以通過嘗試t值直到我消除歧義,但似乎可能存在閉合算法。

+0

因此,如果兩條曲線具有相同的起始切線但稍後發散,您是否希望它們在排序上相同?還是你還想讓它們按特定順序排序? – tfinniga

+0

他們需要按特定順序排序(順時針方向)。我試圖在平面圖中遍歷三角形貝塞爾曲線的邊。 – constexpr

回答

0

據我所知,這個特定問題沒有封閉式解決方案。 考慮你希望通過一個點上的輸出切線對一組曲線進行排序;但是如果切線在這一點上是相等的,曲線已經排序了!我知道你實際上想要的是找出當你沿着曲線從起點移動時切線是否偏離。

所以,讓我們這樣做;比較t = 0(t是任何參數曲線的曲線時間參數)的小增量處的切線。

這是在javascript中的small demo

compareTan函數比較小增量(t = 1e-5)處切線的角度。所有依賴的方法都是返回給定t參數的切線。實現二次方案不是很難 - 對於線條,您可以直接比較它們。