Дан самолетик.в эдиты вводятся углы поворота.и самолет вращается.У меня при каждом пересчете самолет на канве при задании одного угла крутиться, но сплющивается, а при задании 3 углов уменьшается в размерах.
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,Unit2, ComCtrls;
type
pointXYZ=record
x:real;
y:real;
z:real;
end;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Image1: TImage;
UpDown1: TUpDown;
UpDown2: TUpDown;
UpDown3: TUpDown;
Button3: TButton;
Memo1: TMemo;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
//procedure Button1Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
const n=25; pi180=pi/180;
var
i:integer;
Form1: TForm1;
mas:array[1..n] of pointXYZ;
implementation
{$R *.dfm}
//procedure drawxy();
//begin
{ Image1.Canvas.MoveTo(Image1.Width div 2,Image1.Height div 2);
for i:=1 to n do begin
if i<>1 then
Image1.canvas.moveto(Trunc(mas[i-1].x*10+Image1.Width div 2),Trunc(mas[i-1].y*10+Image1.Height div 2));
Image1.Canvas.LineTo(Trunc(mas[i].x*10+Image1.Width div 2),Trunc(mas[i].y*10+Image1.Height div 2));
end; }
//end;
procedure povorott(ugol:real; var a1,a2:real);
begin
a1:=a1*cos(ugol)-a2*sin(ugol);
a2:=a1*sin(ugol)+a2*cos(ugol);
end;
procedure povorotr(ugol:real; var a1,a2:real);
begin
a1:=a1*cos(ugol)+a2*sin(ugol);
a2:=-a1*sin(ugol)+a2*cos(ugol);
end;
procedure povorotk(ugol:real; var a1,a2:real);
begin
a1:=a1*cos(ugol)-a2*sin(ugol);
a2:=a1*sin(ugol)+a2*cos(ugol);
end;
{procedure TForm1.Button1Click(Sender: TObject);
var tangan:real; i:integer;
begin
end;}
procedure TForm1.Button2Click(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Button3Click(Sender: TObject);
var tan,ris,kren:real;
begin
tan:=StrToFloat(Edit1.Text)*pi180;
ris:=StrToFloat(Edit2.Text)*pi180;
kren:=StrToFloat(Edit3.Text)*pi180;
for i:=1 to n do begin
Image1.Canvas.pen.Color :=clWhite;
Image1.Canvas.MoveTo(Image1.Width div 2,Image1.Height div 2);
if i<>1 then
Image1.canvas.moveto(Trunc(mas[i-1].x*10+Image1.Width div 2),Trunc(mas[i-1].y*10+Image1.Height div 2));
Image1.Canvas.LineTo(Trunc(mas[i].x*10+Image1.Width div 2),Trunc(mas[i].y*10+Image1.Height div 2));
end;
for i:=1 to n do begin
povorott(tan, mas[i].y, mas[i].z); //òàíãàæ
povorotr(ris, mas[i].x, mas[i].z); //ðûñêàíüå
povorotk(kren, mas[i].x, mas[i].y); // êðåí
Image1.Canvas.pen.Color :=clblack;
Image1.Canvas.MoveTo(Image1.Width div 2,Image1.Height div 2);
if i<>1 then
Image1.canvas.moveto(Trunc(mas[i-1].x*10+Image1.Width div 2),Trunc(mas[i-1].y*10+Image1.Height div 2));
Image1.Canvas.LineTo(Trunc(mas[i].x*10+Image1.Width div 2),Trunc(mas[i].y*10+Image1.Height div 2));
Memo1.Lines.Add(FloatToStr(mas[i].x) + ' ' + FloatToStr(mas[i].y)+ ' ' + FloatToStr(mas[i].z));
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mas[1].x:=0;
mas[2].x:=-1;
mas[3].x:=-1;
mas[4].x:=-9;
mas[5].x:=-10;
mas[6].x:=-1;
mas[7].x:=-0.5;
mas[8].x:=-5;
mas[9].x:=0;
mas[10].x:=5;
mas[11].x:=0.5;
mas[12].x:=1;
mas[13].x:=10;
mas[14].x:=9;
mas[15].x:=1;
mas[16].x:=1;
mas[17].x:=0;
mas[18].x:=0;
mas[19].x:=0;
mas[20].x:=0;
mas[21].x:=0;
mas[22].x:=0;
mas[23].x:=0;
mas[24].x:=0;
mas[25].x:=0;
mas[1].y:=10;
mas[2].y:=7;
mas[3].y:=1;
mas[4].y:=-1;
mas[5].y:=-2;
mas[6].y:=-1;
mas[7].y:=-6;
mas[8].y:=-8;
mas[9].y:=-7;
mas[10].y:=-8;
mas[11].y:=-6;
mas[12].y:=-1;
mas[13].y:=-2;
mas[14].y:=-1;
mas[15].y:=1;
mas[16].y:=7;
mas[17].y:=10;
mas[18].y:=6;
mas[19].y:=-6;
mas[20].y:=-8;
mas[21].y:=-9;
mas[22].y:=-7;
mas[23].y:=-5;
mas[24].y:=7;
mas[25].y:=10;
mas[1].z:=0;
mas[2].z:=0;
mas[3].z:=0;
mas[4].z:=0;
mas[5].z:=0;
mas[6].z:=0;
mas[7].z:=0;
mas[8].z:=0;
mas[9].z:=0;
mas[10].z:=0;
mas[11].z:=0;
mas[12].z:=0;
mas[13].z:=0;
mas[14].z:=0;
mas[15].z:=0;
mas[16].z:=0;
mas[17].z:=0;
mas[18].z:=1;
mas[19].z:=1;
mas[20].z:=3;
mas[21].z:=3;
mas[22].z:=0;
mas[23].z:=-1;
mas[24].z:=-1;
mas[25].z:=0;
// drawxy(mas[i].x,mas[i].y);
end;
end.