Задать вопрос
Paitor
@Paitor
Выпускник. Изучаю Python и прочее

Как начертить правильный n-угольник с центром в точке (x, y) на поверхности шара?

Пишу такую программу на питоне. Изучал только планиметрию и стереометрию в школе.
Дано:
n - количество углов правильного многоугольника
r - радиус описанной около него окружности
x, y - широта и долгота (Да, шар не просто шар, а планета Земля) центра многоугольника
Найти:
? - широта и долгота каждой точки. Не важно как будет повернут многоугольник, главное, чтобы, если соединить эти точки, он получился правильным и n-угольным

UPD: меня интересует только одна восьмая всего шара, так что там можно считать обе координаты положительными. Сам многоугольник будет очень маленький по сравнению с шаром

UPD: будем считать первой точкой многоугольника точку, сдвинутую от цента вправо на r на той же широте. Т.е как если бы мы, глядя на шар, вокруг центральной точки начертили бы окружность радиуса r и воспринимали бы её как единичную окружность синуса и косинуса. Тогда бы первая точка была бы в координате угла в ноль градусов

предполагаю, что ещё может понадобиться радиус, обозначим его за R
  • Вопрос задан
  • 304 просмотра
Подписаться 2 Простой 13 комментариев
Пригласить эксперта
Ответы на вопрос 2
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Удобно ввести новую систему координат и потом откладывать ее базисные векторы нужное количество раз.
Эта система будет иметь центр на радиусе сферы к центру оружности и лежать на "хорде" - плоскости в которой лежит многоугольник. В ней ваш многоугольник будет просто на плоскости.

Из простейшей геметрии вы знаете, что этот центр координат будет на расстоянии sqrt(R^2-r^2) от центра сферы - так радиус окружности на сфере будет r.

Первый базисный вектор будет вдоль радиуса из центра сферы к центру многоугольника и координата там будет всегда 0.
Теперь вам надо найти еще какой-то вектор в плоскости многоугольника, а третий вектор потом найдете через векторное произведение. Хорошо бы этот второй вектор взять на север, тогда ясно куда класть первую точку по условию. Если только центр окружности не лежит строго на свере, то можно взять и спроецировать на плоскость вертикальный вектор (0, 0, 1) и все (а в противном случае проецируйте, допустим (1, 0, 0). А дальше останется только взять формулы для многоугольника на плоскости x = cos(2*pi/n*k)*r y = sin(2*pi/n*k)*r, ну и не забыть перевести все в обычную систему координат.

Итак, пусть xo,yo,zo - точка на сфере, где лежит центр. xo и yo не нули одновременно. Еще даны R, r и n.

Центр новых координат:
L = sqrt(R^2 - r^2)
x1 = xo/R*L
y1 = yo/R*L
z1 = zo/R*L

Первый базисный вектор:
e1 = (x0, y0, z0) / R
Второй базисный вектор (нормализованный (0,0,1) - (0,0,1)*e1):
e2 = (-x0*z0/R/sqrt(R^2- z0^2), -y0*z0/R/sqrt(R^2- z0^2), sqrt(R^2-z0^2)/R)

третий базисный ветор, найдите сами через векторное произведение.

А дальше координаты k-ой точки:
p = (x1,y1,z1) +e2*cos(2*pi/n*k)*r+e3*sin(2*pi/n*k)
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Т.е. у нас есть окружность в трёхмерном пространстве. И все вершины n-угольника будут лежать на этой окружности. Тогда задача сводится к:
1. Перейти от широты, долготы, радиуса шара и радиуса окружности к координатам истинного центра окружности (не того, что на земле, а того, что под землёй) и вектору нормали к этой окружности (вектор радиуса шара, проходящего через центр).
2. Зная их, найти вектор, направленный "на восток".
3. Поворачивать этот вектор вокруг нормали на 360/n градусов.

Первое - находим координаты вектора, направленного из центра в точку (x, y), в трёхмерном пространстве, где центр шара - начало координат. Назовём его осевым радиусом.

Найти истинный центр не так уж сложно. У нас есть прямоугольный треугольник, где гипотенуза - радиус шара R, а один катет - радиус окружности r. Тогда второй катет будет расстоянием от центра шара до истинного центра окружности вдоль осевого радиуса.

Найти вектор "на восток" можно по правилу буравчика. Если не путаю, векторное произведение осевого радиуса на вектор, из точки (x, y) на север, даст нам нужный вектор.

Дальше осталось только поворачивать этот вектор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы