Точки, линии и многоугольники на сферах с помощью C/С++

Мое приложение - представлять фигуры на Земле (с достаточной сферой). Это могут быть точки, линии и полигоны. Координаты должны определяться с помощью градусов или радиан (точно так же, как географические координаты).

Линейный отрезок между двумя точками на поверхности сферы должен лежать на большом круге. Полигоны должны состоять из набора таких линий. Кроме того, я хотел бы выполнить Set - Основные операции, такие как пересечение, объединение, различие, дополнение к упомянутым формам. Эти операции требуют только вывода коллекций точек.

Я попытался понять это, используя CGAL Ядро 3D-сферической геометрии и Двумерные булевы операции над неофлогами, встроенными в сферу. На самом деле у меня уже были проблемы с помещением линии на сферу. Кроме того, CGAL работает в евклидовом пространстве, который все еще оставляет меня с необходимыми геометрическими операциями, чтобы работать с большими кругами, расположенными на сфере.

Мой вопрос: если вы можете помочь мне в реализации функциональности, упомянутой в CGAL, или если вы можете рекомендовать другую библиотеку для C/С++, которая это делает. Большое вам спасибо!

Ответ 1

Я бы предложил вам взглянуть на это:

http://www.codeguru.com/Cpp/Cpp/algorithms/general/article.php/c5115/

Вопрос 1E решает вашу проблему пересечения двух великих кругов. Из этого вы можете определить основную операцию ваших фигур на сфере без большой зависимости, такой как CGAL или GEOS.

Ответ 2

Если вы хотите выполнить операцию общего многоугольника, такую ​​как объединение/пересечение и т.д., вы можете посмотреть в библиотеку полигонов общей полигоны из http://www.cs.man.ac.uk/~toby/alan/software/

Ответ 3

Поиск пересечения двух объектов обычно требует установки уравнений, определяющих объекты, равные друг другу.

Вот один из способов, который, возможно, просто еще одна фраза ответа Витора.

Начните с определения каждой строки (дуги) в качестве параметрического уравнения. К лучшему или худшему я вижу эти дуги, когда нормализованные векторы пути принимают при вращении. Так что, как бы я их определял (я уверен, что есть лучший способ).

Итак, я бы взял начальную и конечную точки, рассматривал их как векторы, брал крест-произведение, чтобы получить ось вращения, и чтобы точка-точка получала угол.

поэтому мое уравнение для дуги будет выглядеть как

arc (t) = startPoint * (axisAngleToRotationMatrix (ось, t * угол))

Затем вы установили бы уравнение двух дуг, равное друг другу, и решим систему уравнений, которая получается для "t" в каждом уравнении.