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

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

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 21:49
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
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 ... 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...?
Angehängte Dateien
Dateityp: zip dreiecksrotation_510.zip (211,0 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
jmd anders

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

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 23:09
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
  Mit Zitat antworten Zitat
w4rheart

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

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 16. Mär 2010, 23:46
stimmt, natürluch
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
Angehängte Dateien
Dateityp: zip dreiecksrotation_355.zip (211,1 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#14

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 11:40
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.
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#15

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 12:07
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.
Miniaturansicht angehängter Grafiken
gedrehtes_dreieck_100.png  
Angehängte Dateien
Dateityp: pas unit1_170.pas (2,8 KB, 8x aufgerufen)
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
w4rheart

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

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 13:30
^ 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?
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#17

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 14:41
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;
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#18

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 15:02
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);
Andreas
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#19

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 15:28
Shmia, da werden sich die Rundungsfehler aufaddieren.

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.
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#20

Re: Dreieck um Punkt auf der Hypotenuse drehen

  Alt 17. Mär 2010, 16:22
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
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 19:14 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