public static Geometry CreateGeometry(GunPitchLimitsComponent traverse,
                                              TurretYawLimits yawLimits,
                                              Point center,
                                              Func <double, double> radiusConverter,
                                              double geometryRotation = 0)
        {
            Geometry geometry;
            double   maxRadius;
            var      data = traverse.Data;

            if (traverse.HasSingularValue)
            {
                var radius = radiusConverter(data[0].Limit);
                geometry  = new EllipseGeometry(center, radius, radius);
                maxRadius = radius;
            }
            else
            {
                maxRadius = radiusConverter(traverse.GetMaxValue());

                var figureFigure = new PathFigure();

                var previousTheta  = 0.0;
                var previousRadius = 0.0;
                var previousNode   = (GunPitchLimitsComponent.PitchData)null;

                for (var i = 0; i < data.Length; ++i)
                {
                    var node       = data[i];
                    var theta      = geometryRotation + node.Angle * 360;
                    var radius     = radiusConverter(node.Limit);
                    var point      = GunTraverseHelper.PolarToCartesian(center, radius, theta);
                    var thetaRange = theta - previousTheta;

                    if (i == 0)
                    {
                        figureFigure.StartPoint = point;
                    }
                    else
                    {
                        Debug.Assert(previousNode != null, "previousNode != null");

                        if (previousNode.Angle == node.Angle)
                        {
                            figureFigure.Segments.Add(new LineSegment(point, true));
                        }
                        else if (previousNode.Limit == node.Limit)
                        {
                            figureFigure.Segments.Add(new ArcSegment(point,
                                                                     new Size(radius, radius),
                                                                     thetaRange,
                                                                     thetaRange >= 180,
                                                                     SweepDirection.Counterclockwise,
                                                                     true));
                        }
                        else
                        {
                            figureFigure.Segments.Add(GunTraverseHelper.CreateTraverseFigureTransition(ref figureFigure,
                                                                                                       ref center,
                                                                                                       previousTheta,
                                                                                                       thetaRange,
                                                                                                       previousRadius,
                                                                                                       radius));
                        }
                    }

                    previousTheta  = theta;
                    previousNode   = node;
                    previousRadius = radius;
                }


                var pathGeometry = new PathGeometry();
                pathGeometry.Figures.Add(figureFigure);
                geometry = pathGeometry;
            }

            return(GunTraverseHelper.ProcessGeometryHorizontalTraverse(traverse,
                                                                       yawLimits,
                                                                       center,
                                                                       geometryRotation,
                                                                       geometry,
                                                                       maxRadius));
        }