Autor Beitrag
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 08.09.09 18:15 
Ich will berechnen ob ein Punkt in der Ebene in einem Dreieck liegt
dafür habe ich diese Methodegefunden:
Zitat:
1) Man verschiebt das Koordinatensystem so, daß ein Punkt des Dreiecks im Ursprung zu liegen kommt. Sei dieser Punkt ohne Beschränkung der Allgemeingültigkeit der Punkt A. Die anderen Punkte haben dann die neuen Koordinaten: B(x2-x1, y2-y1); C(x3-x1, y3-y1); P(x-x1, y-y1).

2) Wenn das Dreieck ein echtes Dreieck ist (s. o.), so sind die Vektoren OB und OC linear unabhängig voneinander. ("O" steht für den Ursprungspunkt). D. h. man kann sie in einer weiteren Transformation des Koordinatensystems als Basisvektoren wählen. Die Punkte haben dann die Koordinaten: B(1,0); C(0,1); P(p,q), wobei sich p und q aus der Lösung des folgenden Gleichungssystems ergeben:
(x2-x1) * p + (x3-x1) * q = x-x1
(y2-y1) * p + (y3-y1) * q = y-y1

3) An Hand einer Skizze des Dreiecks in dem zuletzt konstruierten Koordinatensystem sieht man, daß folgende Bedingung gilt dafür, daß der Punkt P(p,q) innerhalb des Dreiecks bzw. auf dessen Rand liegt:
0 <= p, q <= 1 und p+q <= 1

So weit so gut:
Hier mein Code dafür
(alle Punkte sind schon um cX1/cY1 reduziert; lX1/lY1 ist der punkt)
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
          q:=(lX2*cY2-lY2*cX2)/(cX3*cY2-cX2*cY3);
          if(q<=1then begin
            p:=lX2/cX2-cX3/cX2*q;
            p2In:=(p>=0and (p+q<=1);
          end else p2In:=false;


Problem dabei: es stimmt nicht
mein p und q entspricht zwar der gleichung 2) aber es ergibt wahr, für einen eindeutig außerhalb liegenden Punkt

darum meine Frage: wie funktioniert das ganze?
die verschiebung in den ursprung ist noch klar. da passiert effektiv nichts wirklich relevantes außer vereinfachung des rechenweges
Ich hätte gedacht, dass nun P durch die Seiten des Dreieckes, die vom Ursprung ausgehen, ausgedrückt wird.
jetzt müsste also p und q und deren summe zwischen 0 und 1 (inkl 0 und 1) sein, damit der punkt im dreieck liegt
warum wird jedoch ein negatives q zugelassen?
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 08.09.09 18:25 
ich hab die Methoden nich wirklich verstanden, vllt war es ein zu kurzer ausschnitt, aber ich würde:

a. drei Geraden aufstellen, die jeweils durch zwei der Punkte gehen
b. prüfen, ob der zu prüfende Punkte auf der richtigen Seite der Gerade liegt
c. wenn er bei allen drei Geraden auf der richtigen seite liegt, dann ist er im Dreieck....

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Flamefire Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: Di 08.09.09 18:43 
"richtige seite der geraden"...
etwas schlecht definierbar ;-)

der ausschnitt ist komplett

kanns ja mal versuchen so zu erklären, wie ich es verstanden habe:
Dreieck aus 3 Punkten (A,B,C) und ein Punkt P

1) Das Koordinatensystem auf A legen-->das ist das neue 0|0 und A braucht nicht weiter mit in die Rechnung einzugehen
2) fasse die Strecken AB und AC als vektoren auf und drücke den Punkt P als LinearKombination dieser aus. die Linear faktoren sind p und q
P ist demzufolge P=p*AB+q*AC
3) jetzt prüfe, ob die Linearfaktoren nicht so sind, dass P nicht im dreieck liegt

Bsp: (jetzt meine deutung)
p oder q ist negativ-->punkt liegt auf der "falschen seite" min. einer der strecken AB, AC
p und q zusammen nicht =1-->punkt liegt außerhalb der strecke BC

mit einer prüfung, ob beide positiv sind, funktioniert es anscheinend
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 08.09.09 18:56 
Jupp, p und q müssen natürlich beide \in [0;1] sein.
Siehe auch hier, zusätzlich noch ein zweiter Lösungsweg: www.blackpawn.com/te...inpoly/default.html.

_________________
>λ=
der organist
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 467
Erhaltene Danke: 17

WIN 7
NQC, Basic, Delphi 2010
BeitragVerfasst: Di 08.09.09 18:57 
naja, bei den Vektoren sind wir noch nich, aber bis zu dem Produkt hab ich das immerhin so verstanden.

Ob ein Punkt auf der richtigen seite der gerade liegt, lässt sich durch eine Ungleichung herausfinden.

g(x)=10x+5
P(40|3)
und P soll auf der unten/rechten seite liegen, also:

f(40)>3
405>3, lässt sich einfach machen..

_________________
»Gedanken sind mächtiger als Waffen. Wir erlauben es unseren Bürgern nicht, Waffen zu führen - warum sollten wir es ihnen erlauben, selbständig zu denken?« Josef Stalin
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 08.09.09 20:59 
user profile iconder organist hat folgendes geschrieben Zum zitierten Posting springen:
naja, bei den Vektoren sind wir noch nich, [...]
Sobald aber auch senkrechte Strecken auftauchen können, macht eine Geradendarstellung über lineare Funktionen einfach keinen Sinn mehr, sorry ;) .

Auch wenn es hier keine Rolle spielt, lasse ich es mal nicht unbeantwortet:
Ein Punkt P befindet sich "links" von einer Geraden a+t*b (in positiver t-Richtung), wenn das Skalarprodukt von (OP-a) und (b um 90° gedreht) größer 0 ist. Verläuft das Dreieck gegen den Uhrzeigersinn, muss die Bedingung also für alle drei Seiten erfüllt sein.

_________________
>λ=