据说,要将一条线旋转一定的角度,你可以将它的终点坐标乘以矩阵({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;
好吧,我没有想法。我做错了什么?
感谢您的时间。
答案 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));