FarseerPhysics.Common.Decomposition.CDT.TriangulationUtil.SmartIncircle C# (CSharp) Method

SmartIncircle() public static method

Requirements: 1. a,b and c form a triangle. 2. a and d is know to be on opposite side of bc a + / \ / \ b/ \c +-------+ / B \ / \ Facts: d has to be in area B to have a chance to be inside the circle formed by a,b and c d is outside B if orient2d(a,b,d) or orient2d(c,a,d) is CW This preknowledge gives us a way to optimize the incircle test
public static SmartIncircle ( TriangulationPoint pa, TriangulationPoint pb, TriangulationPoint pc, TriangulationPoint pd ) : bool
pa TriangulationPoint triangle point, opposite d
pb TriangulationPoint triangle point
pc TriangulationPoint triangle point
pd TriangulationPoint point opposite a
return bool
        public static bool SmartIncircle(TriangulationPoint pa, TriangulationPoint pb, TriangulationPoint pc,
            TriangulationPoint pd)
        {
            double pdx = pd.X;
            double pdy = pd.Y;
            double adx = pa.X - pdx;
            double ady = pa.Y - pdy;
            double bdx = pb.X - pdx;
            double bdy = pb.Y - pdy;

            double adxbdy = adx * bdy;
            double bdxady = bdx * ady;
            double oabd = adxbdy - bdxady;
            //        oabd = orient2d(pa,pb,pd);
            if (oabd <= 0) return false;

            double cdx = pc.X - pdx;
            double cdy = pc.Y - pdy;

            double cdxady = cdx * ady;
            double adxcdy = adx * cdy;
            double ocad = cdxady - adxcdy;
            //      ocad = orient2d(pc,pa,pd);
            if (ocad <= 0) return false;

            double bdxcdy = bdx * cdy;
            double cdxbdy = cdx * bdy;

            double alift = adx * adx + ady * ady;
            double blift = bdx * bdx + bdy * bdy;
            double clift = cdx * cdx + cdy * cdy;

            double det = alift * (bdxcdy - cdxbdy) + blift * ocad + clift * oabd;

            return det > 0;
        }