图长这样
clear all;
clc;
a =150;% 拨盘和槽轮的中心距
r =150*cos(pi/3); %销的中心到拨盘中心的距离
R = r*3^1/2;%槽轮的半径
r_Pin = 10;%销的半径
r_s = 60; %拨盘半径
h = 80;%槽端面到底部距离
%拨盘转6圈槽轮转一圈,
totalAngle = 360*6;
n = totalAngle*2+1;%步长
XY_Pin = zeros(2,n); %销的坐标
Circle_Pin = zeros(2,361);% 销的圆
theta_Geneva = zeros(1,n); %槽轮转角
omega = 20*2*pi/60;%角速度 20转/分 转化成 弧度/秒
delta_time = (0.5*pi/180)/omega;%步长
% 销
index = 1;
for iterTheta=linspace(0,360,361);
theta = iterTheta*pi/180;%换算成弧度
Circle_Pin(1,index) = r_Pin*cos(theta) + r;
Circle_Pin(2,index) = r_Pin*sin(theta);
index = index + 1;
end
%销中心的运动轨迹
index = 1;
for iterTheta=linspace(0,totalAngle,n);
theta = iterTheta*pi/180;%换算成弧度
XY_Pin(1,index) = r*cos(theta);
XY_Pin(2,index) = r*sin(theta);
index = index + 1;
end
%拨盘 半径r_s
XY_driver_plate = zeros(2,273);%起点和终点是圆心
index = 2;
for iterTheta=linspace(45,360-45,271);
theta = iterTheta*pi/180;%换算成弧度
XY_driver_plate(1,index) = r_s*cos(theta);
XY_driver_plate(2,index) = r_s*sin(theta);
index = index + 1;
end
% 槽轮的中心坐标
center_Geneva = [a;0];
XY_Geneva_1 = [];
XY_Geneva_1(:,1) = [a-R;-r_Pin];
index = 2;
for iterTheta=linspace(-60,60,121);
theta = iterTheta*pi/180;%换算成弧度
XY_Geneva_1(:,index) = [r_Pin*cos(theta);r_Pin*sin(theta)] + [a-R+h-r_Pin;0];
index = index + 1;
end
XY_Geneva_1(:,index) = [a-R;r_Pin];
%槽旋转复制
theta = pi/3;
basis_displacement_vec = [a;0]*ones(1,size(XY_Geneva_1,2));
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 逆时针转theta
XY_Geneva_2 = rotationMatrix*(XY_Geneva_1-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_3 = rotationMatrix*(XY_Geneva_2-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_4 = rotationMatrix*(XY_Geneva_3-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_5 = rotationMatrix*(XY_Geneva_4-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_6 = rotationMatrix*(XY_Geneva_5-basis_displacement_vec)+basis_displacement_vec;
%槽轮的圆弧
XY_Geneva_Cirlce_1(:,1) = XY_Geneva_1(:,end);
index = 2;
for iterTheta=linspace(-60,60,361);
alpha = iterTheta*pi/180;%换算成弧度
x = r_s*cos(alpha)-a;
y = r_s*sin(alpha);
theta = -pi/6;
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 逆时针转theta
xy_after_rotation = rotationMatrix*[x;y];%旋转
xy_after_rotation = xy_after_rotation + [a;0];%平移
if max(abs([xy_after_rotation(1)-a, xy_after_rotation(2)])) <= R;
XY_Geneva_Cirlce_1(:,index) = xy_after_rotation;
index = index + 1;
end
end
XY_Geneva_Cirlce_1(:,index) = XY_Geneva_6(:,1);
basis_displacement_circle_vec = [a;0]*ones(1,size(XY_Geneva_Cirlce_1,2));%槽轮圆弧转到用的平移向量
theta = pi/3;
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 逆时针转theta
XY_Geneva_Cirlce_2 = rotationMatrix*(XY_Geneva_Cirlce_1-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_3 = rotationMatrix*(XY_Geneva_Cirlce_2-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_4 = rotationMatrix*(XY_Geneva_Cirlce_3-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_5 = rotationMatrix*(XY_Geneva_Cirlce_4-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_6 = rotationMatrix*(XY_Geneva_Cirlce_5-basis_displacement_circle_vec)+basis_displacement_circle_vec;
%槽轮单次最大转到角度
deltaTheta_Geneva = 60;
% 停止时的角度
StopTheta_Geneva = 0;
index = 1;
for iterTheta=linspace(0,totalAngle,n);
theta = iterTheta*pi/180;%换算成弧度
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 逆时针转theta
Circle_Pin_Temp = rotationMatrix*Circle_Pin;%销旋转
XY_driver_plate_temp = rotationMatrix*XY_driver_plate;%拨盘旋转
% 计算槽轮转角
GenevaCenter_Pin_Vec = XY_Pin(:,index)-center_Geneva; %槽轮中心指向销的向量
if norm(GenevaCenter_Pin_Vec) <= R;
cos_theta_Geneva = ([1,0]*GenevaCenter_Pin_Vec)/norm(GenevaCenter_Pin_Vec);%向量点乘
theta_Geneva(index) = acos(abs(cos_theta_Geneva))*180/pi;%换算成角度
if XY_Pin(2,index) < 0;
%theta_Geneva(index) = -theta_Geneva(index) + deltaTheta_Geneva/2;
theta_Geneva(index) = -theta_Geneva(index) + deltaTheta_Geneva/2 + StopTheta_Geneva;
else
%theta_Geneva(index) = theta_Geneva(index) + deltaTheta_Geneva/2;
theta_Geneva(index) = theta_Geneva(index) + deltaTheta_Geneva/2+StopTheta_Geneva;
end
theta = -(theta_Geneva(index)-deltaTheta_Geneva/2)*pi/180;%换算成弧度
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 槽轮逆时针转theta
else
theta_Geneva(index) = theta_Geneva(index-1);%角度保持不变
StopTheta_Geneva = theta_Geneva(index);%销退出时的槽轮角度
theta = -(theta_Geneva(index)-deltaTheta_Geneva/2)*pi/180;%换算成弧度
rotationMatrix = [cos(theta),-sin(theta); sin(theta), cos(theta)]; % 槽轮逆时针转theta
end
XY_Geneva_1_temp = rotationMatrix*(XY_Geneva_1-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_2_temp = rotationMatrix*(XY_Geneva_2-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_3_temp = rotationMatrix*(XY_Geneva_3-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_4_temp = rotationMatrix*(XY_Geneva_4-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_5_temp = rotationMatrix*(XY_Geneva_5-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_6_temp = rotationMatrix*(XY_Geneva_6-basis_displacement_vec)+basis_displacement_vec;
XY_Geneva_Cirlce_1_temp = rotationMatrix*(XY_Geneva_Cirlce_1-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_2_temp = rotationMatrix*(XY_Geneva_Cirlce_2-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_3_temp = rotationMatrix*(XY_Geneva_Cirlce_3-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_4_temp = rotationMatrix*(XY_Geneva_Cirlce_4-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_5_temp = rotationMatrix*(XY_Geneva_Cirlce_5-basis_displacement_circle_vec)+basis_displacement_circle_vec;
XY_Geneva_Cirlce_6_temp = rotationMatrix*(XY_Geneva_Cirlce_6-basis_displacement_circle_vec)+basis_displacement_circle_vec;
plot(XY_driver_plate_temp(1,:),XY_driver_plate_temp(2,:),'k','LineWidth',2); %连接拨盘与销的杆
hold on;
plot([0,XY_Pin(1,index)],[0, XY_Pin(2,index)],'k','LineWidth',2); %连接拨盘与销的杆
hold on;
plot(Circle_Pin_Temp(1,:),Circle_Pin_Temp(2,:),'k','LineWidth',2); %连接拨盘与销的杆
hold on;
plot(XY_Geneva_1_temp(1,:),XY_Geneva_1_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_2_temp(1,:),XY_Geneva_2_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_3_temp(1,:),XY_Geneva_3_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_4_temp(1,:),XY_Geneva_4_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_5_temp(1,:),XY_Geneva_5_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_6_temp(1,:),XY_Geneva_6_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(center_Geneva(1),center_Geneva(2),'o','MarkerSize',5,'MarkerFaceColor','black','MarkerEdgeColor','black');%槽轮中心
hold on;
plot(XY_Geneva_Cirlce_1_temp(1,:),XY_Geneva_Cirlce_1_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_Cirlce_2_temp(1,:),XY_Geneva_Cirlce_2_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_Cirlce_3_temp(1,:),XY_Geneva_Cirlce_3_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_Cirlce_4_temp(1,:),XY_Geneva_Cirlce_4_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_Cirlce_5_temp(1,:),XY_Geneva_Cirlce_5_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot(XY_Geneva_Cirlce_6_temp(1,:),XY_Geneva_Cirlce_6_temp(2,:),'k','LineWidth',2); %槽轮
hold on;
plot([-120,270],[0,0],'-.k'); %坐标轴x
hold on;
plot([0,0],[-120,120],'-.k'); %坐标轴y
set (gca,'XLim',[-150,300]);
set (gca,'YLim',[-150,150]);
axis equal;
drawnow; % 刷新
pause(0.05);
if index < n;
clf;
end
index = index + 1;
end
% 清除之前的所有变量
clear all;
% 清除命令窗口内容
clc;
% 参数设置
a = 150; % 拨盘和槽轮的中心距
r = 150*cos(pi/3); % 销的中心到拨盘中心的距离
R = r*3^(1/2); % 槽轮的半径
r_Pin = 10; % 销的半径
r_s = 60; % 拨盘半径
h = 80; % 槽端面到底部距离
totalAngle = 360*6; % 拨盘转6圈槽轮转一圈
n = totalAngle*2+1; % 步长
XY_Pin = zeros(2,n); % 销的坐标
Circle_Pin = zeros(2,361); % 销的圆
theta_Geneva = zeros(1,n); % 槽轮转角
omega = 20*2*pi/60; % 角速度 20转/分 转化成 弧度/秒
% 计算槽轮转角
for i = 1:n
theta_Geneva(i) = mod((i-1)*omega,2*pi);
end
% 计算销的坐标
for i = 1:n
theta = theta_Geneva(i);
if theta <= pi/3
x = r*cos(theta);
y = sqrt(R^2-(x-r)^2)+h-r_s;
elseif theta > pi/3 && theta <= 2*pi/3
x = r*cos(theta);
y = -sqrt(R^2-(x-r)^2)+h-r_s;
elseif theta > 2*pi/3 && theta <= pi
x = r*cos(theta);
y = -sqrt(R^2-(x-r)^2)-h+r_s;
elseif theta > pi && theta <= 4*pi/3
x = r*cos(theta);
y = sqrt(R^2-(x-r)^2)-h+r_s;
elseif theta > 4*pi/3 && theta <= 5*pi/3
x = r*cos(theta);
y = sqrt(R^2-(x-r)^2)+h-r_s;
elseif theta > 5*pi/3 && theta <= 2*pi
x = r*cos(theta);
y = -sqrt(R^2-(x-r)^2)+h-r_s;
end
XY_Pin(:,i) = [x;y];
end
% 绘制图形
figure;
plot(XY_Pin(1,:), XY_Pin(2,:));
axis equal;
xlabel('x');
ylabel('y');
title('六槽轮');
以上是一个完整的MATLAB程序,它计算和绘制了六槽轮的形状。根据给定的参数,程序计算了六槽轮在不同角度下销的坐标,并将其绘制出来。你可以根据需要进行调整和修改。