private static StraightnessPlot ConvertToStraightness(CylindricityPlot source)
        {
            var result = new StraightnessPlot();

            CopyDefaults(source, result);

            result.Actual.CoordinateSystem  = source.Actual.CoordinateSystem;
            result.Nominal.CoordinateSystem = source.Nominal.CoordinateSystem;

            var heightFactor = source.Actual.Height;

            foreach (var segment in source.Segments)
            {
                var resultSegment = new Segment <LinePoint, LineGeometry>(segment.Name, segment.SegmentType);

                result.Segments.Add(resultSegment);

                foreach (var point in segment.Points)
                {
                    var resultPoint = new LinePoint(point.Height * heightFactor, point.Deviation);

                    CopyDefaults(point, resultPoint);

                    resultSegment.Points.Add(resultPoint);
                }
            }

            return(result);
        }
        private static StraightnessPlot ConvertCircleToStraightness <TPoint, TGeometry>(Formplot <TPoint, TGeometry> source)
            where TPoint : CirclePointBase <TPoint, TGeometry>, new()
            where TGeometry : Geometry, new()
        {
            var result = new StraightnessPlot();

            CopyDefaults(source, result);

            result.Actual.CoordinateSystem  = source.Actual.CoordinateSystem;
            result.Nominal.CoordinateSystem = source.Nominal.CoordinateSystem;

            double?      lastAngle = null;
            const double radToDeg  = 180 / Math.PI;

            foreach (var segment in source.Segments)
            {
                var resultSegment = new Segment <LinePoint, LineGeometry>(segment.Name, segment.SegmentType);
                result.Segments.Add(resultSegment);

                foreach (var point in segment.Points)
                {
                    double position;
                    if (!lastAngle.HasValue)
                    {
                        lastAngle = AdjustAngle(point.Angle * radToDeg);
                        position  = lastAngle.Value;
                    }
                    else
                    {
                        var angle = AdjustAngle(point.Angle * radToDeg);

                        while (angle < lastAngle)
                        {
                            angle += 360;
                        }

                        lastAngle = angle;
                        position  = angle;
                    }

                    var resultPoint = new LinePoint(position, point.Deviation);
                    CopyDefaults(point, resultPoint);
                    resultSegment.Points.Add(resultPoint);
                }
            }

            return(result);
        }
        private static StraightnessPlot ConvertCurveToStraightness <TPoint, TGeometry>(Formplot <TPoint, TGeometry> source)
            where TPoint : CurvePointBase <TPoint, TGeometry>, new()
            where TGeometry : Geometry, new()
        {
            var result = new StraightnessPlot();

            CopyDefaults(source, result);

            result.Actual.CoordinateSystem  = source.Actual.CoordinateSystem;
            result.Nominal.CoordinateSystem = source.Nominal.CoordinateSystem;

            Vector?lastPoint     = null;
            var    currentLength = 0.0;

            foreach (var segment in source.Segments)
            {
                var resultSegment = new Segment <LinePoint, LineGeometry>(segment.Name, segment.SegmentType);

                result.Segments.Add(resultSegment);

                foreach (var point in segment.Points)
                {
                    if (lastPoint == null)
                    {
                        lastPoint = point.Position;
                    }
                    else
                    {
                        var dx = point.Position.X - lastPoint.Value.X;
                        var dy = point.Position.Y - lastPoint.Value.Y;
                        var dz = point.Position.Z - lastPoint.Value.Z;

                        lastPoint = point.Position;

                        currentLength += Math.Sqrt(dx * dx + dy * dy + dz * dz);
                    }

                    var resultPoint = new LinePoint(currentLength, point.Deviation);
                    CopyDefaults(point, resultPoint);
                    resultSegment.Points.Add(resultPoint);
                }
            }

            return(result);
        }
        private static StraightnessPlot ConvertToStraightness(FlatnessPlot source)
        {
            var result = new StraightnessPlot();

            CopyDefaults(source, result);

            result.Actual.CoordinateSystem  = source.Actual.CoordinateSystem;
            result.Nominal.CoordinateSystem = source.Nominal.CoordinateSystem;

            Vector?lastPoint     = null;
            var    currentLength = 0.0;

            foreach (var segment in source.Segments)
            {
                var resultSegment = new Segment <LinePoint, LineGeometry>(segment.Name, segment.SegmentType);

                result.Segments.Add(resultSegment);

                foreach (var point in segment.Points)
                {
                    if (lastPoint == null)
                    {
                        lastPoint = new Vector(point.Coordinate1, point.Coordinate2);
                    }
                    else
                    {
                        var dx = point.Coordinate1 - lastPoint.Value.X;
                        var dy = point.Coordinate2 - lastPoint.Value.Y;

                        lastPoint = new Vector(point.Coordinate1, point.Coordinate2);

                        currentLength += Math.Sqrt(dx * dx + dy * dy);
                    }

                    var resultPoint = new LinePoint(currentLength, point.Deviation);
                    CopyDefaults(point, resultPoint);
                    resultSegment.Points.Add(resultPoint);
                }
            }

            return(result);
        }