【Matlab】简易动画,与任意曲线相切的圆的运动轨迹

目录

1. 要求

2. 效果图

3. 代码

4. 推广

5. 交流讨论


1. 要求

已知一圆与sinx相切,且在sinx上方,半径为1,当x由0递增到4PI时,求该圆的运动轨迹。(之前帮别人写的,我写好了结果他不要了:)

2. 效果图

3. 代码

clear
x1 = 0: 0.1: 4*pi;
y1 = sin(x1);
x = x1 - cos(x1).*sqrt(1+cos(x1).^2)./(1+cos(x1).^2);
y = -1./cos(x1).*(x-x1)+sin(x1);
theta= -2*pi: 0.01: 2*pi;
for i = 1:length(x1)
    plot(x1, y1);
    hold on
    axis([-1.5 14 -2 4])
    daspect([1 1 1])
    a = 1*sin(theta)+x(i);
    b = 1*cos(theta)+y(i); 
    plot(a, b); 
    hold off
    m(:,i) =getframe;
end
%movie(m,1)

通过解方程得到圆心(x, y)关于x的表达式,x是一维向量,包含圆心运动轨迹中所有横坐标的值,y是一维向量,包含圆心运动轨迹中所有纵坐标的值。

(a, b)是当前循环圆心的坐标。

4. 推广

设圆与曲线y = f(x)的切点为(x, y),过切点(x, y)作切线 y1 = kx + b , 过圆心(px, py)y1的平行线 y2 = kx + c. 易知 c - b = r \sqrt{k^2+1}

把这个三角形单独拿出来,由 正切值相等 可以得到各段长度的表达式

易得

整理得圆心P的轨迹坐标为

%% 作者微信:qczsbwjzjn
clear
r = 0.5;                    % 半径
theta= 0: 0.01: 2*pi;       % 弧度
h = 0.05;                   % 步长
x = 0: h: 4*pi;             % 函数定义域
f = sin(0.05*x.*x-1);       % 函数值域
k = diff(f)/ h;             % 一阶差分求近似一阶导数
x = x(1: end - 1);          % 更新定义域
f = f(1: end - 1);          % 更新值域
px = x - k*r./sqrt(k.*k+1); % 计算p点横坐标
py = f + r./sqrt(k.*k+1);   % 计算p点纵坐标
for i = 1:length(px)
    plot(x, f);             % 画曲线
    hold on
    axis([-1.5 14 -2 4])    % 设置坐标轴可视区间
    daspect([1 1 1])        % 固定x,y轴
    % 画圆
    a = r * sin(theta) + px(i); 
    b = r * cos(theta) + py(i); 
    plot(a, b); 
    hold off
    m(:,i) =getframe;       % 得到当前帧
end

这里的曲线f、定义域x、圆半径r、步长h可以自己设置

至于为什么要更新定义域和值域,欢迎评论留言讨论

5. 交流讨论

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
Matlab中,你可以使用随机数生成器和绘图函数来生成随机的曲线运动轨迹。下面是一个示例代码: ```matlab % 设置随机数种子,以确保每次运行生成的随机数相同 rng(0); % 设置轨迹的总时间和时间步长 totalTime = 10; % 总时间 dt = 0.1; % 时间步长 % 设置初始位置和速度 initialPosition = [0, 0]; % 初始位置 initialVelocity = [1, 1]; % 初始速度 % 计算轨迹的点数 numPoints = totalTime / dt; % 生成随机的加速度 acceleration = randn(numPoints, 2); % 生成服从正态分布的随机数 % 初始化轨迹数组 trajectory = zeros(numPoints, 2); % 计算轨迹 for i = 1:numPoints % 更新速度和位置 initialVelocity = initialVelocity + acceleration(i, :) * dt; initialPosition = initialPosition + initialVelocity * dt; % 将位置保存到轨迹数组中 trajectory(i, :) = initialPosition; end % 绘制轨迹 plot(trajectory(:, 1), trajectory(:, 2)); xlabel('X轴'); ylabel('Y轴'); title('随机曲线运动轨迹'); % 保存轨迹为gif动画 filename = 'trajectory.gif'; for i = 1:numPoints % 绘制当前位置的小球 hold on; plot(trajectory(i, 1), trajectory(i, 2), 'ro', 'MarkerSize', 10); hold off; % 设置坐标轴范围 xlim([-10, 10]); ylim([-10, 10]); % 保存当前图像为gif动画的一帧 frame = getframe(gcf); im = frame2im(frame); [imind, cm] = rgb2ind(im, 256); if i == 1 imwrite(imind, cm, filename, 'gif', 'Loopcount', inf); else imwrite(imind, cm, filename, 'gif', 'WriteMode', 'append'); end % 暂停一段时间,以便观察动画效果 pause(0.1); end ``` 这段代码会生成一个随机的曲线运动轨迹,并将轨迹绘制出来。同时,它还会将每个时间步的位置保存为gif动画

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Toblerone_Wind

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值