Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Dreieck um Punkt auf der Hypotenuse drehen (https://www.delphipraxis.net/149201-dreieck-um-punkt-auf-der-hypotenuse-drehen.html)

w4rheart 16. Mär 2010 20:49

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:
ypos:= ypos + round(cos(degtorad(winkel)) * strtoint(Edit1.text));
xpos:= xpos + round(sin(degtorad(winkel)) * strtoint(Edit1.text));
tuts leider nicht, weiss jemand wieso?

//Edit3: doch tuts wohl :D... letztes Problem (diesmal wirklich): der geht immernoch in die falsche richtung. immer nach unten rechts...
Delphi-Quellcode:
  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);
hierran muss irgendetwas nicht stimmen...
Komischerweise: bei 3*45 Drehung (135)+ vorwärts, funktionierts !? warum...?

jmd anders 16. Mär 2010 22:09

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

w4rheart 16. Mär 2010 22:46

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:

ensaron 17. Mär 2010 10:40

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.

Panthrax 17. Mär 2010 11:07

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:

w4rheart 17. Mär 2010 12:30

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?

Panthrax 17. Mär 2010 13:41

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;

shmia 17. Mär 2010 14:02

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);

Panthrax 17. Mär 2010 14:28

Re: Dreieck um Punkt auf der Hypotenuse drehen
 
Shmia, da werden sich die Rundungsfehler aufaddieren.

Zitat:

Zitat von shmia
Man kann das Verschieben, Drehen und Zurückverschieben auch mit einer 2D-Matrix berechnen, (...)

Das geht nicht, (Schieben, Drehen) ist etwas anderes als (Drehen, Schieben). Dies Operationen können nicht zusammengafasst werden, wie etwa 2*X + 3*X = 5*X.

Medium 17. Mär 2010 15:22

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.
Seite 2 von 3     12 3      

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