matlab控制三角形绕原点旋转任意角度

项目中遇到一个问题,需要把正三角形绕原点旋转任意角度,平时操作图片的时候,顺便旋转,感觉好像很简单,但是自己去做的时候还是有些困难。

我觉得旋转的难点在于由原始点计算新的目标点上,因为你需要考虑点位于四个象限以及坐标轴上的情况。我的做法是,先定正三角形的三个原始点和一个旋转的角度,

然后根据点所在的位置(判断点是在哪个象限或者坐标轴上),分别执行不同的新坐标计算代码,求出所有新的点坐标后,将点连接起来,就得到了新的三角形。

下面是我的代码,仅供参考:

主函数如下所示:

function [] = RotateFun()
%输入最大旋转角度,三角形按照步长为10度进行旋转
  angle=input('please input the max rotate angle,angle=');
   x0=[0,-1,1,0];
   y0=[2/sqrt(3),-1/sqrt(3),-1/sqrt(3),2/sqrt(3)];%设定初始点的坐标
   xmin=-2;
   ymin=-2;
   xmax=2;
   ymax=2;
   axis([xmin,xmax,ymin,ymax]);%设置图像的显示范围
   plot(x0,y0,'-r');                             %画出初始的三角形
   hold on;
   for angle_1=10:10:angle        %根据设置的最大角度,每次增加10度画出新的三角形
       theta=angle_1/180*pi;
       [x(1),y(1)]= test_1(x0(1),y0(1),theta);   %计算新点的坐标
       [x(2),y(2)]= test_1(x0(2),y0(2),theta);
       [x(3),y(3)]= test_1(x0(3),y0(3),theta);
       x(4)=x(1);
       y(4)=y(1);
       axis([xmin,xmax,ymin,ymax]);
       plot(x,y,'-b');                                               %画出新的图像
       hold on;
   end
end



调用的计算新点坐标的函数如下:

function [x,y] = test_1(x0,y0,angle)
%test_1  输入任一点和一个旋转角度,输出这一点绕坐标原点旋转angle角度的新坐标


if (x0>0)&&(y0>0)           %point is at first phase
    selects=1;
end


if (x0<0)&&(y0>0)         %point is at second phase
    selects=2;
end


if (x0<0)&&(y0<0)            %point is at third phase
    selects=3;
end


if (x0>0)&&(y0<0)             %point is at fourth phase
    selects=4;
end


if (x0>0)&&(y0==0)           %point is at X+ axis
    selects=5;
end
if (x0==0)&&(y0>0)          %point is at Y+ axis
    selects=6;
end
if (x0<0)&&(y0==0 )         %point is at X- axis
    selects=7;
end
if (x0==0)&&(y0<0)           %point is at Y- axis
    selects=8;
end


switch selects
    case 1                              %计算位于第一象限的新点坐标
            alfa=atan(y0/x0);         
            x=sqrt(x0^2+y0^2)*cos(pi/2+alfa+angle);
            y=sqrt(x0^2+y0^2)*sin(pi/2+alfa+angle);
    case 2                                   %计算位于第二象限的新点坐标
            alfa=atan(abs(x0)/y0);
            x=sqrt(x0^2+y0^2)*cos(pi/2+alfa+angle);
            y=sqrt(x0^2+y0^2)*sin(pi/2+alfa+angle);
    case 3                                         %计算位于第三象限的新点坐标
            alfa=atan(abs(y0)/abs(x0));
            x=sqrt(x0^2+y0^2)*cos(pi+alfa+angle);
            y=sqrt(x0^2+y0^2)*sin(pi+alfa+angle);
    case 4                                  %计算位于第四象限的新点坐标
            alfa=atan(x0/abs(y0));
            x=sqrt(x0^2+y0^2)*cos(3*pi/2+alfa+angle);
            y=sqrt(x0^2+y0^2)*sin(3*pi/2+alfa+angle);
    case 5                                   %计算位于x正半轴的新点坐标
            x=sqrt(x0^2+y0^2)*cos(angle);
            y=sqrt(x0^2+y0^2)*sin(angle);
    case 6                                    %计算位于x负半轴的新点坐标
            x=sqrt(x0^2+y0^2)*cos(pi/2+angle);
            y=sqrt(x0^2+y0^2)*sin(pi/2+angle);
    case 7                                   %计算位于y正半轴的新点坐标
            x=sqrt(x0^2+y0^2)*cos(pi+angle);
            y=sqrt(x0^2+y0^2)*sin(pi+angle);
    case 8                                   %计算位于y负半轴的新点坐标
            x=sqrt(x0^2+y0^2)*cos(3*pi/2+angle);
            y=sqrt(x0^2+y0^2)*sin(3*pi/2+angle);
    otherwise
end
end



运行结果如下:

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值