private static LinkedListNode <EarPoint> GetClosest(List <LinkedListNode <EarPoint> > pointsOrdered, int index, EarPolygon poly, LinkedListNode <EarPoint> innerPoint, EarPolygon polychild) { LinkedListNode <EarPoint> a = innerPoint; LinkedListNode <EarPoint> b = pointsOrdered[index]; LinkedListNode <EarPoint> c = poly.Get(); bool intersection = false; do { intersection = DoIntersect(a.Value, b.Value, c.Value, poly.Next(c).Value); c = c.Next; } while ((!intersection) && (c != null)); if (!intersection) { c = a; do { intersection = DoIntersect(a.Value, b.Value, c.Value, polychild.Next(c).Value); c = polychild.Next(c); } while ((!intersection) && (c.Value != a.Value)); if (!intersection) { return(b); } } return(GetClosest(pointsOrdered, index + 1, poly, innerPoint, polychild)); }
private static bool RecordEars(EarPolygon poly) { LinkedListNode <EarPoint> active = poly.Get(); while (poly.NumPoints() >= 3) { int idx = active.Value.mIndex; do { if (IsConvex(active, poly)) { if (IsEar(active, poly)) { break; } } active = poly.Next(active); } while (idx != active.Value.mIndex); poly.AddResult(poly.Previous(active).Value[0], poly.Previous(active).Value[1], active.Value[0], active.Value[1], poly.Next(active).Value[0], poly.Next(active).Value[1]); active = poly.Next(active); poly.Remove(poly.Previous(active)); continue; } return(true); }
private static bool IsEar(LinkedListNode <EarPoint> ele, EarPolygon poly) { LinkedListNode <EarPoint> checkerN1 = poly.Next(ele); LinkedListNode <EarPoint> checker = poly.Next(checkerN1); while (checker.Value.mIndex != poly.Previous(ele).Value.mIndex) { if (InTriangle(checker.Value, ele.Value, poly.Next(ele).Value, poly.Previous(ele).Value)) { return(false); } checker = poly.Next(checker); } return(true); }
private static bool IsConvex(LinkedListNode <EarPoint> ele, EarPolygon poly) { LinkedListNode <EarPoint> a = poly.Previous(ele); LinkedListNode <EarPoint> b = ele; LinkedListNode <EarPoint> c = poly.Next(ele); return(GeoPolygonUtils.IsConvex(a.Value.mPoint, b.Value.mPoint, c.Value.mPoint)); }