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