2011-12-31 476 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维点。因此,您可以为每个维度分别求解并找到平均值,或者稍微复杂一些,并将平方误差最小化。