-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBezier3.m
83 lines (66 loc) · 3.06 KB
/
Bezier3.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
close all;clear;clc;
gif_save = 'Bezier3.gif'; % GIF文件的名称
% 定义四个控制点
P0 = [0, 0];
P1 = [1, 2];
P2 = [3, 3];
P3 = [4, 0];
% 定义t的范围和步长
t = 0:0.01:1;
% 初始化贝塞尔曲线的坐标数组
Bx = zeros(size(t));
By = zeros(size(t));
figure;
% 计算并绘制贝塞尔曲线
for i = 1:length(t)
% 计算贝塞尔曲线上的点
Bx(i) = (1-t(i))^3*P0(1) + 3*(1-t(i))^2*t(i)*P1(1) + 3*(1-t(i))*t(i)^2*P2(1) + t(i)^3*P3(1);
By(i) = (1-t(i))^3*P0(2) + 3*(1-t(i))^2*t(i)*P1(2) + 3*(1-t(i))*t(i)^2*P2(2) + t(i)^3*P3(2);
% 清除当前图形窗口
clf;
% 绘制控制点和控制多边形
plot([P0(1), P1(1), P2(1), P3(1)], [P0(2), P1(2), P2(2), P3(2)], 'ko-', 'MarkerFaceColor', 'black', 'MarkerSize', 8, 'LineWidth', 1.5);
hold on;
% 绘制贝塞尔曲线
linewidth = 3;
plot(Bx(1:i), By(1:i), 'LineWidth', linewidth, 'Color', [0.85, 0.33, 0.1]); % 深橙色线条
% 动态绘制插值点和连接线
P01 = (1-t(i))*P0 + t(i)*P1;
P11 = (1-t(i))*P1 + t(i)*P2;
P21 = (1-t(i))*P2 + t(i)*P3;
P02 = (1-t(i))*P01 + t(i)*P11;
P12 = (1-t(i))*P11 + t(i)*P21;
P03 = (1-t(i))*P02 + t(i)*P12;
% 绘制控制点到插值点的连线
plot([P01(1),P11(1)],[P01(2),P11(2)],'Color', [0, 0.45, 0.74], 'LineStyle', '--', 'LineWidth',linewidth); % 蓝色
plot([P21(1),P11(1)],[P21(2),P11(2)],'Color', [0, 0.45, 0.74], 'LineStyle', '--', 'LineWidth',linewidth); % 蓝色
plot([P02(1), P12(1)], [P02(2), P12(2)], 'Color', [0.47, 0.67, 0.19], 'LineStyle', '--', 'LineWidth',linewidth); % 绿色
% 绘制插值点
marksize = 10;
plot(P01(1), P01(2), 'o', 'MarkerFaceColor', [0, 0.45, 0.74], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 蓝色
plot(P11(1), P11(2), 'o', 'MarkerFaceColor', [0, 0.45, 0.74], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 蓝色
plot(P21(1), P21(2), 'o', 'MarkerFaceColor', [0, 0.45, 0.74], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 蓝色
plot(P02(1), P02(2), 'o', 'MarkerFaceColor', [0.47, 0.67, 0.19], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 绿色
plot(P12(1), P12(2), 'o', 'MarkerFaceColor', [0.47, 0.67, 0.19], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 绿色
plot(P03(1), P03(2), 'o', 'MarkerFaceColor', [0.85, 0.33, 0.1], 'MarkerEdgeColor', 'k', 'MarkerSize', marksize); % 深橙色
% 设置图形属性
axis equal;
xlim([min([P0(1),P1(1),P2(1),P3(1)])-1, max([P0(1),P1(1),P2(1),P3(1)])+1]);
ylim([min([P0(2),P1(2),P2(2),P3(2)])-1, max([P0(2),P1(2),P2(2),P3(2)])+1]);
title(sprintf('t = %.2f', t(i)),'FontSize',24);
% 捕获当前图形窗口的帧
drawnow;
frame = getframe(1);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
% 将帧写入GIF文件
if i == 1
imwrite(imind,cm,gif_save,'gif', 'Loopcount',inf, 'DelayTime', 0.01);
else
imwrite(imind,cm,gif_save,'gif','WriteMode','append', 'DelayTime', 0.01);
end
% 暂停以便观察动画效果
pause(0.01);
hold off;
end
close all;