Пример #1
0
        private void PlotCurveManeuver(List <GPoint> points, double curveLength, int degree)
        {
            if (points.Count < 2)
            {
                return;
            }

            double        scale      = (CurvatureUnit == CurvatureUnit.Centimeter) ? 0.01 : 1.0; // 1/cm or 1/m
            List <GPoint> curvatures = new List <GPoint>();
            NURBSCurve    bspline    = new NURBSCurve(points, degree);

            for (double u = 0.01; u < 1.0 - 0.01; u += 0.01)
            {
                double curvature         = bspline.Curvature(u);
                double distanceFromStart = curveLength * u;
                curvatures.Add(new GPoint(u * 100.0, curvature * scale, weight: distanceFromStart));
            }

            List <GPoint> simplified        = SimplifyPolyline(curvatures, CurveManeuverParameter.CurveMinDistance);
            List <GPoint> curvaturManeuvers = PolylineSimplication.SimplifyHeadingChange(simplified.ToArray(), CurveManeuverParameter.YTolerance);

            List <GPoint> maneuvers = new List <GPoint>();

            foreach (var p in curvaturManeuvers)
            {
                int index = Weight2Index(p, curveLength, points.Count);
                maneuvers.Add(points[index]);
            }

            AddScatterSeries(maneuvers, "Maneuvers");
        }
Пример #2
0
        private void PlotSimplifyCurvature(List <GPoint> curvatures)
        {
            OxyPlot.Series.LineSeries ls = new OxyPlot.Series.LineSeries()
            {
                Title        = "Direct Simplication",
                MarkerType   = ShowMarker ? MarkerType.None : MarkerType.Diamond,
                MarkerStroke = OxyPlot.OxyColors.Pink
            };
            List <GPoint> simplified1 = SimplifyPolyline(curvatures, 0);

            foreach (var p in simplified1)
            {
                ls.Points.Add(new OxyPlot.DataPoint(p.X, p.Y));
            }

            base.Series.Add(ls);

            // Plot maneuvers
            curvatures.ForEach(x => x.W = x.X); // X is distance
            List <GPoint> simplified2 = SimplifyPolyline(curvatures, CurveManeuverParameter.CurveMinDistance);
            List <GPoint> maneuvers   = PolylineSimplication.SimplifyHeadingChange(simplified2.ToArray(), CurveManeuverParameter.YTolerance);

            AddScatterSeries(maneuvers, "Maneuvers");
            PlotSameRanges(maneuvers);
        }
Пример #3
0
        public void PolylineSimplication_thinout2HalfTest()
        {
            // Given
            int           TOTAL      = 10;
            List <GPoint> origPoints = new List <GPoint>(TOTAL);

            for (int i = 0; i < TOTAL; i++)
            {
                origPoints.Add(new GPoint(i));
            }

            // When
            int           maxPoints = TOTAL / 2;
            List <GPoint> newPoints = PolylineSimplication.SimplifyPointsN(origPoints.ToArray(), maxPoints);

            // Then
            Assert.IsTrue(Math.Abs(maxPoints - newPoints.Count) < 2);
            Assert.AreEqual(0, newPoints[0].X);
            Assert.AreEqual(9, newPoints.Last().X);

            Assert.AreEqual(2, newPoints[1].X);
            Assert.AreEqual(4, newPoints[2].X);
            Assert.AreEqual(6, newPoints[3].X);
            Assert.AreEqual(8, newPoints[4].X);
        }
Пример #4
0
        private void PlotManeuverOnCurvatureCurve(List <GPoint> curvatures)
        {
            List <GPoint> simplified = SimplifyPolyline(curvatures, CurveManeuverParameter.CurveMinDistance);
            List <GPoint> maneuvers  = PolylineSimplication.SimplifyHeadingChange(simplified.ToArray(), CurveManeuverParameter.YTolerance);

            AddScatterSeries(maneuvers, "Maneuvers");
            PlotSameRanges(maneuvers);
        }
        public void TestDouglasPeuckerN_Total5()
        {
            // Given

            // When
            List <GPoint> newPoints = PolylineSimplication.SimplifyByDouglasPeuckerN(points.ToArray(), 5);

            // Then
            Assert.AreEqual(5, newPoints.Count);
        }
Пример #6
0
        private List <GPoint> SimplifyPolyline(List <GPoint> curvatures, double distanceTolerance)
        {
            List <GPoint> simplified = PolylineSimplication.SimplifyByYTolerance(curvatures.ToArray(), CurveManeuverParameter.CurveCurvatureThreshold);
            List <GPoint> newPoints  = PolylineSimplication.SimplifyByDouglasPeucker(simplified.ToArray(), CurveManeuverParameter.DouglasPeuckerTolerance);

            if (distanceTolerance > 0)
            {
                newPoints = PolylineSimplication.SimplifyByWeight(newPoints.ToArray(), distanceTolerance);
            }

            return(newPoints);
        }
Пример #7
0
        /// <summary>
        /// maxCount以内になるように間引く
        /// </summary>
        /// <param name="points">input</param>
        /// <param name="maxPointsCount">expected max number of points</param>
        /// <returns></returns>
        private List <GPoint> Thinout(List <GPoint> points, int maxPointsCount, out double duration)
        {
            duration = 0.0;
            if (points.Count <= maxPointsCount)
            {
                return(points);
            }

            List <GPoint> simplified = null;

            duration = Util.Util.MeasureExecTime(() => {
                if (m_CurveManeuverParameter.ThinoutByDouglasPeuckerN)
                {
                    simplified = PolylineSimplication.SimplifyByDouglasPeuckerN(points.ToArray(), maxPointsCount);
                }
                else
                {
                    simplified = PolylineSimplication.SimplifyPointsN(points.ToArray(), maxPointsCount);
                }
            });
            return(simplified);
        }
Пример #8
0
        public void SimplifyPoints(string expectedPointsNum)
        {
            List <GPoint> XY = ExtractCoordinates();
            int           expectedPointsCount = Util.StringUtil.IsDigitsOnly(expectedPointsNum) ? int.Parse(expectedPointsNum) : 500;
            List <GPoint> simpfiledXY;

            if (m_Appsetting.CurveManeuverParameter.ThinoutByDouglasPeuckerN)
            {
                simpfiledXY = PolylineSimplication.SimplifyByDouglasPeuckerN(XY.ToArray(), expectedPointsCount);
            }
            else
            {
                simpfiledXY = PolylineSimplication.SimplifyPointsN(XY.ToArray(), maxPoints: expectedPointsCount);
            }

            var    col1        = this.CurrentSelectionRange.Col;
            var    col2        = this.CurrentSelectionRange.EndCol;
            string newCol1Name = "new" + CurrentWorksheet[0, col1];
            string newCol2Name = "new" + CurrentWorksheet[0, col2];

            InsertXY(simpfiledXY, newCol1Name, newCol2Name);
        }
Пример #9
0
        public void PolylineSimplication_thinoutOneThird()
        {
            // Given
            int           TOTAL      = 10;
            List <GPoint> origPoints = new List <GPoint>(TOTAL);

            for (int i = 0; i < TOTAL; i++)
            {
                origPoints.Add(new GPoint(i));
            }

            // When
            int           maxPoints = 7;
            List <GPoint> newPoints = PolylineSimplication.SimplifyPointsN(origPoints.ToArray(), maxPoints);

            // Then
            Assert.AreEqual(true, Math.Abs(maxPoints - newPoints.Count) < 2);
            Assert.AreEqual(0, newPoints[0].X);
            Assert.AreEqual(9, newPoints.Last().X);

            Assert.AreEqual(5, newPoints[4].X);
            Assert.AreEqual(8, newPoints[6].X);
        }
Пример #10
0
        private void PlotSameRanges(List <GPoint> maneuvers)
        {
            List <GPoint> sameRanges = PolylineSimplication.ExtractSameRanges(maneuvers.ToArray(), CurveManeuverParameter.YTolerance);

            AddScatterSeries(sameRanges, "YValue-Tolerance", MarkerType.Cross);
        }