MATLAB平面几何图形绘制实例
实例一、运动控制测试图形
%以下图形用于运动综合测试,平面图形包含直线、圆弧、整圆、锐拐角、钝拐角,能比较充分的测试各种轨迹 运动控制性能。
%输入圆心和半径可以调整图形大小和偏移,并打印出各运动坐标点,以适应不同机台调整与测试。
function Pos=TestFigure(Cx,Cy,R)
%图形计算
if nargin<3
Cx=500;Cy=500;R=400;
end
sitaStep=0.0001;
fprintf('input:X = %d,Y = %d,R = %d\n', Cx,Cy,R);
L=sqrt(R^2-(R*cos(18*pi/180))^2)/sin(54*pi/180);%圆心到五角星内拐点的距离
P1.x=Cx+R*cos(18*pi/180); P1.y=Cy+R*sin(18*pi/180);
P2.x=P1.x; P2.y=Cy+R;
P3.x=P2.x-2*R*cos(18*pi/180); P3.y=P2.y;
P4.x=P3.x; P4.y=P1.y;
P5.x=Cx-L*cos(54*pi/180); P5.y=Cy+L*sin(54*pi/180);
P6.x=Cx; P6.y=Cy+R;
P7.x=Cx+L*cos(54*pi/180); P7.y=Cy+L*sin(54*pi/180);
P8.x=P1.x; P8.y=P1.y;
P9.x=Cx+L*cos(18*pi/180); P9.y=Cy-L*sin(18*pi/180);
P10.x=Cx+R*cos(54*pi/180); P10.y=Cy-R*sin(54*pi/180);
P11.x=Cx; P11.y=Cy-L;
P12.x=Cx-R*cos(54*pi/180); P12.y=Cy-R*sin(54*pi/180);
P13.x=Cx-L*cos(18*pi/180); P13.y=Cy-L*sin(18*pi/180);
P14.x=P4.x; P14.y=P4.y;
sita =(180-18)*pi/180:sitaStep:(2*pi+(180-18)*pi/180);%整圆
Arc_x = R*cos(sita)+Cx;%圆轨迹
Arc_y = R*sin(sita)+Cy;
sita =(180+72*2-54)*pi/180:sitaStep:(72*pi/180+(180+72*2-54)*pi/180);
C1.x=Cx-2*R*cos(36*pi/180)*cos(54*pi/180);%圆弧1的圆心
C1.y=Cy+2*R*cos(36*pi/180)*sin(54*pi/180);
Arc1x= R*cos(sita)+C1.x;%弧轨迹
Arc1y= R*sin(sita)+C1.y;
sita =(180+72-54)*pi/180:sitaStep:(72*pi/180+(180+72-54)*pi/180);
C2.x=Cx+2*R*cos(36*pi/180)*cos(54*pi/180);%圆弧2的圆心
C2.y=Cy+2*R*cos(36*pi/180)*sin(54*pi/180);
Arc2x= R*cos(sita)+C2.x;
Arc2y= R*sin(sita)+C2.y;
sita =(180-54)*pi/180:sitaStep:(72*pi/180+(180-54)*pi/180);
C3.x=Cx+2*R*cos(36*pi/180)*cos(18*pi/180);
C3.y=Cy-2*R*cos(36*pi/180)*sin(18*pi/180);
Arc3x= R*cos(sita)+C3.x;
Arc3y= R*sin(sita)+C3.y;
sita =(180-54-72)*pi/180:sitaStep:(72*pi/180+(180-54-72)*pi/180);
C4.x=Cx;
C4.y=Cy-2*R*cos(36*pi/180);
Arc4x= R*cos(sita)+C4.x;
Arc4y= R*sin(sita)+C4.y;
sita =(180-54-72*2)*pi/180:sitaStep:(72*pi/180+(180-54-72*2)*pi/180);
C5.x=Cx-2*R*cos(36*pi/180)*cos(18*pi/180);
C5.y=Cy-2*R*cos(36*pi/180)*sin(18*pi/180);
Arc5x= R*cos(sita)+C5.x;
Arc5y= R*sin(sita)+C5.y;
AxisX=[P1.x P2.x P3.x P4.x P5.x P6.x P7.x P8.x P9.x P10.x P11.x P12.x P13.x P14.x Arc_x Arc1x Arc2x Arc3x Arc4x Arc5x];
AxisY=[P1.y P2.y P3.y P4.y P5.y P6.y P7.y P8.y P9.y P10.y P11.y P12.y P13.y P14.y Arc_y Arc1y Arc2y Arc3y Arc4y Arc5y];
%返回值
Pos=[AxisX(1:14) AxisX(1) Cx C1.x C2.x C3.x C4.x C5.x;
AxisY(1:14) AxisY(1) Cy C1.y C2.y C3.y C4.y C5.y];
figure(1);
plot(AxisX,AxisY);
%text(Pos(1,1:14),Pos(2,1:14),{'P1','P2','P3','P4(14)','P5','P6','P7','P1(8,15)','P9','P10','P11','P12','P13','P4(14)'});
axis equal;
grid on;
hold on;
for n=1:21
if n<16
fprintf('Pos(%d):X= %f,Y = %f\n', n,Pos(1,n),Pos(2,n));
elseif n==16
fprintf('Center:X = %f,Y = %f\n',Pos(1,n),Pos(2,n));
else
fprintf('Arc(%d):X = %f,Y = %f\n',n-16,Pos(1,n),Pos(2,n));
end
end
end
%程序默认图形:圆心(500,500),半径400
实例二、基本圆弧绘制
%圆弧轨迹在各种加工场合使用非常频繁,圆弧也是运动控制中最基本最常见的轨迹,以下给出标准圆弧以及三点圆弧的MATLAB平面算法,可用于进行圆弧设计以及验证。
function ArcCalculate1
ArcType=input('圆弧类型(1.标准圆弧(默认) 2.三点圆弧):','s');
if isempty(ArcType)
ArcType=1;
else
ArcType=str2num(ArcType);
end
CoorStr=input('起点坐标(X,Y),默认(0,0):','s');
if isempty(CoorStr)
X_st=0;
Y_st=0;
else
Coordinate=str2num(CoorStr);
X_st=Coordinate(1);
Y_st=Coordinate(2);
end
if ArcType==1
CoorStr=input('请输入圆弧插补圆心坐标(X,Y):','s');
Coordinate=str2num(CoorStr);
X_centre=Coordinate(1);
Y_centre=Coordinate(2);
else
CoorStr=input('请输入圆弧插补中间点坐标(X,Y):','s');
Coordinate=str2num(CoorStr);
X_centre=Coordinate(1);
Y_centre=Coordinate(2);
end
CoorStr=input('请输入圆弧插补终点坐标(X,Y):','s');
Coordinate=str2num(CoorStr);
X_ed=Coordinate(1);
Y_ed=Coordinate(2);
if ArcType==1
Arc_dir=input('请输入圆弧方向(1.顺时针 2.逆时针默认:顺时针):');
if isempty(Arc_dir)
Arc_dir=1;
end
else
%计算圆弧方向
dir=(X_centre-X_st)*(Y_ed-Y_centre)-(Y_centre-Y_st)*(X_ed-X_centre);
if dir>0
Arc_dir=2;
else
Arc_dir=1;
end
%计算圆心坐标
syms x y;
m1x=(X_centre+X_st)/2;m1y=(Y_centre+Y_st)/2;
m2x=(X_ed+X_centre)/2;m2y=(Y_ed+Y_centre)/2;
abx=X_centre-X_st;aby=Y_centre-Y_st;
bcx=X_ed-X_centre;bcy=Y_ed-Y_centre;
f1=sym((x-m1x)*abx+(y-m1y)*aby);
f2=sym((x-m2x)*bcx+(y-m2y)*bcy);
sol=solve(f1,f2);
X_centre=eval(sol.x);
Y_centre=eval(sol.y);
end
R=sqrt((X_centre-X_st)^2+(Y_centre-Y_st)^2);
%计算起始角
ThetaStep=1/R/50;
if(X_st==X_centre)
if((Y_centre-Y_st)>0)
Angle_st=3*pi/2;
elseif(Y_centre-Y_st)<0
Angle_st=pi/2;
end
end
if(X_st-X_centre)>0 && (Y_st-Y_centre)>=0
Angle_st=atan((Y_st-Y_centre)/(X_st-X_centre));
elseif(X_st-X_centre)<0 && (Y_st-Y_centre)>=0
Angle_st=pi+atan((Y_st-Y_centre)/(X_st-X_centre));
elseif(X_st-X_centre)<0 && (Y_st-Y_centre)<=0
Angle_st=pi+atan((Y_st-Y_centre)/(X_st-X_centre));
elseif(X_st-X_centre)>0 && (Y_st-Y_centre)<=0
Angle_st=2*pi+atan((Y_st-Y_centre)/(X_st-X_centre));
end
%计算终止角
if(X_centre==X_ed)
if(Y_ed-Y_centre>0)
Angle_ed=pi/2;
elseif(Y_ed-Y_centre<0)
Angle_ed=3*pi/2;
end
end
if(X_ed-X_centre)>0 && (Y_ed-Y_centre)>=0
Angle_ed=atan((Y_ed-Y_centre)/(X_ed-X_centre));
elseif(X_ed-X_centre)<0 && (Y_ed-Y_centre)>=0
Angle_ed=pi+atan((Y_ed-Y_centre)/(X_ed-X_centre));
elseif(X_ed-X_centre)<0 && (Y_ed-Y_centre)<=0
Angle_ed=pi+atan((Y_ed-Y_centre)/(X_ed-X_centre));
elseif(X_ed-X_centre)>0 && (Y_ed-Y_centre)<=0
Angle_ed=2*pi+atan((Y_ed-Y_centre)/(X_ed-X_centre));
end
if(Arc_dir==1)
if(Angle_st-Angle_ed)>0
sita = Angle_ed:ThetaStep:Angle_st;
elseif(Angle_st-Angle_ed)<0
sita = [0:ThetaStep:Angle_st Angle_ed:ThetaStep:2*pi];
else
sita = 0:ThetaStep:2*pi;%起始角等于终止角,则画一个整圆
end
elseif(Arc_dir==2)
if(Angle_st-Angle_ed)>0
sita = [0:ThetaStep:Angle_ed Angle_st:ThetaStep:2*pi];
elseif(Angle_st-Angle_ed)<0
sita = Angle_st:ThetaStep:Angle_ed;
else
sita = 0:ThetaStep:2*pi;
end
end
Arc_x =R*cos(sita)+X_centre;
Arc_y =R*sin(sita)+Y_centre;
figure(3);
plot(Arc_x,Arc_y,'m');
legend('理论圆弧曲线');%自适应显示线型标注
grid on;
axis equal;
end
%圆弧起点(0,0),圆心(200,0),终点(400,0),顺时针方向
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)