文章目录
- 前言
- 一、核心理念
- 二、示例代码
- 三、效果展示
前言
如果你想制作沿着某已知曲线轨迹移动的动态图展示,那这篇文章可能对您有些许帮助。 前段时间课题组汇报研究进展,为了想更好地呈现出最近的研究内容,所想办法制作沿着插值曲线的切线变化动态图。
一、核心理念
经过我这段时间在CSDN里学习动态图制作,总结出自己的心得:动态图无非就是将每一帧的画面连续呈现出来,每一帧的内容覆盖掉上一帧的内容,然后把每帧变化的幅度进行尽可能地缩小(X轴步长尽量小),就会从视觉上带来连续变化的感觉。
二、示例代码
例子以曲线上连续点的切线做出动态切线效果 先对若干个已知点进行Hermite两点三次插值,输出以X轴步长为0.1的数据集,利用前一组XY坐标数据的差距进行放大,使之形成切线。 我做的是航速航向的切线,我就偷懒直接把成果复制过来啦!有需要的伙伴可改动后自用。
clc;close all;clear;
set(gcf,'position',[0 0 1920 1080])
%% C、S拟合
TCS=[-14;-10;-8;-6;-5;-4;-3;-2;-1;0]
C=[200.8;208;215.7;208.4;208.6;209.2;212.1;191;170.1;168.3]
S=[12.3;12.3;11.9;11.9;12;11.2;10.6;9.5;7.5;6.7]
h=0.1 % 步长
xx=[-20:h:0]
C_acc=pchip_cs(TCS,C,xx) % C、S 拟合函数
S_acc=pchip_cs(TCS,S,xx) % C、S 拟合函数
k = diff(C_acc)/ h; % 一阶差分求近似一阶导数
xx = xx(1: end - 1); % 更新定义域
C_acc = C_acc(1: end - 1); % 更新值域
S_acc = S_acc(1: end - 1); % 更新值域
%% 画动态图
for i = 1:length(xx)
yyaxis left; % 激活左边的轴
plot(xx, C_acc,'--');hold on % 画曲线
scatter(TCS,C,'s');hold on
hold on
axis([-20 0 160 230]) % 设置坐标轴可视区间
set(gca,'xtick',-20:1:0)
xlabel('碰撞前时间(分)');
ylabel('航向(°)','FontSize',13); % 给左y轴添加轴标签
grid on
% 画航向切线
if i<numel(xx)-1
diff=C_acc(i)-C_acc(i+1)
x_left=xx(i)-13*h % 左边端点
y_left=C_acc(i)+diff*13
x_right=xx(i)+13*h % 左边端点
y_right=C_acc(i)-diff*13
line_C=plot([x_left x_right],[y_left y_right],'k-','linewidth',1);hold on % 画切线
scatter_C=scatter(xx(i),C_acc(i),'k*');hold on
hold off
end
yyaxis right; % 激活右边的轴
plot(xx, S_acc,'--');hold on % 画曲线
scatter(TCS,S,'rs');hold on
hold on
axis([-20 0 6 13]) % 设置坐标轴可视区间
ylabel('航速(kn)','FontSize',13); % 给右y轴添加轴标签
% 画航速切线
if i<numel(xx)-1
diff=S_acc(i)-S_acc(i+1)
x_left=xx(i)-13*h % 左边端点
y_left=S_acc(i)+diff*13
x_right=xx(i)+13*h % 左边端点
y_right=S_acc(i)-diff*13
line_S=plot([x_left x_right],[y_left y_right],'k-','linewidth',1);hold on % 画切线
scatter_S=scatter(xx(i),S_acc(i),'k*');hold on
hold off
if i==numel(xx)-2
delete(line_S)
delete(scatter_S)
end
end
m(:,i) =getframe; % 得到当前帧
end
三、效果展示
曲线的切线动态效果
分享代码若有错漏之处,请大家留言批评指正!!
如果本篇文章对您有用的话,欢迎点赞收藏噢,谢谢谢谢,哈哈哈哈哈哈!!