问题旋转简单的线条图像

时间:2010-12-14 12:47:56

标签: delphi image math

据说,要将一条线旋转一定的角度,你可以将它的终点坐标乘以矩阵({Cos(a),Sin(a)} {-Sin(a)Cos(a)}) ,其中 a 是旋转角度。矩阵中得到的两个数字将是旋转线的终点的 x y 坐标。旋转绕线的起点。 简化它,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 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分: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));