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

1.要求

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

2.效果图

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第1张图片

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.推广

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第2张图片

设圆与曲线y = f(x)的切点为(x, y),过切点(x, y)作切线 , 过圆心 作的平行线 y2 = kx + c. 易知 

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第3张图片

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

易得

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第4张图片

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

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第5张图片

%% 作者微信: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

【Matlab】简易动画,与任意曲线相切的圆的运动轨迹_第6张图片

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

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

 

你可能感兴趣的:(Matlab,matlab,图论,贝塞尔曲线)