//--------------------------------------------------------------------------------------------- //Трансформация траектоории (центрирование, поворот, растяжение) private Curve2D TransformateTrajectory( Curve2D trajectory, EllipseDescriptor approximateEllipse ) { //Центрирование Curve2D transformedTrajectory = this.CentreTrajectory(trajectory, approximateEllipse); //Поворот параллельно координатной оси double rotationAngleToAxis = approximateEllipse.GetAngleBetweenOxAndPrincipalAxis(); transformedTrajectory = this.RotateTrajectory(transformedTrajectory, rotationAngleToAxis); //Растяжение EllipseOrientaion primaryOrientation = approximateEllipse.GetOrientaion(); TrajectoryOrientation trajectoryOrientation = this.DetectTrajectoryOrientation(primaryOrientation, rotationAngleToAxis); double koefficientOfStretch = 1 / approximateEllipse.GetCompressionRatio(); transformedTrajectory = this.StretchingTrajectory (transformedTrajectory, trajectoryOrientation, koefficientOfStretch); //Поворот траектории до пересечения первой точки с осью OX Point2D firstPointTrajectory = transformedTrajectory[0]; double rotationAngle = Mathem.Arctg(firstPointTrajectory.Y, firstPointTrajectory.X); transformedTrajectory = this.RotateTrajectory(transformedTrajectory, rotationAngle); return(transformedTrajectory); }
//------------------------------------------------------------------------------------------- //Определение ориентации траектории private TrajectoryOrientation DetectTrajectoryOrientation( EllipseOrientaion primaryEllipseOrientation, //Первоначальная ориентация double rotationAngle //Угол поворота первоначальной траектории ) { TrajectoryOrientation trajectoryOrientation = TrajectoryOrientation.Undefined; if (primaryEllipseOrientation == EllipseOrientaion.NorthEast) { if (0 < rotationAngle) { trajectoryOrientation = TrajectoryOrientation.AxisX; } else { trajectoryOrientation = TrajectoryOrientation.AxisY; } } if (primaryEllipseOrientation == EllipseOrientaion.NorthWest) { if (0 < rotationAngle) { trajectoryOrientation = TrajectoryOrientation.AxisY; } else { trajectoryOrientation = TrajectoryOrientation.AxisX; } } return(trajectoryOrientation); }
//--------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------- //Преобразовать точки к окружности private Point2D[] GetTransformedPoints(params Point2D[] points2D) { //this.EllipsePoints = 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(-rotationAngle, points2D); EllipseOrientaion pointsOrientation = this.GetPointsOrientation(points2D); if (pointsOrientation == EllipseOrientaion.AxisY) { points2D = this.RotatePoints(Math.PI / 2, points2D); } double radiusX = ellipseDescriptor.GetSemiMajorAxis(); double radiusY = ellipseDescriptor.GetSemiMinorAxis(); double stretchCoefficient = radiusX / radiusY; Point2D[] stretchPoints = this.StretchPointsAlongAxisY(stretchCoefficient, points2D); this.EllipsePoints = stretchPoints; return(stretchPoints); }
//------------------------------------------------------------------------------------------ //Ориентация эллипса на плоскости public EllipseOrientaion GetOrientaion() { int signA11 = Math.Sign(this.A11); int signA12 = Math.Sign(this.A12); EllipseOrientaion orientation = EllipseOrientaion.Undefined; if (signA11 == signA12) { orientation = EllipseOrientaion.NorthWest; } else { orientation = EllipseOrientaion.NorthEast; } return(orientation); }
//--------------------------------------------------------------------------------------------- //Преобразовать точки к окружности 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); }
//--------------------------------------------------------------------------------------------- //Определение ориентации точек private EllipseOrientaion GetPointsOrientation(params Point2D[] points2D) { EllipseOrientaion orientation = EllipseOrientaion.Undefined; double sumCoordinatesX = 0; double sumCoordinatesY = 0; for (int index = 0; index < points2D.Length; index++) { Point2D point = points2D[index]; sumCoordinatesX += point.X; sumCoordinatesY += point.Y; } double sumsRatio = sumCoordinatesX / sumCoordinatesY; if (sumsRatio < 1) { orientation = EllipseOrientaion.AxisY; } if (1 <= sumsRatio) { orientation = EllipseOrientaion.AxisX; } return(orientation); }