![]() |
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:
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.
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. Daten im Anhang __________________________________________________ _______________________ :coder: Im Endeffekt regelt sich in dieser Gesellschafft alles über das Geld, positiv wie negativ. |
Re: Dreh Matrixen
Ok habe die Lösung
Delphi-Quellcode:
Hiermit gibt man einfach einen Winkel an und das Polygon wird dann dementsprechend gedreht.
// 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! 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 17:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz