Re: Dreieck um Punkt auf der Hypotenuse drehen
Liste der Anhänge anzeigen (Anzahl: 1)
Also das mit dem löschen hab ich jetzt über Image1.Canvas.Pen.Mode:=pmnotxor; hinbekommen.
Allerdings das mit dem verschieben... Es ist zum Haare ausreissen^^ Es springt einfach immer in die falsche richtung! Bzw je nachdem was ich einstelle um 90° bzw. 180° in die falsche richtung. und wenn ich dann erneut auf drehen klicke, rotiert das rechteck wieder um den mittelpunkt :evil: Ich bekomme nicht heraus woran es liegt. Blatt Papier und Stift hab nix gnützt... =( Bitte schau sich das noch einmal einer an. MfG //Edit: das mit dem drehen ist mir jetzt klar, ich hab die xpos und ypos nicht verändert. Ist nur noch die Frage um welchen wert ich die jeweils bei welcher drehung verändern muss... //Edit2:
Delphi-Quellcode:
tuts leider nicht, weiss jemand wieso?
ypos:= ypos + round(cos(degtorad(winkel)) * strtoint(Edit1.text));
xpos:= xpos + round(sin(degtorad(winkel)) * strtoint(Edit1.text)); //Edit3: doch tuts wohl :D... letztes Problem (diesmal wirklich): der geht immernoch in die falsche richtung. immer nach unten rechts...
Delphi-Quellcode:
hierran muss irgendetwas nicht stimmen...
Ax := round(cos(degtorad(winkel)) * strtoint(edit1.Text) + A.x);
Ay := round(sin(degtorad(winkel)) * strtoint(edit1.Text) + A.y); A:=Point(Ax,Ay); Bx := round(cos(degtorad(winkel)) * strtoint(edit1.Text) + B.x); By := round(sin(degtorad(winkel)) * strtoint(edit1.Text) + B.y); B:=Point(Bx,By); Cx := round(cos(degtorad(winkel)) * strtoint(edit1.Text) + C.x); Cy := round(sin(degtorad(winkel)) * strtoint(edit1.Text) + C.y); C:=Point(Cx,Cy); Komischerweise: bei 3*45 Drehung (135)+ vorwärts, funktionierts !? warum...? |
Re: Dreieck um Punkt auf der Hypotenuse drehen
du musst natürlich noch speichern, wie groß der winkel aktuell ist. durch drücken des knopfs sollte dann immer nur eine addition zu dem winkel stattfinden
|
Re: Dreieck um Punkt auf der Hypotenuse drehen
Liste der Anhänge anzeigen (Anzahl: 1)
stimmt, natürluch :pale:
so jetzt zeichnet der meine Linie richtig, aber das Dreieck an der falschen stelle, bzw immer verschoben... Wäre super, wenn du dir das nochmal angucken könntest :oops: :lol: |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Bastel dir doch mal eine Procedure, die das Dreieck im angegebenen Winkel an einem zu übergebenen Punkt neuzeichnet.
Die Verschiebung deines Punktes funktioniert ja und dann müsstest du nur noch das Dreieck an der neuen Position des Punktes im jeweils aktuellen Winkel neu zeichnen. |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe eine Lösung mal ausgehend von obigem Programm (#13) und mithilfe meiner eigenen Mathe-Unit angefertigt. Eigentlich ist vom ursprünglichen Programm nicht viel übrig geblieben. Allerdings hat sich auch der Mathewald gelichtet und die eigentlichen Operationen sind klarer erkennbar. Die wesentlichen Teile meiner Unit habe ich in die Unit1.pas kopiert, ob Du die Unit allerdings kompilieren kannst, hängt von der verwendeten Delphi-Version ab. Ggf. müssen die Record-Methoden in Routinen umgeschrieben werden. Du könntest Deine Delphi-Version im Profil angeben, das würde Deinen Helfern helfen. :zwinker:
|
Re: Dreieck um Punkt auf der Hypotenuse drehen
^ Danke für deine Mühe! =)
Also Ich benutzt Delphi 7, und konnte es, wie du schon richtig vermutet hast, nicht kompilieren :( (Records konnten nicht kompiliert werden) Wie muss ich die verändern? |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Das hier müsste gehen, ist aber freihand getippt.
Delphi-Quellcode:
type
TVector2D = record X, Y: Extended; end; { TVector2D } function Vector2DAdd(const Left, Right: TVector2D): TVector2D; begin Result.X := Left.X + Right.X; Result.Y := Left.Y + Right.Y; end; function Vector2DToPoint(const Value: TVector2D): TPoint; begin Result.X := Round(Value.X); Result.Y := Round(Value.Y); end; function Vector2DNew(const X, Y: Extended): TVector2D; begin Result.X := X; Result.Y := Y; end; procedure Vector2DRotate(var Vector: TVector2D; const Alpha: Extended); var S, C, T: Extended; begin C := Cos(Alpha); S := Sin(Alpha); T := X; Vector.X := C * Vector.X - S * Vector.Y; Vector.Y := S * T + C * Vector.Y; end; function Vector2DRotated(const Vector: TVector2D; const Alpha: Extended): TVector2D; begin Result.X := Vector.X; Result.Y := Vector.Y; Vector2DRotate(Result, Alpha); end; { TForm1 } begin X := Vector2DNew(-80, 0); // ... U := Vector2DToPoint(Vector2DAdd(O, Vector2DRotated(X, Alpha))); // ... end; |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Schau mal hier, damit wirst du bestimmt zurechtkommen.
Also du hast deine drei Punkte des Dreiecks (a,b,c) und den roten Drehpunkt (dreh). Dann muss das Dreieck so verschoben werden, dass der Drehpunkt in den Ursprung (0,0) fällt. Nun wird gedreht und anschliessend das Polygon wieder zurückverschoben. Man kann das Verschieben, Drehen und Zurückverschieben auch mit einer 2D-Matrix berechnen, aber so ist es leichter verständlich.
Delphi-Quellcode:
var
dreieck : array[0..2] of TPoint; dreh, t : TPoint; begin // Anfangspunkte setzen dreieck[0] := Point(..,..); dreieck[1] := Point(..,..); dreieck[2] := Point(..,..); dreh := Point(...,...); // Dreieck in den Ursprung verschieben t := Point(-dreh.x,-dreh.y); Translate2Darray(dreieck, t); // Dreieck drehen Rotate2Darray(dreieck, DegToRad(30)); // Drehung 30 Grad // zurück in den Drehpunkt schieben Translate2Darray(dreieck, dreh); |
Re: Dreieck um Punkt auf der Hypotenuse drehen
Shmia, da werden sich die Rundungsfehler aufaddieren.
Zitat:
|
Re: Dreieck um Punkt auf der Hypotenuse drehen
Doch, können sie. Die Matrixmultiplikation ist nicht Kommutativ, was eben genau diesen Umstand so wunderbar herrlich anschaulich wiederspiegelt. Und man verknüpft Transformationen via Multiplikation, nicht Addition ;)
|
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