你解決一個約束問題。以你的第一個複合曲線,並用四個明確的座標,每個subcurve,我們有:
points1 = point[8];
points2 = point[4];
與以下對應:
points1[0] == points2[0];
points1[7] == points2[3];
direction(points1[0],points1[1]) == direction(points2[0], points2[1]);
direction(points1[6],points1[7]) == direction(points2[2], points2[3]);
我們也有對points2 [1,3相對位置的約束]和points2 [2]由於中心點的在複合曲線的切線:
direction(points1[2],points[4]) == direction(points2[1],points2[2]);
,最後,我們對通用約束,其中導通和截止曲線POIN如果我們希望曲線通過一個點,那麼ts可以是三次曲線,其描述如下:http://pomax.github.io/bezierinfo/#moulding
從該部分取「abc」比率,我們可以檢查您的複合曲線參數是否符合三次曲線:如果我們構建具有點
A = points1[0];
B = points1[3];
C = points1[7];
與乙在t = 0.5(在此情況下)的新三次曲線,那麼我們就可以驗證所得到的曲線是否符合必須保持這是一個合法的簡化的約束條件。
這裏的主要問題是,我們通常不知道「在開始和結束之間」點是否應該落在t = 0.5,或者它是否是不同的t值。最簡單的解決方案是查看該點沿總曲線的距離(使用弧長:距離= arclength(c1)/ arclength(c1)+ arclength(c2)將告訴我們)並將其用作t的初始猜測,迭代在任何一方向外看幾個價值。
第二種選擇是求解在「在中間」點的切線向量的通用三次方程。我們形成點
points3 = [ points1[0], points1[1], points1[6], points1[7] ];
,然後解決它的導數公式查找具有相同的切線方向(但不是大小!)作爲我們的點之間,一個或多個T值的三次曲線。一旦我們有了這些(我們可能有超過2個),我們評估我們是否可以通過我們的三個興趣點創建一條曲線,並將中間點設置爲每個找到的t值。找到的t值中的任一個或零將產生法律曲線。如果我們有一個:完美的,我們找到了一個簡化。如果我們找不到,那麼複合曲線就不能簡化成一個三次曲線。
對你的路徑數據有點困惑,因爲複合曲線中的第二條路徑指令與你所顯示的不一致;它不會以(600,400)結尾,它以(600,580) –
結尾它因爲一個文檔中有兩個路徑,所以Path1在Path2之下。我只複製Path2並將其向下移動,這就是爲什麼Y座標不同。我的錯。 正確的路徑是: 'C 200,200 600,200 600,400' 和 'C 200,300 300,250 400250ç500,250 600300 600,400' – RazrFalcon
請更新與正確的信息 –