Example #1
0
        /// <summary>
        ///     Offset the source polyline to specified side(s).
        /// </summary>
        /// <param name="source">The polyline to be offseted.</param>
        /// <param name="offsetDist">The offset distance.</param>
        /// <param name="side">The offset side(s).</param>
        /// <returns>A polyline sequence resulting from the offset of the source polyline.</returns>
        public static IEnumerable <Polyline> Offset(this Polyline source, double offsetDist, OffsetSide side)
        {
            side = OffsetSide.Out;

            offsetDist = Math.Abs(offsetDist);
            using (var plines = new DisposableSet <Polyline>())
            {
                var offsetRight = source.GetOffsetCurves(offsetDist).Cast <Polyline>();
                plines.AddRange(offsetRight);
                var offsetLeft = source.GetOffsetCurves(-offsetDist).Cast <Polyline>();
                plines.AddRange(offsetLeft);
                var areaRight = offsetRight.Select(pline => pline.Area).Sum();
                var areaLeft  = offsetLeft.Select(pline => pline.Area).Sum();
                switch (side)
                {
                case OffsetSide.In:
                    return(plines.RemoveRange(
                               areaRight < areaLeft ? offsetRight : offsetLeft));

                case OffsetSide.Out:
                    return(plines.RemoveRange(
                               areaRight < areaLeft ? offsetLeft : offsetRight));

                case OffsetSide.Left:
                    return(plines.RemoveRange(offsetLeft));

                case OffsetSide.Right:
                    return(plines.RemoveRange(offsetRight));

                case OffsetSide.Both:
                    plines.Clear();
                    return(offsetRight.Concat(offsetLeft));

                default:
                    return(null);
                }
            }
        }
Example #2
0
        public static IEnumerable <Polyline> Offset([NotNull] this Polyline source, double offsetDist, OffsetSide side)
        {
            offsetDist = Math.Abs(offsetDist);
            var offsetRight = source.GetOffsetCurves(offsetDist).Cast <Polyline>().ToList();
            var areaRight   = offsetRight.Select(pline => pline.Area).Sum();
            var offsetLeft  = source.GetOffsetCurves(-offsetDist).Cast <Polyline>().ToList();
            var areaLeft    = offsetLeft.Select(pline => pline.Area).Sum();

            switch (side)
            {
            case OffsetSide.In:
                if (areaRight < areaLeft)
                {
                    offsetLeft.Dispose();
                    return(offsetRight);
                }
                else
                {
                    offsetRight.Dispose();
                    return(offsetLeft);
                }

            case OffsetSide.Out:
                if (areaRight < areaLeft)
                {
                    offsetRight.Dispose();
                    return(offsetLeft);
                }
                else
                {
                    offsetLeft.Dispose();
                    return(offsetRight);
                }

            case OffsetSide.Left:
                offsetRight.Dispose();
                return(offsetLeft);

            case OffsetSide.Right:
                offsetLeft.Dispose();
                return(offsetRight);

            case OffsetSide.Both:
                return(offsetRight.Concat(offsetLeft));

            default:
                return(null);
            }
        }
Example #3
0
 /// <summary>
 /// Offset the source polyline to specified side(s).
 /// </summary>
 /// <param name="source">The polyline to be offseted.</param>
 /// <param name="offsetDist">The offset distance.</param>
 /// <param name="side">The offset side(s).</param>
 /// <returns>A polyline sequence resulting from the offset of the source polyline.</returns>
 public static IEnumerable<Polyline> Offset(this Polyline source, double offsetDist, OffsetSide side)
 {
     offsetDist = Math.Abs(offsetDist);
     IEnumerable<Polyline> offsetRight = source.GetOffsetCurves(offsetDist).Cast<Polyline>();
     double areaRight = offsetRight.Select(pline => pline.Area).Sum();
     IEnumerable<Polyline> offsetLeft = source.GetOffsetCurves(-offsetDist).Cast<Polyline>();
     double areaLeft = offsetLeft.Select(pline => pline.Area).Sum();
     switch (side)
     {
         case OffsetSide.In:
             if (areaRight < areaLeft)
             {
                 offsetLeft.Dispose();
                 return offsetRight;
             }
             else
             {
                 offsetRight.Dispose();
                 return offsetLeft;
             }
         case OffsetSide.Out:
             if (areaRight < areaLeft)
             {
                 offsetRight.Dispose();
                 return offsetLeft;
             }
             else
             {
                 offsetLeft.Dispose();
                 return offsetRight;
             }
         case OffsetSide.Left:
             offsetRight.Dispose();
             return offsetLeft;
         case OffsetSide.Right:
             offsetLeft.Dispose();
             return offsetRight;
         case OffsetSide.Both:
             return offsetRight.Concat(offsetLeft);
         default:
             return null;
     }
 }