2011-12-31 43 views
2

我需要一個幫助,寫出算法去除節點的貝塞爾曲線。使用三次貝塞爾曲線,有兩條曲線(P0,P1,P2,P3和Q0,Q1,Q2,Q3),它們有一個公共點(P3 = Q0)。需要得到一條曲線(P0,R1,R2,Q3),重複兩條曲線的形狀。如何找到控制點R1,R2的座標?如何刪除貝塞爾曲線的節點,以便曲線的形狀不會改變?

謝謝!

+0

聽起來好像您需要對P1與Q1以及P2與Q2進行插值 - 或者這個問題實際上更復雜? – Till 2011-12-31 11:03:52

+0

P1,P2,Q1和Q2 - 貝塞爾曲線的控制點。我不明白你說的插值。 例如,在CorelDRAW中刪除節點時P0P1和Q3Q2指南增加或減少。曲線大致遵循原來的兩個。我需要做這樣的事情 – 2011-12-31 11:16:01

+0

如果組合曲線有彎曲怎麼辦?只是因爲P3 = Q0並不意味着連接是平穩的。我認爲一個平滑的延續需要P2,P3 = Q0和Q1在一條直線上(甚至可能是| P3-P2 | = | Q1-Q0 |,P3和P2之間的距離與Q1和Q0之間的距離相同)。 – 2011-12-31 15:58:01

回答

0

在一般情況下,不可能做你正在問的東西。你要求從7個自由度降到4個,但保持相同的結果。較低自由度系統的代表性能力不能與較高自由度系統的代表能力相匹配。唯一可能的情況是更復雜的曲線仍然存在於更簡單的空間中。例如,如果您的兩條貝塞爾曲線是通過將單個父曲線細分爲R0, R1, R2, R3而得出的。使用de Casteljau算法,我們可以生成兩條新曲線,即PQ,它們位於相同的原始曲線上,並沿着原始曲線(t位於[0,1])共享一個距離爲t的點。

P0 = R0 
P1 = R0*(1-t) + R1*t 
X = R1*(1-t) + R2*t 
P2 = P1*(1-t) + X*t 
Q3 = R3 
Q2 = R2*(1-t) + R3*t 
Q1 = X*(1-t) + Q2*t 
Q0 = P3 = P2*(1-t) + Q1*t 

如果這種關係不符合您的原始分數,那麼您將不得不制定一個近似值。但是,你也許會假裝關係成立脫身,只是反轉公式:

R1 = (P1 - P0*(1-t))/t 
R2 = (Q2 - Q3*t)/(1-t) 

t = (Q0 - P2)/(Q1 - P2) 

這最後一個方程是問題,因爲,除非P2, Q0, Q1共線也不會準確地工作。 t是一個標量,但Q1-P2通常是一個n維點。因此,您可以爲每個維度分別求解並找到平均值,或者稍微複雜一些,並將平方誤差最小化。