![]() |
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:
Kann mir das mal jemand erklären, wär echt nett.
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; |
Re: ist ein Punkt rechts oder links von einer Strecke!?
Zuerst solltest du ma klären was links und rechts ist :gruebel:
|
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. |
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: |
Re: ist ein Punkt rechts oder links von einer Strecke!?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz