AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Dreieck um Punkt auf der Hypotenuse drehen
Thema durchsuchen
Ansicht
Themen-Optionen

Dreieck um Punkt auf der Hypotenuse drehen

Ein Thema von w4rheart · begonnen am 16. Mär 2010 · letzter Beitrag vom 25. Mär 2010
Antwort Antwort
Seite 1 von 3  1 23      
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#1

Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 16:53
Hallo!

Ich hab folgendes vor: Ich möchte ein Dreieck um den Mittelpunkt der Hypotenuse Drehen:
http://img339.imageshack.us/img339/7599/unbenanntia.jpg

Ich kenne die Punkte des Dreiecks, und die winkel, so z.B.:
Delphi-Quellcode:
A:=Point(100,100);
B:=Point(100,150);
C:=Point(250,125);
canvas.Polygon([A,B,C]);
Ich möchte das Dreieck um jeden beliebigen Winkel drehen können, wie genau kann ich sowas in Delphi machen?
Bzw. wie kann ich die neuen Punkte (Ax,Bx,Cx) bestimmen?
Ich meine zu wissen, dass es da irgendeine Formel mit sin, cos und den Winkeln oder ähnlichem gibt, weiss aber nicht genau wie die lautet und wie genau die funktioniert =(

Könnte mir jemand Weiterhelfen und Erklären, wie ich die neuen Punkte nach einer Rotation bestimmen, und so das das neue Dreieck zeichnen kann?
Wäre super, wenn ihr mir da weiterhelfen könntet

MfG
w4rheat
  Mit Zitat antworten Zitat
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#2

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 17:13
das ist ein zweidimensionales problem, also brauchst du eine zweidimensionale drehmatrix(kannst du bei wikipedia nachlesen) stellst deine punkte einfach als vektoren dar und wendest auf alle die drehmatrix an.
je nachdem in welchen punkt du deinen koordinatenurspung legst, wird um diesen punkt gedreht.
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#3

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 17:30
Erstmal danke für die schnelle Antwort!

Aber ehrlich gesagt versteh ich deine Ausführungen nicht genau.
Hab mir den Artikel über Drehmatrizen bei wikipedia nal durchgelesen, aber nicht genau verstanden =(
(Hab auch noch nicht mit Matrizen oder Vektoren gearbeitet)
Bei wikipedia wird das ganze immer nur für 2 Punkte berechnet, wie mach ich das denn mit 3en? Wenn ich das Dreieck also um einen Punkt spiegeln will, der ja keine Eckpunkt des Dreiecks, sondern, wie oben beschrieben, der Mittelpunkt der Hypotenuse sein soll?

Könntest du evtl. noch mal etwas genauer versuchen mir das zu erklären, vll. auf eine einfachere Art und Weise?
Also vll. wo ich da wie dieses +- sin cos nehmen muss?
Wäre super =)

MfG
  Mit Zitat antworten Zitat
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#4

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 17:52
hm, wenn du dich nicht mit vektoren und matrizen auskennst, ist das auch nicht so schlimm, hier dann die Lösung.
um einen punkt von deinem dreieck um den koordinaten ursprung zu drehen benutzt du folgendes


Pneux = cos(alpha) * Px - sin(alpha) * Py
Pneuy = sin(alpha) * Px + cos(alpha) * Py

wobei Pneux und Pneuy die Koordinaten deines gedrehten Punkts sind und px und py, die deines ausgangspunkts.

diese operation musst du nun für alle drei punkte ausführen.
wenn du nun um einen bestimmten punkt drehen willst, musst du alle punkte von diesem bestimmten punkt aus beschreiben ( koordinatensytem verschieben)
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#5

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 19:54
Danke für die Antwort!

Hab es jetzt folgendermaßen umgesetzt:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var Ax,Bx,Cx,Ay,By,Cy:integer;
begin
winkel:=strtoint(Edit1.Text);//(45)

Ax := round(cos(radtodeg(winkel)) * A.x - sin(radtodeg(winkel)) * A.y);
Ay := round(sin(radtodeg(winkel)) * A.x + cos(radtodeg(winkel)) * A.y);
A:=Point(Ax,Ay);

Bx := round(cos(radtodeg(winkel)) * B.x - sin(radtodeg(winkel)) * B.y);
By := round(sin(radtodeg(winkel)) * B.x + cos(radtodeg(winkel)) * B.y);
B:=Point(Bx,By);

Cx := round(cos(radtodeg(winkel)) * C.x - sin(radtodeg(winkel)) * C.y);
Cy := round(sin(radtodeg(winkel)) * C.x + cos(radtodeg(winkel)) * C.y);
C:=Point(Cx,Cy);

Image1.Canvas.Polygon([A,B,C]);
end;
Allerdings funktioniert das nicht so wie es soll. Es wird kein Dreieck gezeichnet, und die Werte für z.B. Bx liegen bei -100...
Was mache ich falsch?

Hab auch noch das Test-Projekt als Attachement hinzugefügt, vll. wird dadurch eher klar wie ich mir das vorstelle^^

MfG
Angehängte Dateien
Dateityp: zip dreiecksrotation_136.zip (3,6 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#6

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 20:50
Es funktioniert an sich wunderbar Das einzige Problem ist nun, dass dein Drehpunkt im Koordinatenursprung liegt (links oben).
Es wird also um diesen Punkt gedreht, daraus folgt, dass du bei deiner Voreinstellung(45°) so weit drehst, dass es die Koordinaten nicht mehr auf deinem Image angezeigt werden. Wenn man dreimal drückt sollte man sehen, dass das Dreieck auftaucht, wenn man noch viel öfter drückt sieht man die Kreisbahn.

Dein Problem ist nun die Drehung um einen vorgegebenen Punkt. Dazu tust du am besten so, als wäre der Drehpunkt dein Koordinatenursprung. Du beschreibst nun deine drei Eckpunkte ausgehend von dem Drehpunkt. Dann führst du mit diesen Koordinaten deine Drehung durch und verschiebst nun das gedrehte Dreieck an den Punkt, wo du es gerne hättest, zb Mitte des Timage.
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#7

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 20:54
Hey, ja so hab ich das jetzt auch gemacht =) :
Delphi-Quellcode:
winkel:=strtoint(Edit1.Text);//(45)

Ax := round(cos(degtorad(winkel)) * (A.x-xpos) - sin(degtorad(winkel)) * (A.y-ypos));
Ay := round(sin(degtorad(winkel)) * (A.x-xpos) + cos(degtorad(winkel)) * (A.y-ypos));
A:=Point(xpos+Ax,ypos+Ay);

Bx := round(cos(degtorad(winkel)) * (B.x-xpos) - sin(degtorad(winkel)) * (B.y-ypos));
By := round(sin(degtorad(winkel)) * (B.x-xpos) + cos(degtorad(winkel)) * (B.y-ypos));
B:=Point(xpos+Bx,ypos+By);

Cx := round(cos(degtorad(winkel)) * (C.x-xpos) - sin(degtorad(winkel)) * (C.y-ypos));
Cy := round(sin(degtorad(winkel)) * (C.x-xpos) + cos(degtorad(winkel)) * (C.y-ypos));
C:=Point(xpos+Cx,ypos+Cy);

Image1.Canvas.Polygon([A,B,C]);
Jetzt bleiben nur noch 2 Probleme:
1. Wie kann ich das alte Dreieck vorher löschen? Also ich will das nicht mit z.B. weiss nochmal übermalen (falls das überhaupt geht),
sondern einfach löschen, so dass immer n ur 1 Dreieck angezeigt wird, geht das?
2. Wenn ich auf vorwärts gehen klicke, dann soll das dreieck um 10 nach vorne springen, allerdings in die jeweilige richtung in der es gedreht ist.
Z.B. 90 drehen, dann 10 vorwärts -> 10 schritte nach rechts.

Hast du da evtl. auch eine Lösung für mich parat? =)
Übrigens echt super wie einem hier in diesem Forum geholfen wird, lobt sich sowas

MfG
  Mit Zitat antworten Zitat
Benutzerbild von Lumpiluk
Lumpiluk

Registriert seit: 25. Dez 2008
110 Beiträge
 
#8

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 21:05
Zitat:
Wie kann ich das alte Dreieck vorher löschen? Also ich will das nicht mit z.B. weiss nochmal übermalen (falls das überhaupt geht),
sondern einfach löschen, geht das?
Eigentlich nicht wirklich...

Worauf zeichnest du denn? (TImage oder TPaintBox?)
Löschen könntest du auf jeden Fall mit Canvas.FillRect(0,0,Width,Height);, aber am besten führst du solche Zeichnungen sowieso immer im OnPaint aus. Dann kannst du auch einfach mit dem Befehl 'Refresh' alles neu zeichnen.
  Mit Zitat antworten Zitat
w4rheart

Registriert seit: 16. Mär 2010
53 Beiträge
 
#9

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 21:14
^ auf einem TImage. Was hat den Paintbox für Vorteile?
Und wie genau meinst du:"eigentlich nicht wirklich..." ?

MfG
  Mit Zitat antworten Zitat
jmd anders

Registriert seit: 13. Mai 2004
84 Beiträge
 
#10

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 21:14
zur 2ten Frage:
Das ist eine Bewegung entlang einer Gerade. Der Winkel der Geraden ist gegeben(durch deine Drehungsvorgabe).
einfach Dreiecksbeziehung:

x = cos(alpha) * Verschiebung + x;
y = sin(alpha) * Verschiebung + y;

für jeden Punkt ausführen, sollte die Punkte verschieben. falls nicht einfach mal ein Blatt Papier benutzen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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:09 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