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)); }