/// <summary>
        /// Сравнивает результаты полученные с помощью работы алгоритма для сферы,
        /// с результатами полученными с помощью алгоритма эллипсоида
        /// </summary>
        private void EllipsoidSpheroidCompare(Point point1, Point point2)
        {
            var directProblemService  = new DirectProblemService(new Spheroid());
            var inverseProblemService = new InverseProblemService(new Spheroid());

            PrivateObject distance    = new PrivateObject(inverseProblemService);
            PrivateObject coordinates = new PrivateObject(directProblemService);

            // Решение обратной задачи
            var byEllipsoidInverse =
                (InverseProblemAnswer)distance.Invoke("OrthodromicEllipsoidDistance", point1, point2);
            var bySpheroidInverse =
                (InverseProblemAnswer)distance.Invoke("OrthodromicSpheroidDistance", point1, point2);

            Assert.AreEqual(byEllipsoidInverse.Distance, bySpheroidInverse.Distance, 0.0006); // 0.06 мм
            Assert.AreEqual(byEllipsoidInverse.ForwardAzimuth, bySpheroidInverse.ForwardAzimuth, 0.000000001);
            Assert.AreEqual(byEllipsoidInverse.ReverseAzimuth, bySpheroidInverse.ReverseAzimuth, 0.000000001);

            // Решение прямой задачи
            var byEllipsoidDirect =
                (DirectProblemAnswer)
                coordinates.Invoke("DirectProblemEllipsoid", point1, byEllipsoidInverse.ForwardAzimuth,
                                   byEllipsoidInverse.Distance);
            var bySpheroidDirect =
                (DirectProblemAnswer)
                coordinates.Invoke("DirectProblemSpheroid", point1, bySpheroidInverse.ForwardAzimuth,
                                   bySpheroidInverse.Distance);

            Assert.AreEqual(byEllipsoidDirect.ReverseAzimuth, bySpheroidDirect.ReverseAzimuth, 0.000000001);
            Assert.AreEqual(byEllipsoidDirect.Сoordinate.Latitude, bySpheroidDirect.Сoordinate.Latitude, 0.000000001);
            Assert.AreEqual(byEllipsoidDirect.Сoordinate.Longitude, bySpheroidDirect.Сoordinate.Longitude, 0.000000001);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Тестирование решения прямой и обратной задач
        /// </summary>
        /// <remarks>
        /// Тест состоит из нескольких частей:
        ///     1. Задаются координаты между которыми рассчитывается ортодромическая дистанция и определяется азимут
        ///         - решается обратная геодезическая задача
        ///     2. По первой координате, дистанции и прямому направлению (азимуту) находим вторую координату
        ///         - решается прямая геодезическая задача
        ///     3. Выполняется проверка
        ///         - вторая координата из условий обратной задачи должна совпасть с координатой из решения прямой задачи,
        ///         - обратный азимут из решения обратной задачи, должен совпадать с обратным азимутом из решения прямой задачи
        ///     4. По второй координате, дистанции и обратному направлению (азимуту) находим первую координату
        ///         - решаетая прямая геодезическая задача
        ///     5. Выполняется проверка
        ///         - первая координата из условий обратной задачи должна совпасть с координатой из решения прямой задачи
        ///         - прямой азимут из решения обратной задачи, должен совпадать с обратным азимутом из решения прямой задачи
        /// </remarks>
        public override void Tests(Point point1, Point point2, IEllipsoid ellipsoid)
        {
            var inverseProblemService = new InverseProblemService(ellipsoid);
            var directProblemService  = new DirectProblemService(ellipsoid);

            // Решение обратной задачи
            var inverseAnswer = inverseProblemService.OrthodromicDistance(point1, point2);

            // Решение прямой задачи 1
            var directAnswerForward = directProblemService.DirectProblem(point1,
                                                                         inverseAnswer.ForwardAzimuth, inverseAnswer.Distance);
            var distance1 =
                inverseProblemService.OrthodromicDistance(
                    new Point(directAnswerForward.Сoordinate.Longitude, directAnswerForward.Сoordinate.Latitude),
                    point2).Distance;

            Assert.AreEqual(distance1, 0, 0.0006); // 0.06 мм
            Assert.AreEqual(directAnswerForward.Сoordinate.Longitude, point2.Longitude, 0.000000001);
            Assert.AreEqual(directAnswerForward.Сoordinate.Latitude, point2.Latitude, 0.000000001);
            Assert.AreEqual(inverseAnswer.ReverseAzimuth, directAnswerForward.ReverseAzimuth, 0.000000001);

            // Решение прямой задачи 2
            var directAnswerReverse = directProblemService.DirectProblem(point2,
                                                                         inverseAnswer.ReverseAzimuth, inverseAnswer.Distance);
            var distance2 =
                inverseProblemService.OrthodromicDistance(
                    new Point(directAnswerReverse.Сoordinate.Longitude, directAnswerReverse.Сoordinate.Latitude),
                    point1)
                .Distance;

            Assert.AreEqual(distance2, 0, 0.0006); // 0.06 мм
            Assert.AreEqual(directAnswerReverse.Сoordinate.Longitude, point1.Longitude, 0.000000001);
            Assert.AreEqual(directAnswerReverse.Сoordinate.Latitude, point1.Latitude, 0.000000001);
            Assert.AreEqual(inverseAnswer.ForwardAzimuth, directAnswerReverse.ReverseAzimuth, 0.000000001);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Тестируется правильность определения азимута
        /// </summary>
        /// <remarks>
        /// Первый критерий правильности определения азимута таков:
        ///     - сначала решается обратная геодезическая задача для определения азимута из первой точки до второй
        ///     - затем решается обратная геодезическая задача для определения азимута из второй точки до первой
        ///     - сравниваются прямые и обратные азимуты двух решений
        /// Второй критерий:
        ///     - сначала решается обратная геодезическая задача для определения азимута и дистанции
        ///     - из первой точки по заданной дистанции мы решаем прямую геодезическую задача: должны попасть во вторую точку
        ///     - и наоборот
        /// </remarks>
        public override void Tests(Point point1, Point point2, IEllipsoid ellipsoid)
        {
            var inverseProblemService = new InverseProblemService(ellipsoid);
            var directProblemService  = new DirectProblemService(ellipsoid);

            var answer1 = inverseProblemService.OrthodromicDistance(point1, point2);
            var answer2 = inverseProblemService.OrthodromicDistance(point2, point1);

            Assert.AreEqual(answer1.ForwardAzimuth, answer2.ReverseAzimuth, 0.000000001);
            Assert.AreEqual(answer1.ReverseAzimuth, answer2.ForwardAzimuth, 0.000000001);

            var answerPoint1 = directProblemService.DirectProblem(point1, answer1.ForwardAzimuth, answer1.Distance);

            Assert.AreEqual(point2.Latitude, answerPoint1.Сoordinate.Latitude, 0.000000001);
            Assert.AreEqual(point2.Longitude, answerPoint1.Сoordinate.Longitude, 0.000000001);

            var answerPoint2 = directProblemService.DirectProblem(point2, answer2.ForwardAzimuth, answer2.Distance);

            Assert.AreEqual(point1.Latitude, answerPoint2.Сoordinate.Latitude, 0.000000001);
            Assert.AreEqual(point1.Longitude, answerPoint2.Сoordinate.Longitude, 0.000000001);
        }