matlab中的连续Bezier曲线

时间:2014-11-22 09:46:30

标签: matlab bezier

用户应该输入N个控制点,通过该控制点绘制第一条贝塞尔曲线。此后,用户再次输入P个控制点,然后使用第一个曲线的最后一个点和最近输入的控制点,将另一个贝塞尔曲线与其混合,该曲线必须与第一个曲线连续。 我使用以下内容绘制曲线,但无法检查连续性。请帮忙。

N=input('enter the number of control points ');
for (i=1:N)
    P(i,:)=input('enter the coordinates of point [x y]' );
end

K=input('enter the number of points to plot ');
syms u
Px=0;
Py=0;

for(i=1:N)
    b=(factorial(N-1)/factorial(N-1-i+1)/factorial(i-1))*(u^(i-1))*(1-u)^(N-1-i+1);
    Px= Px+ b*P(i,1);
    Py= Py+ b*P(i,2);
end

for(i=1:K+1)
    Rx(i)=subs(Px,u,(i-1)/K);
    Ry(i)=subs(Py,u,(i-1)/K);
end
plot(Rx,Ry)
axis equal

1 个答案:

答案 0 :(得分:1)

让我假设第一组点是Q(0),Q(1),...... Q(N-1),第二组点是R(0),R(1),.. 。,R(P-1)接下来更容易讨论。由于两个贝塞尔曲线已经共享与控制点相同的点Q(N-1),因此它们将是G0连续的。如果希望两条Bezier曲线具有C1或甚至C2连续性,则需要在这两条Bezier曲线的控制点之间强制执行某种关系。要实现C1连续性,您需要确保

Q(N-1) - Q(N-2)= R(0) - Q(N-1)

为了实现C2连续性,您还需要确保

Q(N-1) - 2 * Q(N-2)+ Q(N-3)= R(1) - 2 * R(0)+ Q(N-1)

请注意,上述等式用于强制执行C1 / C2连续性。要使两条贝塞尔曲线看起来平滑连接",您只需要强制执行G1 / G2连续性,这不像C1 / C2连续性那样受限制,但计算起来稍微困难一些。例如,您只需要确保Q(N-1),Q(N-2)和R(0)共线以强制执行G1连续性。

BTW,在您发布的matlab代码中,您使用factorial()来评估贝塞尔曲线上的点。不建议这样做,因为阶乘(N)可能成为具有更高度贝塞尔曲线的非常大的数。你应该使用de Castejlau算法。