Matlab 沿着曲线的动态图制作



前言

如果你想制作沿着某已知曲线轨迹移动的动态图展示,那这篇文章可能对您有些许帮助。
前段时间课题组汇报研究进展,为了想更好地呈现出最近的研究内容,所想办法制作沿着插值曲线的切线变化动态图。


一、核心理念

经过我这段时间在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

三、效果展示

曲线的切线动态效果


分享代码若有错漏之处,请大家留言批评指正!!
如果本篇文章对您有用的话,欢迎点赞收藏噢,谢谢谢谢,哈哈哈哈哈哈!!

主页还有更加丰富的内容噢 O(∩_∩)O :
Matlab 地理(经纬度)坐标 转 笛卡尔(直角)坐标
Matlab 土法求航海DCPA和TCPA,并根据DCPA正负判断目标船过本船船首or船尾
基于Matlab雷达视窗的来船运动矢量绘制
Matlab改进埃尔米特(Hermite)分段三次插值——(可在pchip函数中自定义导数值)
Matlab 四元素船舶领域代码复现

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值