Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Dreh Matrixen (https://www.delphipraxis.net/17434-dreh-matrixen.html)

Mr.P-Funk 5. Mär 2004 15:26


Dreh Matrixen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich will ein beliebiges Objekt(Polygon) in einem bestimmten Winkel um den Mittelpunkt rotieren lassen. Nun habe ich fogendes Problem, Wenn ich meinen Winkel um nur 1 erhöhe verschieben sich alle Proportionen und das Objekt verändert sich[-> Der Fehler liegt glaube ich bei DreheHaus].

____________________________
Nun der Code:

Delphi-Quellcode:
unit Dynamischematrixforum;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, StdCtrls, ExtCtrls;


type
 TPunkt = Record
  x,
  y: Double;
  radius:double;
end;

type
  TForm1 = class(TForm)
    PaintBox1: TPaintBox;
    StatusBar1: TStatusBar;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  Haus : array of TPunkt;
  procedure InitHaus(anzahl : array of Tpunkt);
  procedure ZeichneKaroBlatt;
  procedure ZeichneHaus;
  procedure DreheHaus;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  MP : TPoint;
  EinheitenGroesse : integer;
  Winkel : integer;
Const
   P1: TPunkt = (x:0; y:0);
   P2: TPunkt = (x:2; y:0);
   P3: TPunkt = (x:2; y:2);
   P4: TPunkt = (x:1; y:3);
   P5: TPunkt = (x:0; y:2);

   max = 5;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var punkte:array[0..4] of tpunkt;
begin
   Paintbox1.Width := 400;
   paintbox1.Height := 400;
   MP.X := paintbox1.Width div 2;
   MP.Y := paintbox1.Height div 2;
   EinheitenGroesse := PaintBox1.Width DIV (2*Max);
   Punkte[0]:= P1;
   Punkte[1]:= P2;
   Punkte[2]:= P3;
   Punkte[3]:= P4;
   Punkte[4]:= P5;

   InitHaus(Punkte);
end;

procedure TForm1.InitHaus(anzahl : array of Tpunkt);
var i: integer;
    Temp : Tpunkt;
begin
  setlength(Haus, high(anzahl)+1);
  for i:=0 to high(Haus) do
  begin
       Temp.x   := anzahl[i].x;
       Temp.y   := anzahl[i].y;
       Temp.radius:= sqrt(sqr((anzahl[i].X))+(sqr(anzahl[i].Y))); // Pythagoras
       Haus[i].X := Temp.x;
       Haus[i].y := Temp.y;
       Haus[i].radius := Temp.radius;
//       showmessage(floattostr(Haus[i].radius));
  end;  
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
   ZeichneKaroblatt;
   ZeichneHaus;
end;

procedure TForm1.ZeichneHaus;
var
   Bild: Array of TPoint;
   I: Integer;
   Leerstellen : String;
begin
   setlength(Bild, high(haus)+1);
   for i := low(haus) to high(Haus) do
   begin
      Bild[i].x := Mp.x + Round(Haus[I].x*EinheitenGroesse);
      Bild[i].y := Mp.y - Round(Haus[I].y*EinheitenGroesse);
   end;

   PaintBox1.Canvas.Pen.Color := clblack;
   PaintBox1.Canvas.Brush.Color := clred;
   PaintBox1.Canvas.Polygon(Bild);

   for i := low(haus) to high(Haus) do
   begin
      paintbox1.Canvas.MoveTo(Mp.X,mp.Y);
      paintbox1.Canvas.lineto(Mp.x + Round(Haus[I].x*EinheitenGroesse),Mp.y - Round(Haus[I].y*EinheitenGroesse));
      Bild[i].x := Mp.x + Round(Haus[I].x*EinheitenGroesse);
      Bild[i].y := Mp.y - Round(Haus[I].y*EinheitenGroesse);
   end;

// Hilfen
   PaintBox1.Canvas.Brush.Color := clbtnface;
   Statusbar1.SimpleText :='';
   for i:=low(Haus) to high(haus) do
   begin
      if i=0 then Leerstellen:=''
      else       Leerstellen:=' .. ';
      statusbar1.SimpleText:=statusbar1.simpletext+Leerstellen+inttostr(round(Haus[i].X*einheitengroesse))+'|'+inttostr(round(Haus[i].Y*einheitengroesse));
      paintbox1.Canvas.TextOut(Bild[i].X,Bild[i].Y,inttostr(i+1));
   end;
end;

procedure TForm1.DreheHaus;
var i: Integer;
begin
   for i := low(haus) to high(Haus) do
   begin
      Haus[i].radius := sqrt((sqr(Haus[i].x))+(sqr(haus[i].Y)));
      Haus[i].x     := Haus[i].x+(Haus[i].Radius * cos(PI / 100 * winkel));
      Haus[i].y     := Haus[i].y-(Haus[i].Radius * sin(PI / 100 * winkel));
   end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   ZeichneHaus;
   inc(winkel,1);
   drehehaus;
   invalidate;
end;


//--------------------------------------------------------------

procedure TForm1.ZeichneKaroBlatt;
var i: Integer;
begin
   with PaintBox1.Canvas do
   begin
      Pen.Color := clBlack;
      Brush.Color := clWhite;
      Rectangle(0, 0, PaintBox1.Width - 1, PaintBox1.Height -1);

      // vor den Achsen liegende Hilfslinien zeichnen
      Pen.Style := psDot;
      for i := 1 to Max - 1 do
      begin
         MoveTo(0, i*EinheitenGroesse);
         LineTo(PaintBox1.Width - 1, i*EinheitenGroesse);

         MoveTo(i*EinheitenGroesse, 0);
         LineTo(i*EinheitenGroesse, PaintBox1.Width - 1 );
      end;

      // nach den Achsen liegende Hilfslinien zeichnen

      for i := Max+1 to 2*Max - 1 do
      begin
         MoveTo(0, i*EinheitenGroesse);
         LineTo(PaintBox1.Width - 1, i*EinheitenGroesse);

         MoveTo(i*EinheitenGroesse, 0);
         LineTo(i*EinheitenGroesse, PaintBox1.Width - 1 );
      end;
      // Achsen zeichnen
      Pen.Style := psSolid;
      MoveTo(Mp.x, 0);
      LineTo(Mp.x, PaintBox1.Height - 1);
      MoveTo(0, Mp.y);
      LineTo(PaintBox1.Width - 1, Mp.y);
   end;
end;


end.
Habe mir auch schon überlegt den Mittelpunkt zu bestimmen, aber im moment habe ich mich da so hereinferfranzt das ich den Wald vor lauter Bäumen nicht seh.

Daten im Anhang
__________________________________________________ _______________________
:coder: Im Endeffekt regelt sich in dieser Gesellschafft alles über das Geld, positiv wie negativ.

Mr.P-Funk 5. Mär 2004 22:35

Re: Dreh Matrixen
 
Ok habe die Lösung

Delphi-Quellcode:
     // DREHMATRIX!!
     alpha := Winkel/180*Pi;
     d11 := cos(alpha);
     d12 := -sin(alpha);
     d21 := sin(alpha);
     d22 := cos(alpha);
   for i := low(haus) to high(Haus) do
   begin
      Temp[i].x := d11*Haus[i].x + d12*Haus[i].y;
      Temp[i].y := d21*Haus[i].x + d22*Haus[i].y;
      Haus[i].x := Temp[i].x;
      Haus[i].y := Temp[i].y;
   end; // <- DREHMATRIX!
Hiermit gibt man einfach einen Winkel an und das Polygon wird dann dementsprechend gedreht.
TIP: Wenn man an den Vektoren ein wenig rumspielt lassen sich tolle Effekte erzeugen[3D].

__________________________________________________ ________________________
:coder: Im Endeffekt regelt sich in dieser Gesellschafft alles über das Geld, positiv wie negativ.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:22 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz