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); }
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)); }