Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ist ein Punkt rechts oder links von einer Strecke!? (https://www.delphipraxis.net/51598-ist-ein-punkt-rechts-oder-links-von-einer-strecke.html)

StefanDP 15. Aug 2005 21:58


ist ein Punkt rechts oder links von einer Strecke!?
 
Hallo.

Ich habe 3 Punkte ABC

A wird mit C verbunden und es wird geschaut ob Punkt B relativ zu dieser Strecke AC links oder rechts ist.

Ich habe bereits eine Lösung für das Problem aber ich weiß nicht WARUM das so funktioniert.

Delphi-Quellcode:
function TKarte.BRechtsVonAC(A,B,C: TPoint): Boolean;
var
  x_ab, y_ab, x_ac, y_ac: Double;
begin
  x_ab := A.X - B.X; // Delta x von A nach B
  y_ab := A.Y - B.Y; // Delta y von A nach B
  x_ac := A.X - C.X; // Delta x von A nach C
  y_ac := A.Y - C.Y; // Delta y von A nach C

  result := (x_ab*y_ac - y_ab*x_ac ) >= 0;
  // Gibt TRUE zurück, wenn Pkt. B rechts im Bezug auf die Strecke AC ist
end;
Kann mir das mal jemand erklären, wär echt nett.

Jelly 15. Aug 2005 22:09

Re: ist ein Punkt rechts oder links von einer Strecke!?
 
Zuerst solltest du ma klären was links und rechts ist :gruebel:

Jelly 15. Aug 2005 23:09

Re: ist ein Punkt rechts oder links von einer Strecke!?
 
Was du in deiner Berechnung anwendest ist das Vektorprodukt. Das Vektorprodukt zwischen 2 vektoren ist wieder ein Vektor, der senkrecht zu den beiden vorigen steht. Die Frage ist nur, ob nach oben oder untern gerichtet.

Ich vereinfache die Rechnung mal ein bischen. Du hast die Punkte A, B, C. Ich lege A jetzt mal in den Ursprung, und hat somit die, geht leider nicht anders beim Vektorprodukt, die 3-dimensionalen Raumkoordinaten A(0,0,0).

Als Vektor c (klein geschrieben), sei nun der Vektor den du in der Zeichnungdargestellt hast, also von A nch C zeigend. Anlog definiere ich mir einen Vektor b von A nach b zeigend. Die Koordinaten von diesen beiden Vektoren sind nichts anderes als die in deiner Rechnung angegeben, x_ab, y_ab, x_ac und y_ab. Ich finde meins aber übersichlicher.

Wir haben nun also die beiden Vektoren c und b. Die Frage ist, wie sieht der Winkel zwischen c und b aus. Winkel werden immer im Gegenuhrzeigersinn betrachtet. Ist also der Winkel zwischen c und b (von Vektor c ausgehend) kleiner als 180°, so liegt B links von c, ansonsten b. Sieht schwierig aus, aber genau das Vektorprodukt gibt dir im Endeffekt diesen Sachverhalt an. Die z-Komponenten von Vektor c und b sind beide null. Die Vektoren liegen also beide in der gleichen Ebene. Das Vektorprodukt c kreuz b (c X b) gibt also einen Vektor an, der nur eine z-Komponente besitzt. diese ist nun positiv oder eben negativ. Hier mal die Komponentendarstellung des Vektorproduktes, wobei uns wirklich nur die z-Komponente interessiert:
(c X b)_x = c_y*b_z - b_y*c_z
(c X b)_y = c_z*b_x - b_z*c_x
(c X b)_z = c_x*b_y - b_x*c_y =: Z

Ist Z positiv, so ist c X b linksdrehend, d.h. B liegt links
Ist Z negativ, so ist c X b rechtsdrehend, d.h. B liegt rechts..

Die Bedingung ist also wieder die aus deiner Lösung.

Mach dich am besten mal mit dem Vektorprodukt genauer vertraut. Ist hier im forum so schwer genau zu erklären.

StefanDP 15. Aug 2005 23:25

Re: ist ein Punkt rechts oder links von einer Strecke!?
 
:thumb:

Vielen Dank für die echt gut Erklärung!
Hab mir das mit dem Vektorprodukt nochmal genau durch den Kopf gehen lassen! Es ist einfach genial. :???:

Ab und zu muss man halt die Lösung in einer höheren Dimension suchen :cheers:

Jelly 16. Aug 2005 00:25

Re: ist ein Punkt rechts oder links von einer Strecke!?
 
Zitat:

Zitat von StefanDP
Ab und zu muss man halt die Lösung in einer höheren Dimension suchen :cheers:

Bei 3 Dimensionen ist das ja noch lustig. Was darüber hinaus geht bedingt schon etliche Bierchen um da noch Vorstellungsvermögern zu erschaffen. In dem Sinne :cheers:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:00 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