public Curve GetOutlineAroundPoint(Vector point) { var usedNotReversed = new bool[this.Count]; var usedReversed = new bool[this.Count]; var excludeNotReversed = new bool[this.Count]; var excludeReversed = new bool[this.Count]; IList <int> path, pathReversed; Curve outline, outlineReversed; var closestPoint = (Vector)null; var curveIndex = ClosestCurveIndex(point, out closestPoint, usedReversed, excludeReversed); GetOutlineCandidates(curveIndex, out path, out pathReversed, out outline, out outlineReversed, ref usedNotReversed, ref usedReversed, ref excludeNotReversed, ref excludeReversed); if (outline != null && CurveTools.IsPointInPolygon(outline, point)) { return(outline); } else if (outlineReversed != null && CurveTools.IsPointInPolygon(outlineReversed, point)) { return(outlineReversed); } else { return(null); } }
public Curve GetOutline(int initialCurveIndex, out IList <int> path, ref bool[] used, ref bool[] exclude) { if (initialCurveIndex == -1) { path = null; return(null); } var usedNotReversed = (bool[])used.Clone(); var usedReversed = (bool[])used.Clone(); var excludeNotReversed = (bool[])exclude.Clone(); var excludeReversed = (bool[])exclude.Clone(); IList <int> pathNotReversed, pathReversed; Curve outline, outlineReversed; GetOutlineCandidates(initialCurveIndex, out pathNotReversed, out pathReversed, out outline, out outlineReversed, ref usedNotReversed, ref usedReversed, ref excludeNotReversed, ref excludeReversed); bool preferNotReversed = outline != null; bool preferReversed = outlineReversed != null; if (outline != null && outlineReversed != null) { var outlineBounds = Bounds.FromVectors(outline); var outlineReversedBounds = Bounds.FromVectors(outlineReversed); if (outlineBounds != outlineReversedBounds) { preferNotReversed = outlineBounds.IsOutsideOf(outlineReversedBounds); preferReversed = outlineReversedBounds.IsOutsideOf(outlineBounds); } else { preferNotReversed = CurveTools.PolygonArea(outline) >= CurveTools.PolygonArea(outlineReversed); preferReversed = !preferNotReversed; } } if (preferNotReversed) { path = pathNotReversed; for (int i = 0; i < this.Count; i++) { exclude[i] |= excludeNotReversed[i]; } for (int i = 0; i < this.Count; i++) { used[i] |= usedNotReversed[i]; } return(outline); } else if (preferReversed) { path = pathReversed; for (int i = 0; i < this.Count; i++) { exclude[i] |= excludeReversed[i]; } for (int i = 0; i < this.Count; i++) { used[i] |= usedReversed[i]; } return(outlineReversed); } else { for (int i = 0; i < this.Count; i++) { exclude[i] |= excludeNotReversed[i] | excludeReversed[i]; } for (int i = 0; i < this.Count; i++) { used[i] |= usedNotReversed[i] | usedReversed[i]; } path = null; return(null); } }