AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Winkel zwischen zwei Punkten?!

Ein Thema von Vasco da Gama · begonnen am 28. Aug 2009 · letzter Beitrag vom 4. Sep 2009
Antwort Antwort
Seite 1 von 3  1 23      
Vasco da Gama

Registriert seit: 2. Aug 2009
131 Beiträge
 
Delphi 2009 Professional
 
#1

Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 11:56
Hallo, nach viel googlen finde ich einfach nicht, wonach ich suche. Selbst kann ich es nicht beantworten, da ich Winkelfunktionen(sin, cos, tan, etc.) in der Schule noch nicht gelernt habe.

Ich habe einen TPoint, nennen wir ihn P1.
Dann klicke ich mit der Maus:
Delphi-Quellcode:
begin
...
  GetCursorPos(p2);
  p2 := ScreenToClient(p2);
  SetDir(round(Tan((P1.Y - P2.Y) / (P1.X - P2.X))));
...
end;
SetDir ist folgendes:
Delphi-Quellcode:
procedure TEinheit.SetDir(ADirection: Integer);
var
  w:integer;
begin
  //Reset the speed variables
  FYSpeed := 0;
  FXSpeed := 0;


  w := ADirection;

  //Set the X and the Y speed
  FXSpeed := round(cos(PI/180*w)*Speed);

  FYSpeed := round(sin(PI/180*w)*Speed);

  AnimLoop := true;
  AnimActive := true;
end;
Vielleicht inzwischen erraten, es ist ein Andorra 2D Projekt
die DoMove procedure von TEinheit ist folgende:
Delphi-Quellcode:
procedure TEinheit.DoMove(TimeGap: Double);
begin
inherited DoMove(TimeGap);
    X := X + FXSpeed * TimeGap;
    Y := Y + FYSpeed * TimeGap;
end;

Tja, egal wohin ich klicke, er läuft immer nach rechts(die Animation soll ja nach rechts laufen, aber der Sprite soll dahin laufen, wohin ich klicke...)

Info: Da ich mich ja mit Winkelfunktionen nicht auskenne, habe ich mir die Sinus Cosinus und ArcTangens dinger aus Demos rausgeschnappt....
Flo
Programmiere inzwischen hauptsächlich mit C++. Nicht böse werden
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 12:18
Delphi-Quellcode:
...
uses
  Math;
...
  SetDir(round(ArcTan2(P1.Y - P2.Y, P1.X - P2.X))));
...
Uwe Raabe
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 12:18
Einen Winkel zwischen 2 Punkten gibt es nicht. Was du hier meinst ist der Winkel einer Geraden gegeben durch 2 Punkte zu einer Koordinatenachse. Allerdings hat das ganze ein Problem: Der Winkel wird immer positiv und zwischen 0..PI/2 liegen, was heisst dass du quasi immer nur nach "oben rechts" guckst. Die Quadrantenbestimmung kann man zwar machen, ist aber wieder zusätzlicher Rechenaufwand.* Letztlich sind triginometrische Ansätze fast immer langsamer, ungenauer und "mehr Code" als die Alternative: Du ersparst ne Menge Ärger wenn du das Vektoriell an gehst.
*Edit: ATan2 macht diese Unterscheidung, dennoch bist du mit ein wenig Rumvektorn am Ende deutlich besser dran.

Sagen wir mal P0=(x0, y0) ist wo dein Sprite gerade ist, und P1=(x1, y1) ist der Punkt auf den geklickt wurde. Dann ist V'=(x1-x0, y1-y0) der Vektor der von P0 aus auf P1 zeigt. (P0+V'=P1)
Um von P0 aus nun schrittweise (also animiert) zu P1 zu gelangen, musst nun immer nur Bruchstücke von V' zu P0 addieren: P0+t*V'=P', wobei t|[0..1]. Bei t=0 ist P'=P0, und bei t=1 ist P'=P1.
"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
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 12:22
Also wenn deine Einheit bei X, Y ist, und an Position p2.X, p2,Y geklickt wurde ... geht dann nicht sowas:
Delphi-Quellcode:
p2.X := p2.X - X;
p2.Y := p2.Y - Y;

FXSpeed := p2.X / sqrt(p2.X * p2.X + p2.Y * p2.Y);
FYSpeed := p2.Y / sqrt(p2.X * p2.X + p2.Y * p2.Y);
Wozu die umrechnung in Polarkoordinaten, um die dann wieder in kartesische umzurechnen?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 12:49
"Winkel zwischen zwei Punkten" Den Unsinn habe ich doch jetzt neulich erst irgendwo gelesen. Ich glaube das war irgendwo im DF. Keine Ahnung, ob dir das hilft.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#6

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 12:54
Meinst du das da: http://www.delphi-forum.de/viewtopic.php?t=94070
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 13:04
Jupp, das wars. Waren doch keine zwei Punkte, sondern ein Kreis.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Vasco da Gama

Registriert seit: 2. Aug 2009
131 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 13:26
Zitat von jfheins:
Also wenn deine Einheit bei X, Y ist, und an Position p2.X, p2,Y geklickt wurde ... geht dann nicht sowas:
Delphi-Quellcode:
p2.X := p2.X - X;
p2.Y := p2.Y - Y;

FXSpeed := p2.X / sqrt(p2.X * p2.X + p2.Y * p2.Y);
FYSpeed := p2.Y / sqrt(p2.X * p2.X + p2.Y * p2.Y);
Wozu die umrechnung in Polarkoordinaten, um die dann wieder in kartesische umzurechnen?
Vielen Dank, mit dem Code klappts perfekt


Zitat von Luckie:
"Winkel zwischen zwei Punkten" Den Unsinn...
Tja, tut mir Leid, für den Unsinn aber ich wusste nicht wie ich es beschreiben sollte.

mfG
Flo
Programmiere inzwischen hauptsächlich mit C++. Nicht böse werden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Winkel zwischen zwei Punkten?!

  Alt 28. Aug 2009, 14:42
Zitat von Vasco da Gama:
Vielen Dank, mit dem Code klappts perfekt
Das ist übrigends fast das selbe, nur in Code gegossen, was ich beschrieben hab - nur damit du den Zusammenhang erkennst. Hier wird nu lediglich mein V' auf eine Länge von 1 skaliert (=normiert), wobei dann, um es mathematisch auszudrücken, in der Formel von oben P0+t*V'=P' das t im Intervall [0..dist(P0, P1)] statt [0..1] liegt.
Eine Richtung normiert anzugeben ist üblicher, soll die Richtung auch gleich noch die Geschwindigkeit enthalten ist dies die Länge dieses Vektors. Ich hatte imch oben für die ungewöhnlichere Variante entschieden, da t dann immer in 0..1 liegt, und man über die Schrittweite von t die Geschwindigkeit ohne viel Rechnerei nachträglich festlegen/variieren konnte, und vor allem nicht dank Rundungsfehlern evtl. P1 verfehlt. Aber dat sind nu schon Feiheiten =)
"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
Vasco da Gama

Registriert seit: 2. Aug 2009
131 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Winkel zwischen zwei Punkten?!

  Alt 3. Sep 2009, 11:51
Ok. jetzt hab ich eine weitere Frage, die durch das Bild im Anhang verdeutlicht werden sollte.

Dort, wo sich die Linien schneiden ist der Nullpunkt. dort ist der Punkt X
Jetzt will ich, jenachdem wo der zweite Punkt ist, etwas anderes machen. Je nachdem, welcher linie der Punkt am nächsten ist.
Kann man das lösen ? Bitte eine möglichts einfache Erklärung oder Code, damit ich es auch verstehe

mfG und ich hoffe ich nerve nicht zu sehr
VdG
Angehängte Grafiken
Dateityp: bmp winkel_boy_307.bmp (243,1 KB, 36x aufgerufen)
Flo
Programmiere inzwischen hauptsächlich mit C++. Nicht böse werden
  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:22 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