Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   вращение с помощью матриц (https://forum.antichat.xyz/showthread.php?t=146907)

stscolt 09.10.2009 16:16

вращение с помощью матриц
 
написал прогу, но что-то плохо вращает она. Вращает в TTimer.
Подскажите пожалуйста

Код:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, XPMan, Buttons, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    XPManifest1: TXPManifest;
    BitBtn1: TBitBtn;
    Timer1: TTimer;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    RadioButton3: TRadioButton;
    Button5: TButton;
    Button6: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure BitBtn1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  dx:integer;
implementation

{$R *.dfm}
type
  vect=array[1..8,1..4] of real;
  vect2=array[1..12] of TPoint;
  matr=array[1..4,1..4] of real;
var
  a: vect=
  ((300,270,0,1),(300,200,0,1),(360,200,0,1),(360,270,0,1),
  (400,370,0,1),(400,300,0,1),(460,300,0,1),(460,370,0,1));
  paralld: vect2;
  i,j,k:integer;
  x,y,z,x2,y2,z2,fi:real;
  b:matr;
  v:vect;

procedure TForm1.FormPaint(Sender: TObject);
begin
    form1.Canvas.Pen.Color:=cllime;
    canvas.MoveTo(300,200);
    canvas.LineTo(300,3);
    canvas.TextOut(305,3,'Z');
    canvas.MoveTo(300,200);
    canvas.LineTo(500,200);
    canvas.TextOut(500,205,'Y');
    canvas.MoveTo(300,200);
    canvas.LineTo(150,350);
    canvas.TextOut(147,350,'X');
end;

procedure par(var a:vect);
begin
 form1.canvas.MoveTo(round(a[1,1]),round(a[1,2]));
 form1.canvas.LineTo(round(a[2,1]),round(a[2,2]));
 form1.canvas.MoveTo(round(a[2,1]),round(a[2,2]));
 form1.canvas.LineTo(round(a[3,1]),round(a[3,2]));
 form1.canvas.MoveTo(round(a[3,1]),round(a[3,2]));
 form1.canvas.LineTo(round(a[4,1]),round(a[4,2]));
 form1.canvas.MoveTo(round(a[4,1]),round(a[4,2]));
 form1.canvas.LineTo(round(a[1,1]),round(a[1,2]));
 form1.canvas.MoveTo(round(a[1,1]),round(a[1,2]));
 form1.canvas.LineTo(round(a[5,1]),round(a[5,2]));
 form1.canvas.MoveTo(round(a[2,1]),round(a[2,2]));
 form1.canvas.LineTo(round(a[6,1]),round(a[6,2]));
 form1.canvas.MoveTo(round(a[3,1]),round(a[3,2]));
 form1.canvas.LineTo(round(a[7,1]),round(a[7,2]));
 form1.canvas.MoveTo(round(a[4,1]),round(a[4,2]));
 form1.canvas.LineTo(round(a[8,1]),round(a[8,2]));
 form1.canvas.MoveTo(round(a[5,1]),round(a[5,2]));
 form1.canvas.LineTo(round(a[6,1]),round(a[6,2]));
 form1.canvas.MoveTo(round(a[6,1]),round(a[6,2]));
 form1.canvas.LineTo(round(a[7,1]),round(a[7,2]));
 form1.canvas.MoveTo(round(a[7,1]),round(a[7,2]));
 form1.canvas.LineTo(round(a[8,1]),round(a[8,2]));
 form1.canvas.MoveTo(round(a[8,1]),round(a[8,2]));
 form1.canvas.LineTo(round(a[5,1]),round(a[5,2]));
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
 if radiobutton1.Checked=true then begin
  fi:=pi/24;
  b[1,1]:=1;b[1,2]:=0;b[1,3]:=0;b[1,4]:=0;
  b[2,1]:=0;b[2,2]:=cos(fi);b[2,3]:=sin(fi);b[2,4]:=0;
  b[3,1]:=0;b[3,2]:=-sin(fi);b[3,3]:=cos(fi);b[3,4]:=0;
  b[4,1]:=0;b[4,2]:=0;b[4,3]:=0;b[4,4]:=1;
  for i:=1 to 8 do
    for j:=1 to 4 do begin
      v[i,j]:=0;
      for k:=1 to 4 do
        v[i,j]:=v[i,j]+a[i,k]*b[k,j];
        a[i,j]:=v[i,j];
    end;
    form1.Refresh;
 par(a);
 end;
 if radiobutton2.Checked=true then begin
  fi:=pi/24;
  b[1,1]:=cos(fi);b[1,2]:=0;b[1,3]:=-sin(fi);b[1,4]:=0;
  b[2,1]:=0;b[2,2]:=1;b[2,3]:=0;b[2,4]:=0;
  b[3,1]:=sin(fi);b[3,2]:=0;b[3,3]:=cos(fi);b[3,4]:=0;
  b[4,1]:=0;b[4,2]:=0;b[4,3]:=0;b[4,4]:=1;
  for i:=1 to 8 do
    for j:=1 to 4 do begin
      v[i,j]:=0;
      for k:=1 to 4 do
        v[i,j]:=v[i,j]+a[i,k]*b[k,j];
      a[i,j]:=v[i,j];
    end;
  form1.Refresh;
 par(a);
 end;
 if radiobutton3.Checked=true then begin
  fi:=pi/24;
  b[1,1]:=cos(fi);b[1,2]:=sin(fi);b[1,3]:=0;b[1,4]:=0;
  b[2,1]:=-sin(fi);b[2,2]:=cos(fi);b[2,3]:=0;b[2,4]:=0;
  b[3,1]:=0;b[3,2]:=0;b[3,3]:=1;b[3,4]:=0;
  b[4,1]:=0;b[4,2]:=0;b[4,3]:=0;b[4,4]:=1;
  for i:=1 to 8 do
    for j:=1 to 4 do begin
      v[i,j]:=0;
      for k:=1 to 4 do
        v[i,j]:=v[i,j]+a[i,k]*b[k,j];
    a[i,j]:=v[i,j];
    end;
  form1.Refresh;
 par(a);
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 //form1.Refresh;
 j:=1;
 par(a);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 j:=1;
 for i:=1 to 8 do begin
  a[i,1]:=a[i,1]-j;
  a[i,2]:=a[i,2];
  a[i,3]:=a[i,3];
 end;
 Form1.Refresh;
 par(a);
 j:=j+2;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 j:=1;
 for i:=1 to 8 do begin
  a[i,1]:=a[i,1];
  a[i,2]:=a[i,2]+j;
  a[i,3]:=a[i,3];
 end;
 Form1.Refresh;
 par(a);
 j:=j+2;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 j:=1;
 for i:=1 to 8 do begin
  a[i,1]:=a[i,1]+j;
  a[i,2]:=a[i,2]-j;
  a[i,3]:=a[i,3];
 end;
 Form1.Refresh;
 par(a);
 j:=j+2;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
timer1.Enabled:=false;
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
  case key of
  '1':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1]-j;
    a[i,2]:=a[i,2]+j;
    a[i,3]:=a[i,3];
  end;
  Form1.Refresh;
  par(a);
  j:=j+2;
  end;
  '2':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1];
    a[i,2]:=a[i,2]+j;
    a[i,3]:=a[i,3];
  end;
  Form1.Refresh;
  par(a);
  j:=j+2;
  end;
  '3':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1]+j;
    a[i,2]:=a[i,2]+j;
    a[i,3]:=a[i,3];
  end;
  Form1.Refresh;
  par(a);
  j:=j+2;
  end;
  '4':begin
  j:=1;
    for i:=1 to 8 do begin
    a[i,1]:=a[i,1]-j;
    a[i,2]:=a[i,2];
    a[i,3]:=a[i,3];
    end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
  '5':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1];
    a[i,2]:=a[i,2];
    a[i,3]:=a[i,3];
    end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
  '6':begin
  j:=1;
  for i:=1 to 27 do begin
    a[i,1]:=a[i,1]+j;
    a[i,2]:=a[i,2];
    a[i,3]:=a[i,3];
    end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
  '7':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1]-j;
    a[i,2]:=a[i,2]-j;
    a[i,3]:=a[i,3];
    end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
  '8':begin
  j:=1;
  for i:=1 to 8 do begin
    a[i,1]:=a[i,1];
    a[i,2]:=a[i,2]-j;
    a[i,3]:=a[i,3];
  end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
  '9':begin
  j:=1;
    for i:=1 to 8 do begin
    a[i,1]:=a[i,1]+j;
    a[i,2]:=a[i,2]-j;
    a[i,3]:=a[i,3];
    end;
    Form1.Refresh;
    par(a);
    j:=j+2;
  end;
end;  end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
 form1.Close;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 timer1.Enabled:=true;
end;

end.


stscolt 09.10.2009 16:51

че не понятно? в TTimer идет перемножение матриц. Так вот из-за этого должно происходить вращение, а оно не происходит. Почему???

Ra$cal 10.10.2009 00:19

тс, если хочешь получить ответ - относись с уважением к публике. если тебе начхать на тех, кто может тебе помочь, то вполне резонно ожидать такое же отношение к тебе...


Время: 14:29