//--------------------------------------------------------------------------------------------- //Корректировка точек к эллипсу private Point2D[] CorrectPointsToCanonicalEllipse( CanonicalEllipseDescriptor canonicalEllipseDescriptor, params Point2D[] points ) { Point2D[] ellipsePoints = new Point2D[points.Length]; for (int index = 0; index < points.Length; index++) { Point2D point = points[index]; Point2D ellipsePoint = canonicalEllipseDescriptor.GetNearestEllipsePoint(point); ellipsePoints[index] = ellipsePoint; } return(ellipsePoints); }
//--------------------------------------------------------------------------------------------- //Преобразовать точки к окружности private Point2D[] GetTransformedPoints(Point2D[] points2D) { EllipseApproximator ellipseApproximator = new EllipseApproximator(); EllipseDescriptor ellipseDescriptor = ellipseApproximator.Approximate(points2D); Point2D ellipseCentre = ellipseDescriptor.GetCentre(); points2D = PlaneManager.DisplacePoints(points2D, -ellipseCentre.X, -ellipseCentre.Y); double rotationAngle = ellipseDescriptor.GetAngleBetweenOxAndPrincipalAxis(); points2D = this.RotatePoints(points2D, -rotationAngle); EllipseOrientaion pointsOrientation = this.GetPointsOrientation(points2D); if (pointsOrientation == EllipseOrientaion.AxisY) { points2D = this.RotatePoints(points2D, Math.PI / 2); } double radiusX = ellipseDescriptor.GetSemiMajorAxis(); double radiusY = ellipseDescriptor.GetSemiMinorAxis(); CanonicalEllipseDescriptor canonicalEllipseDescriptor = new CanonicalEllipseDescriptor(radiusX, radiusY); Point2D[] correctedToEllipsePoints = this.CorrectPointsToCanonicalEllipse(points2D, canonicalEllipseDescriptor); this.EllipsePoints = correctedToEllipsePoints; CircleDescriptor circleDescriptor = new CircleDescriptor(new Point2D(0, 0), radiusX); Point2D[] correctedToCirclePoints = this.StretchToCircleAlongAxisY(correctedToEllipsePoints, circleDescriptor, 0); return(correctedToCirclePoints); }