Dann gilt für die Funktion:
private static bool isPointinTriangle(Point3D p, Point3D a, Point3D b, Point3D c)
{
double s = -(((b.X - a.X) * c.Y - a.Y * b.X + a.X * a.Y) * p.Z + ((a.X - b.X) * c.Z + (b.Z - a.Z) * c.X - a.X * b.Z + a.Z * b.X) * p.Y + ((a.Z - b.Z) * c.Y + a.Y * b.Z - a.Y * a.Z) * p.X + (a.Y * b.X - a.X * a.Y) * c.Z + (a.X * b.Z - a.Z * b.X) * c.Y + (a.Y * a.Z - a.Y * b.Z) * c.X) /
(((b.X - a.X) * b.Y - a.Y * b.X + a.X * a.Y) * c.Z + ((a.Y - b.Y) * b.Z + a.Z * b.Y - a.Y * a.Z) * c.X + (a.X * b.Y - a.X * a.Y) * b.Z - a.Z * b.X * b.Y + a.Y * a.Z * b.X);
double t = (-((b.X - a.X) * s - p.X + a.X) / (c.X - a.X));
return ((0 < s) && (s <= 1) && (0 < t) && (t <= 1) && (0 < (s + t)) && ((s + t) <= 1));
}
Soweit zur Theorie. Getestet wird momentan mit folgendem Aufruf:
Point3D a = new Point3D(-1, 1, 1);
Point3D b = new Point3D(1, 1, 1);
Point3D c = new Point3D(1, 1, -1);
isPointinTriangle(new Point3D(0.25, 1, 0.25), a, b, c);
Problem an der ganzen Sache ist, dass mein s bei dieser Konstellation leider immer außerhalb des Wertebereichs ist (NaN).
Deswegen meine Frage: Kann jemand den Algorithmus nachvollziehen und mir sagen, wo mein (Denk-/Tipp-) Fehler liegt?
Memo@Mods:
Links zu lang -> Überschreitet immer 10.000 Zeichen, folglich 3 Posts.