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"); }
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); }
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); }
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); }
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); }
/// <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); }
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); }
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); }
private void PlotSameRanges(List <GPoint> maneuvers) { List <GPoint> sameRanges = PolylineSimplication.ExtractSameRanges(maneuvers.ToArray(), CurveManeuverParameter.YTolerance); AddScatterSeries(sameRanges, "YValue-Tolerance", MarkerType.Cross); }