天天看点

MATLAB平面几何图形绘制实例                        MATLAB平面几何图形绘制实例

                        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平面几何图形绘制实例                        MATLAB平面几何图形绘制实例

实例二、基本圆弧绘制

%圆弧轨迹在各种加工场合使用非常频繁,圆弧也是运动控制中最基本最常见的轨迹,以下给出标准圆弧以及三点圆弧的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),顺时针方向

MATLAB平面几何图形绘制实例                        MATLAB平面几何图形绘制实例

继续阅读