AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Dreh Matrixen

Ein Thema von Mr.P-Funk · begonnen am 5. Mär 2004 · letzter Beitrag vom 5. Mär 2004
Antwort Antwort
Mr.P-Funk

Registriert seit: 9. Dez 2003
11 Beiträge
 
Delphi 5 Standard
 
#1

Dreh Matrixen

  Alt 5. Mär 2004, 15:26
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
__________________________________________________ _______________________
Im Endeffekt regelt sich in dieser Gesellschafft alles über das Geld, positiv wie negativ.
Angehängte Dateien
Dateityp: zip drehmatrix.zip (2,3 KB, 17x aufgerufen)
  Mit Zitat antworten Zitat
Mr.P-Funk

Registriert seit: 9. Dez 2003
11 Beiträge
 
Delphi 5 Standard
 
#2

Re: Dreh Matrixen

  Alt 5. Mär 2004, 22:35
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].

__________________________________________________ ________________________
Im Endeffekt regelt sich in dieser Gesellschafft alles über das Geld, positiv wie negativ.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 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