在 Octave 中绘制贝塞尔曲线
Plot Bezier Curve in Octave
我正在尝试在 Octave 中绘制贝塞尔曲线。贝塞尔曲线由多个控制点定义,例如:
我正试图策划这样的事情。我发现了一个函数:drawBezierCurve
但该函数需要四个控制点,我需要绘制一条只有三个点的贝塞尔曲线。控制点是:a(1,2), b(4,-1), c(8,6)
。有什么想法吗?
取行 ab 和 bc:
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,:) );
我正在尝试在 Octave 中绘制贝塞尔曲线。贝塞尔曲线由多个控制点定义,例如:
我正试图策划这样的事情。我发现了一个函数:drawBezierCurve
但该函数需要四个控制点,我需要绘制一条只有三个点的贝塞尔曲线。控制点是:a(1,2), b(4,-1), c(8,6)
。有什么想法吗?
取行 ab 和 bc:
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,:) );