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 PlotBSplineRawCurvatureByNURBS(List <GPoint> points, double curvelength) { // curvature base.Axes.Add(new OxyPlot.Axes.LinearAxis { Title = (CurvatureUnit == CurvatureUnit.Meter) ? "Curvature(1/m)" : "Curvature(1/cm)", Position = OxyPlot.Axes.AxisPosition.Left }); AddZeroLineAnnotation(); int degree = SplineDegree(points); OxyPlot.Series.LineSeries ls = new OxyPlot.Series.LineSeries() { MarkerType = ShowMarker ? MarkerType.None : MarkerType.Plus, MarkerStroke = OxyPlot.OxyColors.Blue }; List <GPoint> curvatures = new List <GPoint>(); double duration = Util.Util.MeasureExecTime(() => { double scale = (CurvatureUnit == CurvatureUnit.Centimeter) ? 0.01 : 1.0; // 1/cm or 1/m NURBSCurve bspline = new NURBSCurve(points, degree); for (double u = 0.01; u < 1.0 - 0.01; u += 0.01) { double curvature = bspline.Curvature(u) * scale; double dist = curvelength * u; ls.Points.Add(new OxyPlot.DataPoint(dist, curvature)); curvatures.Add(new GPoint(dist, curvature, weight: dist)); } }); ls.Title = $"NURBS({degree}) Curvature({duration:0.###}ms)"; base.Series.Add(ls); PlotSimplifiedPolyline(curvatures); PlotManeuverOnCurvatureCurve(curvatures); }