вращение с помощью матриц

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by stscolt, 9 Oct 2009.

  1. stscolt

    stscolt New Member

    Joined:
    8 Oct 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    -1
    написал прогу, но что-то плохо вращает она. Вращает в TTimer.
    Подскажите пожалуйста

    Code:
    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.
     
    #1 stscolt, 9 Oct 2009
    Last edited by a moderator: 10 Oct 2009
  2. stscolt

    stscolt New Member

    Joined:
    8 Oct 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    -1
    че не понятно? в TTimer идет перемножение матриц. Так вот из-за этого должно происходить вращение, а оно не происходит. Почему???
     
  3. Ra$cal

    Ra$cal Elder - Старейшина

    Joined:
    16 Aug 2006
    Messages:
    670
    Likes Received:
    185
    Reputations:
    78
    тс, если хочешь получить ответ - относись с уважением к публике. если тебе начхать на тех, кто может тебе помочь, то вполне резонно ожидать такое же отношение к тебе...