private ConnectionEdge FindLargest(Polygon testHole) { Rational maximum = 0; ConnectionEdge maxEdge = null; Vector3m v0 = testHole.Start.Origin; Vector3m v1 = testHole.Start.Next.Origin; foreach (var connectionEdge in testHole.GetPolygonCirculator()) { // we take the first two points as a reference line if (Misc.GetOrientation(v0, v1, connectionEdge.Origin, Normal) < 0) { var r = Misc.PointLineDistance(v0, v1, connectionEdge.Origin); if (r > maximum) { maximum = r; maxEdge = connectionEdge; } } } if (maxEdge == null) { return(testHole.Start); } return(maxEdge); }
public static bool PointInOrOnTriangle(Vector3m prevPoint, Vector3m curPoint, Vector3m nextPoint, Vector3m nonConvexPoint, Vector3m normal) { var res0 = Misc.GetOrientation(prevPoint, nonConvexPoint, curPoint, normal); var res1 = Misc.GetOrientation(curPoint, nonConvexPoint, nextPoint, normal); var res2 = Misc.GetOrientation(nextPoint, nonConvexPoint, prevPoint, normal); return(res0 != 1 && res1 != 1 && res2 != 1); }
private bool PointsOnLine(Polygon pointList) { foreach (var connectionEdge in pointList.GetPolygonCirculator()) { if (Misc.GetOrientation(connectionEdge.Prev.Origin, connectionEdge.Origin, connectionEdge.Next.Origin, Normal) != 0) { return(false); } } return(true); }
private List <ConnectionEdge> FindNonConvexPoints(Polygon p) { List <ConnectionEdge> resultList = new List <ConnectionEdge>(); foreach (var connectionEdge in p.GetPolygonCirculator()) { if (Misc.GetOrientation(connectionEdge.Prev.Origin, connectionEdge.Origin, connectionEdge.Next.Origin, Normal) != 1) { resultList.Add(connectionEdge); } } return(resultList); }
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)); }
private Candidate FindPointI(ConnectionEdge M, List <Polygon> polygons, int holeIndex, Vector3m direction) { Candidate candidate = new Candidate(); for (int i = 0; i < polygons.Count; i++) { if (i == holeIndex) // Don't test the hole with itself { continue; } foreach (var connectionEdge in polygons[i].GetPolygonCirculator()) { Rational rayDistanceSquared; Vector3m intersectionPoint; if (RaySegmentIntersection(out intersectionPoint, out rayDistanceSquared, M.Origin, direction, connectionEdge.Origin, connectionEdge.Next.Origin, direction)) { if (rayDistanceSquared == candidate.currentDistance) // if this is an M/I edge, then both edge and his twin have the same distance; we take the edge where the point is on the left side { if (Misc.GetOrientation(connectionEdge.Origin, connectionEdge.Next.Origin, M.Origin, Normal) == 1) { candidate.currentDistance = rayDistanceSquared; candidate.Origin = connectionEdge; candidate.PolyIndex = i; candidate.I = intersectionPoint; } } else if (rayDistanceSquared < candidate.currentDistance) { candidate.currentDistance = rayDistanceSquared; candidate.Origin = connectionEdge; candidate.PolyIndex = i; candidate.I = intersectionPoint; } } } } return(candidate); }
private bool IsConvex(ConnectionEdge curPoint) { int orientation = Misc.GetOrientation(curPoint.Prev.Origin, curPoint.Origin, curPoint.Next.Origin, Normal); return(orientation == 1); }