Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }
Exemple #3
0
 public static double AngleDeg(Vector va, Vector vb)
 {
     return(JMath.AngleRad(va, vb) / Math.PI * 180.0);
 }
Exemple #4
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)));
 }