예제 #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 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);
        }