예제 #1
0
        //---------------------------------------------------------------------------------------------
        //Трансформация траектоории (центрирование, поворот, растяжение)
        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);
        }
예제 #2
0
        //-------------------------------------------------------------------------------------------
        //Определение ориентации траектории
        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);
        }