在 Octave 中绘制贝塞尔曲线

Plot Bezier Curve in Octave

我正在尝试在 Octave 中绘制贝塞尔曲线。贝塞尔曲线由多个控制点定义,例如:

我正试图策划这样的事情。我发现了一个函数:drawBezierCurve 但该函数需要四个控制点,我需要绘制一条只有三个点的贝塞尔曲线。控制点是:a(1,2), b(4,-1), c(8,6)。有什么想法吗?

取行 abbc:

a = [1 2];
b = [4 -1];
c = [8 6];

在上面创建n个等距点:

npoints = 10;
line1 = linspace(a, b, npoints);
line2 = linspace(b, c, npoints);

对于贝塞尔曲线上的第 k 个点,取第一行的 k / n 部分和 ( n - k) / n 第二行的部分。

weights = linspace(1, 0, npoints);
curve = line1 .* weights + line2 .* (1 - weights);

连接得到的点绘制曲线:

plot(curve(1, :), curve(2, :))


完整代码:

a = [1 2];
b = [4 -1];
c = [8 6];

npoints = 10; % modify this
line1 = linspace(a, b, npoints);
line2 = linspace(b, c, npoints);
weights = linspace(1, 0, npoints);

curve = line1 .* weights + line2 .* (1 - weights);
plot(curve(1, :), curve(2, :))

在这个答案中绘制图形的附加代码:

fig = figure;
hold on

% figure 1
plot([a(1) b(1)], [a(2) b(2)])
plot([b(1) c(1)], [b(2) c(2)])

% figure 2
plot(line1(1, :), line1(2, :), 'ok')
plot(line2(1, :), line2(2, :), 'or')

% figure 3
plot([line1(1,:); line2(1, :)], [line1(2, :); line2(2, :)], 'm--')

plot(curve(1, :), curve(2, :), 'oc')

% figure 4
plot(curve(1, :), curve(2, :), 'b', 'linewidth', 2) 

您始终可以重现贝塞尔曲线方程(参见 here

P   = [1,2; 4,-1; 8,6].';
B   = @(n,i,u) nchoosek(n, i) * u .^ i .* (1-u) .^ (n-i);
U   = [0:0.1:1];
Bez = B(2,0,U) .* P(:,1) + B(2,1,U) .* P(:,2) + B(2,2,U) .* P(:,3);

plot( Bez(1,:), Bez(2,:) );