Beispiel #1
0
 private bool IsPointInTriangle(Vector3m prevPoint, Vector3m curPoint, Vector3m nextPoint, List <ConnectionEdge> nonConvexPoints)
 {
     foreach (var nonConvexPoint in nonConvexPoints)
     {
         if (nonConvexPoint.Origin == prevPoint || nonConvexPoint.Origin == curPoint || nonConvexPoint.Origin == nextPoint)
         {
             continue;
         }
         if (Misc.PointInOrOnTriangle(prevPoint, curPoint, nextPoint, nonConvexPoint.Origin, Normal))
         {
             return(true);
         }
     }
     return(false);
 }
Beispiel #2
0
        private ConnectionEdge FindVisiblePoint(Candidate I, List <Polygon> polygons, ConnectionEdge M, Vector3m direction)
        {
            ConnectionEdge P = null;

            if (I.Origin.Origin.X > I.Origin.Next.Origin.X)
            {
                P = I.Origin;
            }
            else
            {
                P = I.Origin.Next;
            }

            List <ConnectionEdge> nonConvexPoints = FindNonConvexPoints(polygons[I.PolyIndex]);


            nonConvexPoints.Remove(P);

            var m = M.Origin;
            var i = I.I;
            var p = P.Origin;
            List <ConnectionEdge> candidates = new List <ConnectionEdge>();

            // invert i and p if triangle is oriented CW
            if (Misc.GetOrientation(m, i, p, Normal) == -1)
            {
                var tmp = i;
                i = p;
                p = tmp;
            }

            foreach (var nonConvexPoint in nonConvexPoints)
            {
                if (Misc.PointInOrOnTriangle(m, i, p, nonConvexPoint.Origin, Normal))
                {
                    candidates.Add(nonConvexPoint);
                }
            }
            if (candidates.Count == 0)
            {
                return(P);
            }
            return(FindMinimumAngle(candidates, m, direction));
        }