Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.06.2013, 12:00   #1
MariaD
Пользователь
 
Аватар для MariaD
 
Регистрация: 10.01.2013
Сообщений: 56
Стрелка Поворот фигуры.Canvas.Самолет сплющивается, уменьшается [delphi]

Дан самолетик.в эдиты вводятся углы поворота.и самолет вращается.У меня при каждом пересчете самолет на канве при задании одного угла крутиться, но сплющивается, а при задании 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.
MariaD вне форума Ответить с цитированием
Старый 05.06.2013, 12:43   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

При беглом просмотре:
1) Я бы только рассчитывал координаты для отрисовки, но не менял сами координаты в массиве
2) В процедурах расчета поворота во втором уравнении используется уже новое значение a1, а нужно использовать старое
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поворот фигуры Pascal stas45rus Помощь студентам 10 13.05.2012 12:43
Поворот фигуры firefox0013 Общие вопросы C/C++ 3 30.11.2011 18:36
Работа с изображением.Поворот.Поиск фигуры. Sheril Общие вопросы по Java, Java SE, Kotlin 0 30.04.2011 12:02
Поворот пикселя Canvas rubik Помощь студентам 3 04.05.2010 23:46
Canvas (Канва) - заливка фигуры произвольной формы Albenous Общие вопросы Delphi 13 24.02.2007 13:21