文章目录 一.单摆模型解析 1.1 目标值解算 1.2 当前值解算 二.双摆模型解析 2.1 基础解析 2.2 直线和画园解析 2.3 画八字 三.总结 四matlab代码 五.matlab各种画图代码(各种图形,导入图片提取坐标) 一.单摆模型解析 1.1 目标值解算
1.2 当前值解算 C 语言的 三角函数库只认“弧度”,不认“度”。
二.双摆模型解析 2.1 基础解析
2.2 直线和画园解析
直线方程
2.3 画八字
Target_X = Amplitude_x * sin(Alpha); // X方向目标值函数
Target_Y = Amplitude_y * sin(2 * Alpha + Phase); // Y方向目标值函数
else if(flag_mode==5) //八字模式
{
Flag_Stop = 0; // 开启输出
Data_Amplitude = Basic_Amplitude; // 初始振幅
Data_Gama = PI / 4; // 振幅比例系数
Data_Phase = PI / 2; // 相位差为π/2
}
Amplitude_x=Data_Amplitude*sin(Data_Gama)*Xishu;//振幅X Data_Amplitude就是m Data_Amplitude决定摆线有多长 Data_Gama决定摆线的角度
Amplitude_y=Data_Amplitude*cos(Data_Gama)*Xishu;//振幅Y Data_Amplitude就是m Data_Amplitude决定摆线有多长 Data_Gama决定摆线的角度
Phase=Data_Phase; //相位差
三.总结
四matlab代码
%% 李萨如图形 MATLAB 可视化
% 对应 C 代码:x = a*sin(θ) , y = b*sin(nθ+Φ)
%%% a和b决定"画得多大"——是尺寸;theta 决定"现在画到哪儿"——是时间/角度; Phi决定画的图形
%% 1 参数(完全对应 C 代码)
Period = 1.5; % 周期,秒(对应 C 的 Period_ms 转秒)
fs = 200; % 采样率,Hz(为了曲线光滑)
a = 1; % Amplitude_x 归一化
b = 1; % Amplitude_y 归一化 决定4画得多大8——是尺寸;
n = 1; % 频率比,平常n=1,八字可设 2
Phi = pi/2; % 相位差,圆=pi/2,直线=0,椭圆=pi/3 决定画的图形
Xishu =1.4142; %√2补偿系数
Basic_Amplitude = 200; % 振幅
Data_Gama = pi/4; % 任意给一个角度
%% 2 时间轴 决定"现在画到哪儿"——是时间/角度;
t = 0:1/fs:Period*3; % 0~Period 秒
theta = 2*pi*t/Period; % 归一化到 0~2π,对应 C 的 Alpha
a=Basic_Amplitude * sin(Data_Gama) * Xishu
b=Basic_Amplitude * cos(Data_Gama) * Xishu;
%% 3 李萨如公式
x = a * sin(theta);
y = b * sin(n*theta + Phi);
z = linspace(0, 0.1, numel(t)); % 轻微起伏,便于 3D 观察
%% 4 画图
%% 创建 3D 动画窗口
fig = figure('Name','3D 李萨如圆动图');
set(fig,'Color','w');
ax = axes('Parent',fig);
rotate3d(ax,'on'); % 打开鼠标拖动旋转
grid(ax,'on'); axis equal;
xlabel(ax,'X'); ylabel(ax,'Y'); zlabel(ax,'Z');
title(ax,'实时描线——李萨如圆');
% 用 animatedline 实时画线
h = animatedline('Color','r','LineWidth',2,'Parent',ax);
%% 实时描线循环
for k = 1:length(t)
addpoints(h, x(k), y(k), z(k));
drawnow limitrate; % 立即刷新画面
pause(0.005); % 控制描线速度(可调)
end
%% 循环播放:描完后自动重播
while true
clearpoints(h); % 清空轨迹
for k = 1:length(t)
addpoints(h, x(k), y(k), z(k));
drawnow limitrate;
pause(0.005);
end
end
五.matlab各种画图代码(各种图形,导入图片提取坐标)
%% ========= 可调参数 =========
r = 300; % 圆半径
N_c = 100; % 圆点数
N_t = 500; % 三角形边总点数
N_r = 400; % 矩形边总点数
N_s = 800; % 正弦波点数
%% ========= 1. 圆(已验证) =========
xc = r; yc = r;
theta = linspace(0,2*pi,N_c+1); theta(end) = [];
x_c = round(xc + r*cos(theta),2);
y_c = round(yc + r*sin(theta),2);
%% ========= 2. 三角形(已验证) =========
A = [100 100]; B = [500 120]; C = [300 450];
A = round(A,2); B = round(B,2); C = round(C,2);
nEdge = floor(N_t/3);
edgeAB = [linspace(A(1),B(1),nEdge+1); linspace(A(2),B(2),nEdge+1)];
edgeBC = [linspace(B(1),C(1),nEdge+1); linspace(B(2),C(2),nEdge+1)];
edgeCA = [linspace(C(1),A(1),nEdge+1); linspace(C(2),A(2),nEdge+1)];
x_t = [edgeAB(1,:), edgeBC(1,2:end), edgeCA(1,2:end)];
y_t = [edgeAB(2,:), edgeBC(2,2:end), edgeCA(2,2:end)];
x_t = round(x_t,2); y_t = round(y_t,2);
%% ========= 3. 矩形(左下、右上两点定义) =========
R_bl = [150 50]; % 左下角
R_tr = [450 250]; % 右上角
R_bl = round(R_bl,2); R_tr = round(R_tr,2);
nEdgeR = floor(N_r/4); % 每条边点数
xR = unique(round([linspace(R_bl(1),R_tr(1),nEdgeR+1), ...
linspace(R_tr(1),R_bl(1),nEdgeR+1), ...
repmat(R_tr(1),1,nEdgeR), ...
repmat(R_bl(1),1,nEdgeR)],2));
yR = unique(round([repmat(R_bl(2),1,nEdgeR), ...
linspace(R_bl(2),R_tr(2),nEdgeR+1), ...
linspace(R_tr(2),R_bl(2),nEdgeR+1), ...
repmat(R_bl(2),1,nEdgeR)],2));
% 按顺序把四条边拼接成闭合折线
x_r = [linspace(R_bl(1),R_tr(1),nEdgeR+1), ... % 底
repmat(R_tr(1),1,nEdgeR), ... % 右
linspace(R_tr(1),R_bl(1),nEdgeR+1), ... % 顶
repmat(R_bl(1),1,nEdgeR)]; % 左
y_r = [repmat(R_bl(2),1,nEdgeR+1), ...
linspace(R_bl(2),R_tr(2),nEdgeR), ...
repmat(R_tr(2),1,nEdgeR+1), ...
linspace(R_tr(2),R_bl(2),nEdgeR)];
x_r = round(x_r,2); y_r = round(y_r,2);
%% ========= 4. 正弦波 =========
% 定义 x 范围在第一象限内
xMinS = 50; xMaxS = 550;
x_s = linspace(xMinS,xMaxS,N_s);
y_s = 50 + 80*sin(2*pi*(x_s-xMinS)/(xMaxS-xMinS)); % 振幅 80,基线 50
x_s = round(x_s,2);
y_s = round(y_s,2);
%% ========= 5. 绘图 =========
figure; hold on
plot(x_c,y_c,'b.','MarkerSize',6,'DisplayName',sprintf('圆 (%d点)',numel(x_c)));
plot(x_t,y_t,'r.','MarkerSize',6,'DisplayName',sprintf('三角形 (%d点)',numel(x_t)));
plot(x_r,y_r,'g.','MarkerSize',6,'DisplayName',sprintf('矩形 (%d点)',numel(x_r)));
plot(x_s,y_s,'m.','MarkerSize',6,'DisplayName',sprintf('正弦波 (%d点)',numel(x_s)));
axis equal
grid on
xlabel('x'); ylabel('y');
title('离散点:圆 + 三角形 + 矩形 + 正弦波');
margin = 10;
xlim([0, max([x_c x_t x_r x_s]) + margin]);
ylim([0, max([y_c y_t y_r y_s]) + margin]);
legend show
% 步骤1: 导入图像
imgPath = 'F:\\图片\\78.png'; % 替换为你的图像文件路径
img = imread(imgPath); % Windows 系统中的路径
% 检查图像是否成功加载
if isempty(img)
error('无法加载图像,请检查文件路径和文件名是否正确。
');
end
% 步骤2: 图像处理 - 转换为灰度图并进行二值化处理
grayImg = rgb2gray(img); % 如果是彩色图像,先转换为灰度图
binImg = imbinarize(grayImg); % 进行二值化处理
% 步骤3: 形态学操作 - 腐蚀操作
se = strel('disk', 1); % 创建一个圆形的结构元素
erodedImg = imerode(binImg, se); % 进行腐蚀操作
% 提取腐蚀后的图像的轮廓
[B,L] = bwboundaries(erodedImg, 'noholes');
% 步骤4: 绘制原始图像和提取的轮廓点
figure;
subplot(1, 2, 1); % 分割绘图窗口,左侧显示原始图像
imshow(img);
title('原始图像');
subplot(1, 2, 2); % 右侧显示提取的轮廓点
imshow(erodedImg, 'InitialMagnification', 'fit'); % 显示腐蚀后的图像结果
title('提取的内部轮廓点');
xlabel('X坐标');
ylabel('Y坐标');
axis equal;
xlim([1 size(erodedImg, 2)]);
ylim([1 size(erodedImg, 1)]);
axis ij; % 将坐标轴的方向设置为矩阵索引的方向
hold on;
% 动态绘制轮廓点
for k = 1:length(B)
boundary = B{k};
x = boundary(:,2);
y = boundary(:,1);
% 绘制当前轮廓
for i = 1:length(x)
plot(x(i), y(i), 'r.', 'MarkerSize', 10); % 绘制当前点
drawnow; % 立即更新图形窗口
pause(0.05); % 暂停一段时间,以便观察绘制过程
end
end
% 绘制完成后,显示图形
hold off;
% 步骤1: 导入图像
imgPath = 'F:\\图片\\78.png'; % 替换为你的图像文件路径
img = imread(imgPath); % Windows 系统中的路径
% 检查图像是否成功加载
if isempty(img)
error('无法加载图像,请检查文件路径和文件名是否正确。
');
end
% 步骤2: 图像处理 - 转换为灰度图并进行边缘检测
grayImg = rgb2gray(img); % 如果是彩色图像,先转换为灰度图
binImg = imbinarize(grayImg); % 进行二值化处理
edges = bwperim(binImg); % 获取二值图像的轮廓
% 步骤3: 提取轮廓点坐标
% 提取轮廓的边界
[B,L] = bwboundaries(edges, 'noholes');
% 步骤4: 绘制原始图像和提取的轮廓点
figure;
subplot(1, 2, 1); % 分割绘图窗口,左侧显示原始图像
imshow(img);
title('原始图像');
subplot(1, 2, 2); % 右侧显示提取的轮廓点
imshow(edges, 'InitialMagnification', 'fit'); % 显示轮廓结果
title('提取的轮廓点');
xlabel('X坐标');
ylabel('Y坐标');
axis equal;
xlim([1 size(edges, 2)]);
ylim([1 size(edges, 1)]);
axis ij; % 将坐标轴的方向设置为矩阵索引的方向
hold on;
% 动态绘制轮廓点
for k = 1:length(B)
boundary = B{k};
x = boundary(:,2);
y = boundary(:,1);
% 绘制当前轮廓
for i = 1:length(x)
plot(x(i), y(i), 'r.', 'MarkerSize', 10); % 绘制当前点
drawnow; % 立即更新图形窗口
pause(0.05); % 暂停一段时间,以便观察绘制过程
end
end
% 绘制完成后,显示图形
hold off;
