首页 文章

问题旋转简单的线条图像

提问于
浏览
1

据说,要将一条线旋转一定角度,你可以将它的终点坐标乘以矩阵({Cos(a),Sin(a)} {-Sin(a)Cos(a)}),其中 a 是旋转角度 . 矩阵中得到的两个数字将是 xy 坐标的旋转线's end point. Rotation goes around line' s起点 . 对其进行简化,对于x,新坐标将是{x * Cos(a) - y * Sin(a)},对于y,新坐标将是{x * Sin(a)y * Cos(a)} .

任务是使用此方法旋转三角形 . 但是下面使用这种方法的代码是给出一些废话而不是旋转的图像(原始三角形的扭曲形式,以“随机”角度旋转):

x0:=200;   
y0:=200;

  bx:=StrToInt(Edit1.Text);
  by:=StrToInt(Edit2.Text);
  cx:=StrToInt(Edit4.Text);
  cy:=StrToInt(Edit5.Text);
  a:=StrToInt(Edit3.Text);

  //Original triangle

  Form1.Canvas.Pen.Color:=clBlue;
  Form1.Canvas.MoveTo(x0,y0);
  Form1.Canvas.LineTo(bx,by);
  Form1.Canvas.LineTo(cx,cy);
  Form1.Canvas.LineTo(x0,y0);

  //New triangle
  Form1.Canvas.Pen.Color:=clGreen;    
  Form1.Canvas.MoveTo(x0,y0);
  b1x:=Round(bx*cos(a*pi/180)-by*sin(a*pi/180));   
  b1y:=Round(bx*sin(a*pi/180)+by*cos(a*pi/180));
  c1x:=Round(cx*cos(a*pi/180)-cy*sin(a*pi/180)); 
  c1y:=Round(cx*sin(a*pi/180)+cy*cos(a*pi/180));
  Form1.Canvas.LineTo(b1x,b1y);
  Form1.Canvas.MoveTo(x0,y0);
  Form1.Canvas.LineTo(c1x,c1y);
  Form1.Canvas.LineTo(b1x,b1y);

end;

好吧,我没有想法 . 我究竟做错了什么?

谢谢你的时间 .

2 回答

  • 4

    您正在使用的公式旋转一个点(0,0) . 要获得所需的结果,请将计算更改为:

    b1x:=x0 + Round((bx-x0)*cos(a*pi/180)-(by-y0)*sin(a*pi/180));   
    b1y:=y0 + Round((bx-x0)*sin(a*pi/180)+(by-y0)*cos(a*pi/180));
    c1x:=x0 + Round((cx-x0)*cos(a*pi/180)-(cy-y0)*sin(a*pi/180)); 
    c1y:=y0 + Round((cx-x0)*sin(a*pi/180)+(cy-y0)*cos(a*pi/180));
    
  • 4

    您似乎围绕其初始起点坐标旋转每条单独的线 . 因此第1行将绕其起点(x0,y0)旋转;然后第2行将绕bx旋转;然后第3行将围绕cx旋转 . 这将导致扭曲的三角形 . 相反,您需要围绕第一行的起点旋转所有三条线 .

相关问题