Я ничего не знаю о функции Matlab, но здесь мы идем. Попробуйте разбить ваш сферический многоугольник на сферические треугольники, скажем, рисуя диагонали из вершины. Площадь поверхности сферического треугольника определяется как
R^2 * ( A + B + C - \pi)
, где R
- радиус сферы, а A
, B
и C
- внутренние углы треугольника (в радианах). Количество в скобках известно как «сферический избыток».
Ваш n
-сторонний многоугольник будет разделен на n-2
треугольники. Суммируя по всем треугольникам, извлекая общий множитель R^2
и объединяя все \pi
вместе, площадь вашего многоугольника равна
R^2 * ( S - (n-2)\pi )
где S
- угловая сумма вашего многоугольника. Количество в скобках снова является сферическим избытком многоугольника.
[править] Это верно независимо от того, является ли многоугольник выпуклым. Все, что имеет значение, это то, что можно разбить на треугольники.
Вы можете определить углы по битам векторной математики. Предположим, у вас есть три вершины A
, B
, C
и вас интересует угол в B
. Поэтому мы должны найти два касательных вектора (их значения не имеют значения) к сфере из точки B
вдоль сегментов большого круга (ребер многоугольника). Давайте разберемся с этим BA
. Большой круг лежит в плоскости, определяемой OA
и OB
, где O
- центр сферы, поэтому он должен быть перпендикулярен вектору нормали OA x OB
. Оно также должно быть перпендикулярно OB
, так как оно касается его. Следовательно, такой вектор задается как OB x (OA x OB)
. Вы можете использовать правило правой руки, чтобы убедиться, что это в правильном направлении. Также обратите внимание, что это упрощается до OA * (OB.OB) - OB * (OB.OA) = OA * |OB| - OB * (OB.OA)
.
Затем вы можете использовать доброе старое произведение, чтобы найти угол между сторонами: BA'.BC' = |BA'|*|BC'|*cos(B)
, где BA'
и BC'
- касательные векторы от B
вдоль сторон до A
и C
.
[отредактировано, чтобы было ясно, что это касательные векторы, а не буквально между точками]