Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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);
            }
        }