Überprüfung ob Punkt im Dreieck liegt

Hi Leute,

ich muß überprüfen, ob ein punkt in einem dreieck liegt, für punkt und dreieck habe ich nur kartesische koordinaten (2D).
Habe folgende routine geschrieben, die lustige sachen macht, aber nich ganz was sie soll. Finde den fehler nicht, ich hoffe ihr könnt mir weiterhelfen:

// Koordinaten des Dreiecks
ex1=1;
ez1=1;

ex2=4;
ez2=2;

ex3=5;
ez3=5;

// Koordinaten des Punktes
px=4.5;
pz=4.9;

//richtungsvektor OB des dreiecks
obx=ex2-ex1;
obz=ez2-ez1;

// richtungsvektor OC des dreiecks
ocx=ex3-ex1;
ocz=ez3-ez1;

//Vektor Punkt -> Dreieck
opx=px-ex1;
opz=pz-ez1;

//in 2 schritten da so lange formel…
q=((opz*obz*opx)/ocz)-((obx*opx*opz)/ocx);
q=q/((obz*opx)-(obx*opz));

p = (px+(-ex1)+(-q*ocx))/obx;

// p und q ausgeben
info("p „+p+“ q "+q);

if((p >= 0) && (p = 0) && (q = 0) && (p+q

ich muß überprüfen, ob ein punkt in einem dreieck liegt,

Wenn ich das so ausführe, stimmt der wert px in der probe
exakt, aber pz ist ca. 4,38… statt 4,9

Hallo occide.

bei langen Formeln kann es schnell zu Rundungsfehlern kommen.
Folgender Programmcode illustriert das Ganze:

double d=0;
for(int i=0;i

Hallo!

bei langen Formeln kann es schnell zu Rundungsfehlern kommen.
Folgender Programmcode illustriert das Ganze:

Das kommst gar nicht in Betracht. Bei Deinem Beispiel hast Du eine prozentuale Abweichung von sowas wie 0.000000001%, aber nicht gut 10%, wie hier.
Da ist irgendwo ein echter Fehler. Wenn man z.B. ex1 ändert, ändert sich px nicht, darf ja auch nicht, aber wenn man ey1 ändert, ändert sich auch py. Da hat sich irgendeine unzulässige Abhängigkeit beim Umformen eingeschlichen. Die Methode über Koordinatentransformation und Lösung der sich ergebenen Gleichungssysteme ist ansich schon eine sehr gänge.

Jan

Hey,

das denke ich auch. nur deinen letzten satz habe ich irgendwie nicht verstanden…

grüße

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo

Die Methode über Koordinatentransformation und Lösung der sich
ergebenen Gleichungssysteme ist an sich schon eine sehr gängige.

das denke ich auch. nur deinen letzten Satz habe ich irgendwie
nicht verstanden…

Ich denke, ‚Hannoveraner‘ hat versucht, Deinen
verwendeten Algorithmus zu erraten. Mich würde
auch mal interessieren, wie das eigentlich gegen
soll. Irgendwas fehlt in dem Algorithmus (den ich
nicht richtig einordnen kann). Wo hast Du den denn
her?

Grüße

CMБ

Hallo occide,

ich hab mal was aus meinem „Quelltextfundus“
zusammengeschustert, um zu berechnen, ob
ein Punkt im Dreieck liegt. Methode 1) über
Vekktoroperationen, um festzustellen, ob der
Punkt jeweils auf der „selben Seite“ liegt wie
der „gegenüberliegende Punkt“ des Dreiecks
(bezüglich der zwei anderen Punkte); Methode 2)
über die Winkelsumme (~360° +/- Epsilon).
Die Methode 3) ist Deine Variante, auf die
Umgebung adaptiert:

#include 
#include 

 #define PI 3.1415926535897932384626433832795

// Strukturen und Hilfsfunktionen 
 struct vec2 {
 double x, y; 
 vec2() { x=y=0; } 
 vec2(double a, double b) { x=a, y=b; };
 };

 double vlen(const vec2& v) { return sqrt( v.x\*v.x + v.y\*v.y ); }
 double dot2(const vec2& a, const vec2& b) { return a.x\*b.x + a.y\*b.y; }
 double cross2(const vec2& a, const vec2& b) { return a.x\*b.y - a.y\*b.x; }
 vec2 operator-(const vec2& a, const vec2& b) { return vec2(a.x-b.x, a.y-b.y); }

 vec2 norm(const vec2& v) 
{ 
 double l = vlen(v); 
 l = (l = 0 ? true : false;
}

 bool PointInTriangle\_Vec(vec2 p, vec2 t[])
{
 return sameorient(p, t[0], t[1], t[2]) 
 && sameorient(p, t[1], t[0], t[2]) 
 && sameorient(p, t[2], t[0], t[1]) ? true : false;
}

 bool PointInTriangle\_Trig(vec2 p, vec2 t[])
{
 #define EPS 1.E-2
 vec2 v1 = norm( p - t[0] );
 vec2 v2 = norm( p - t[1] );
 vec2 v3 = norm( p - t[2] );
 double angsum = acos(dot2(v1,v2)) + acos(dot2(v2,v3)) + acos(dot2(v3,v1));
 return fabs( angsum - 2.0\*PI ) Dreieck
 double opx = p0.x - t[0].x;
 double opz = p0.y - t[0].y;
 //in 2 schritten da so lange formel...
 double q = ((opz\*obz\*opx) / ocz) - ((obx\*opx\*opz) / ocx);
 q /= (obz\*opx) - (obx\*opz);
 double p = ( p0.x + (-t[0].x) + (-q\*ocx) ) / obx;
 // p und q ausgeben
 printf("p: %f q: %f\n", p, q);
 if( (p \>= 0) && (p = 0) && (q = 0) && (p+q 

Grüße

CMБ

Hallo!

Sorry, den Thread hatte ich gar nicht mehr auf dem Schirm.

Ich denke, ‚Hannoveraner‘ hat versucht, Deinen
verwendeten Algorithmus zu erraten. Mich würde

Unter wird das z.B. erklärt (die 3 letzten Absätze):
http://www.zum.de/Foren/mathematik/archiv/a24.html

Da sind dann zwei Gleichungen mit zwei Unbekannten, die man dann nur richtig nach p und q auflösen muss, und da wird was nicht richtig sein.

Jan

Richtig das sind sie. glaube auch dass ich da beim umformen irgendwo n fehler gemacht hab.
aber die funktionen, die thorsten bereit gestellt hat, tun ihren dienst astrein. vielen dank an der stelle. werde jetzt mal versuchen, ob ich die funktionen in LSCRIPT gebacken krieg, sollte aber kein problem mehr sein.
Danke für eure antworten,

gruß occide.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

ohne das alles zu verstehen,

//in 2 schritten da so lange formel…
q=((opz*obz*opx)/ocz)-((obx*opx*opz)/ocx);
q=q/((obz*opx)-(obx*opz));

Was bedeutet da die letzte Zeile? Da kürzt sich q doch raus.

Cheers, Felix

Hallo!

//in 2 schritten da so lange formel…
q=((opz*obz*opx)/ocz)-((obx*opx*opz)/ocx);
q=q/((obz*opx)-(obx*opz));

Was bedeutet da die letzte Zeile? Da kürzt sich q doch raus.

Das ist Programmcode, keine Formel. Das ‚=‘ ist ein sog. Zuweisungsoperator, kein Gleichheitszeichen. Das zweite q in der letzten Zeile enthält das (Zwischen-)Ergebnis aus der davor (siehe Kommentar).

Jan