예제 #1
0
 public Vector GetNormal(PolylineData polyline, double cornerRadius = 0.0)
 {
     return(polyline.SmoothNormal(Index, Ratio, cornerRadius));
 }
예제 #2
0
        public static void PathMarch(PolylineData polyline, double startArcLength, double cornerThreshold,
                                     Func <MarchLocation, double> stopCallback)
        {
            if (polyline == null)
            {
                throw new ArgumentNullException(nameof(polyline));
            }
            var count = polyline.Count;

            if (count <= 1)
            {
                throw new ArgumentOutOfRangeException(nameof(polyline));
            }
            var flag   = false;
            var x      = startArcLength;
            var before = 0.0;
            var index  = 0;
            var num5   = Math.Cos(cornerThreshold * 3.1415926535897931 / 180.0);

            while (true)
            {
                var num6 = polyline.Lengths[index];
                if (!MathHelper.IsFiniteDouble(x))
                {
                    return;
                }
                if (MathHelper.IsVerySmall(x))
                {
                    x = stopCallback(MarchLocation.Create(MarchStopReason.CompleteStep, index, before,
                                                          num6 - before, x));
                    flag = true;
                }
                else if (MathHelper.GreaterThan(x, 0.0))
                {
                    if (MathHelper.LessThanOrClose(x + before, num6))
                    {
                        before += x;
                        x       = stopCallback(MarchLocation.Create(MarchStopReason.CompleteStep, index, before,
                                                                    num6 - before, 0.0));
                        flag = true;
                    }
                    else if (index < count - 2)
                    {
                        index++;
                        var num7 = num6 - before;
                        x     -= num7;
                        before = 0.0;
                        // ReSharper disable once CompareOfFloatsByEqualityOperator
                        if (flag && num5 != 1.0 && polyline.Angles[index] > num5)
                        {
                            num6 = polyline.Lengths[index];
                            x    = stopCallback(MarchLocation.Create(MarchStopReason.CornerPoint, index, before,
                                                                     num6 - before, x));
                        }
                    }
                    else
                    {
                        var num8 = num6 - before;
                        x     -= num8;
                        num6   = polyline.Lengths[index];
                        before = polyline.Lengths[index];
                        x      = stopCallback(MarchLocation.Create(MarchStopReason.CompletePolyline, index, before,
                                                                   num6 - before, x));
                        flag = true;
                    }
                }
                else if (MathHelper.LessThan(x, 0.0))
                {
                    if (MathHelper.GreaterThanOrClose(x + before, 0.0))
                    {
                        before += x;
                        x       = stopCallback(MarchLocation.Create(MarchStopReason.CompleteStep, index, before,
                                                                    num6 - before, 0.0));
                        flag = true;
                    }
                    else if (index > 0)
                    {
                        index--;
                        x     += before;
                        before = polyline.Lengths[index];
                        // ReSharper disable once CompareOfFloatsByEqualityOperator
                        if (flag && num5 != 1.0 && polyline.Angles[index + 1] > num5)
                        {
                            num6 = polyline.Lengths[index];
                            x    = stopCallback(MarchLocation.Create(MarchStopReason.CornerPoint, index, before,
                                                                     num6 - before, x));
                        }
                    }
                    else
                    {
                        x     += before;
                        num6   = polyline.Lengths[index];
                        before = 0.0;
                        x      = stopCallback(MarchLocation.Create(MarchStopReason.CompletePolyline, index, before,
                                                                   num6 - before, x));
                        flag = true;
                    }
                }
            }
        }