目录
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. 推广
设圆与曲线的切点为
,过切点
作切线
, 过圆心
作
的平行线
. 易知
把这个三角形单独拿出来,由 正切值相等 可以得到各段长度的表达式
易得
整理得圆心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可以自己设置
至于为什么要更新定义域和值域,欢迎评论留言讨论