2010-04-20 28 views
1

在線p1,p4上投影一個三次貝塞爾p1,p2,p3,p4。當p2或p3不投影到p1和p4之間的線段上時,曲線將從錨點凸出。有沒有辦法計算曲線的切線垂直於錨線的T值?計算切線垂直於錨線的三次貝塞爾T值

這也可以被描述爲找到投影曲線離線段p1,p4的中心最遠的T值。當p2和p3投影到線段上時,則解分別爲0和1。有沒有解決更有趣的案例的方程式?

T值似乎只取決於映射控制點距錨線段的距離。

我可以通過提煉猜測來確定價值,但我希望有更好的方法。

編輯:

與P1開始,...,P4與值X1,Y1,2D ...,X4,Y4我使用基於答案從菲利普下面的代碼:

dx = x4 - x1; 
dy = y4 - y1; 
d2 = dx*dx + dy*dy; 
p1 = ((x2-x1)*dx + (y2-y1)*dy)/d2; 
p2 = ((x3-x1)*dx + (y3-y1)*dy)/d2; 
tr = sqrt(p1*p1 - p1*p2 - p1 + p2*p2); 
t1 = (2*p1 - p2 - tr)/(3*p1 - 3*p2 + 1); 
t2 = (2*p1 - p2 + tr)/(3*p1 - 3*p2 + 1); 

在我看的樣本中,t2必須從1.0中減去,然後才能正確。

+0

您也可以嘗試http://mathoverflow.net/ – 2010-04-20 05:25:13

回答

1

讓我們假設你有一個一維三次Bezier曲線與P0 = 0P3 = 1然後曲線是:

P(t) = b0,3(t)*0 + b1,3(t)*P1 + b2,3(t)*P2 + b3,3(t)*1 

bi,3(t)的等級爲3的Bernstein polynomials然後,我們正在尋找的t這個地方的價值P(t)是最小和最大的,所以我們得出:

P'(t) = b1,3'(t)*P1 + b2,3'(t)*P2 + b3,3'(t) 
     = (3 - 12t + 9t^2)*P1 + (6t - 9t^2)*P2 + 3t^2 
     = 0 

這有一個封閉的形式,但平凡的解決方案。據WolframAlpha的,當3P1 - 3P2 +1 != 0是:

t = [2*P1 - P2 +/- sqrt(P1^2-P1*P2-P1+P2^2)]/(3*P1 - 3*P2 + 1) 

否則,它是:

t = 3P1/(6P1 - 2) 

對於一般的n維三次貝塞爾P0 * P1 *,P2 *,P3 *計算:

P1 = proj(P1*, P03*)/|P3* - P0*| 
P2 = proj(P2*, P03*)/|P3* - P0*| 

其中proj(P, P03*)是從P0*到點P的點的距離,通過P0* d P3*

(我沒有檢查這一點,所以請確認沒有什麼錯在我的推理。)

+0

的sqrt(... P2 * 2)應是P2^2 – drawnonward 2010-04-20 08:44:28

+0

謝謝,這按預期工作。從+/-中獲得兩個有效值時,我的試驗中需要從1.0中減去+結果。它有時可能是相反的。 – drawnonward 2010-04-20 08:52:26

+0

它可能來自你計算'proj()'的方式。它需要是來自'P0 *'的有符號距離,這意味着如果它從'P3 *'向'P0 *'一側投射,它應該是負值。 – 2010-04-20 14:36:33