public static bool SegmentTest(Vector a, Vector b, Vector c, Vector d) { double triaa = JMath.SignedTriangleArea(a, b, d); double triab = JMath.SignedTriangleArea(a, b, c); double triac = 0; double triad = 0; //notice here it is "<=" not "<" if (triaa * triab <= 0.0) { triac = JMath.SignedTriangleArea(c, d, a); triad = triac + triab - triaa; if (triac * triad <= 0.0) { return(true); } } if (triaa + triab + triac + triad == 0.0) { Vector ab = b - a; double abdab = Dot(ab, ab); Vector ac = c - a; double abdac = Dot(ab, ac); Vector ad = d - a; double abdad = Dot(ab, ad); double min = Math.Min(abdac, abdad); double max = Math.Max(abdac, abdad); return(min < abdab && max > 0); } return(false); }
public static bool PointInPolygon(Vertex[] vs, Vector pt, Vector infinity) { uint count = 0; uint i = 0; while (i < vs.Length - 1) { if (JMath.SegmentTest(pt, infinity, vs[i].Position, vs[i + 1].Position)) { ++count; } ++i; } if (JMath.SegmentTest(pt, infinity, vs[i].Position, vs[0].Position)) { ++count; } return((count & 1) == 1); }
public static double AngleDeg(Vector va, Vector vb) { return(JMath.AngleRad(va, vb) / Math.PI * 180.0); }
/* * a*b=|a|*|b|*cos angle * cos angle=a*b/(|a|*|b|) * angle = arccos (a*b/(|a|*|b|)) */ public static double AngleRad(Vector va, Vector vb) { return(Math.Acos(JMath.Dot(va, vb) / (va.Length + vb.Length))); }