我正在寫一個算法將三次貝塞爾曲線拆分爲多個曲線(最多4個)。我從一開始就對每個想要分裂的點都有t值。我也有一個算法已經一次分割曲線:在多個點處拆分三次貝塞爾曲線
SubdivPoints subdivideBezier(Vector2 p0, Vector2 p1, Vector2 p2, Vector2 p3, float t)
{
Vector2 p11 = (p1 - p0) * t + p0;
Vector2 p21 = (p2 - p1) * t + p1;
Vector2 p31 = (p3 - p2) * t + p2;
Vector2 p12 = (p21 - p11) * t + p11;
Vector2 p22 = (p31 - p21) * t + p21;
Vector2 p13 = (p22 - p12) * t + p12;
return SubdivPoints(p11, p12, p22, p31, p13);
}
我的問題是,是否有擴大這種分裂多次一個簡單的方法?我想在每次分割之後,我想重新計算t值;我想知道的一件事是如果簡單的算術在這裏工作。例如。假設我有0.2和0.6的值。我在t = 0.2時分割曲線,給我兩條曲線。第二條曲線涵蓋來自原始的t值0.2 < t < 1。如果我通過除法重新計算0.6的第二個t值:(0.6 - 0.2)/(1 - 0.2)= 0.5,那麼將第二個曲線除以t = 0.75,這樣做會起作用嗎?或者我需要以其他方式重新計算它?
SubdivPoints實際上只是這些點的結構,它沒有做任何特殊的事情。我稍後使用點和控制點進行繪製,這是一個預處理步驟。所以我有一些點和控制點來定義一條路徑,我使用這個步驟將它劃分在某些地方(準確地說是線曲線交點)。然後在程序的其餘部分對它們進行修復。 我很欣賞深度響應,但我希望能夠擴展我已經使用的算法。這是不可能的嗎? – jasonericson
@jasonericson您的'subdivideBezier'函數看起來像[幾何De Casteljau的算法](https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm),其參數反向爲't',wiki表示可以使用它分裂,所以它應該工作。另外[分裂貝塞爾曲線](http://stackoverflow.com/a/8405756/2521214)以相同的方式使用它。所以你可以嘗試渲染/分割/渲染一些測試曲線,看看你所問的算術是否真的有效,但我擔心這不會是精確的,因爲t參數不是從曲線開始的線性距離 – Spektre
和線性只有當曲線的點密度恆定時,'t'邊緣的組合才起作用,而對於任意BEZIER來說則不是這種情況。你可以通過近似搜索找到第二條邊't'(它只是一個變量) – Spektre