Как найти точку на полусфере

From the drawing it looks as if the position of the point on the sphere is given by a form of spherical coordinates. Let r be the radius of the sphere; let alpha be given relative to the x-axis; and let beta be the angle relative to the x-y-plane. The Cartesian coordinates of the point on the sphere are:

x = r * cos(beta) * cos(alpha)
y = r * cos(beta) * sin(alpha)
z = r * sin(beta)

Edit

But for a general coordinate frame with axes (L, M, N) centered at (X, Y, Z) the coordinates are (as in dmuir’s answer):

(x, y, z) = 
   (X, Y, Z) 
   + r * cos(beta) * cos(alpha) * L 
   + r * cos(beta) * sin(alpha) * M 
   + r * sin(beta) * N

The axes L and N must be orthogonal and M = cross(N, L). alpha is given relative to L, and beta is given relative to the LM plane. If you don’t know how L is related to points of the triangle, then the question can’t be answered.

Чтобы наиболее качественно построить модель СКН для любого телескопа, желательно пройтись по большому количеству звездных полей, распределенных на полусфере неба равномерно. В случае с БТА я руководствовался медлительностью телескопа, поэтому точки были неравномерно распределены: по 4 точки (Z=10,30,50 и 70 градусов) на четырех основных азимутах (A=0,90,180 и 270 градусов) и по две точки (Z=40 и 60) на промежуточных азимутах.
Но для сравнительно быстрого полуметрового экваториала можно увеличить количество точек и распределить их равномерно. Естественно, алгоритм равномерного распределения точек по сфере существует давным-давно. Мне первым попался этот ответ на SO. Мерзопакостную пхытонятину заменил на octave. Получилось вот что:

num_pts = 200;
indices=[0:num_pts/2-1]+0.5;
phi = acos(1 - 2*indices/num_pts);
theta = pi * (1 + sqrt(5)) * indices;
x=cos(theta) .* sin(phi);
y=sin(theta) .* sin(phi);
z=cos(phi);
scatter3(x,y,z)
lowest=10*pi/180;
idx=find(phi<lowest);
phi(idx)=[];
theta(idx)=[];

f=fopen("out", "w")
for i = 1:98; fprintf(f, "%.3ft%.3fn", mod(theta(i), 2*pi)*180/pi, phi(i)*180/pi); endfor
fclose(f)


В получившемся файле имеем распределение точек по полусфере, начиная с высоты в 10° и заканчивая почти зенитом. Отсортированы они по высоте, поэтому в баше выполняем

sort out -n

и получаем список, отсортированый по азимуту (так будет удобней: меньше перекладок телескопу делать).
Вот так выглядит этот набор точек на полусфере:

А так — в проекциях азимут-высота:

Надеюсь, 98 точек хватит, чтобы монтировка могла построить нормальную модель СКН.
Вот еще, правда, нужно будет выяснить, что за косяк у 10micron с вычислением рефракции. Похоже, они берут значение в килопаскалях, потому что если ввести 780, то отклонение получается очень значительным.

Получившийся файл — еще не совсем то, что нужно для того, чтобы погонять экваториальную монтировку. Поэтому доделываем. Сначала заведем файл ang.m:

function s=ang(a)
% convert angle (in degr) into a string DD:MM:SS
    sgn = "";
    if(a < 0) sgn = "-"; a = -a; endif
    d = floor(a);
    a = (a-d)*60.;
    m = floor(a);
    a = (a-m)*60.;
    s = sprintf("%s%d:%d:%.1f", sgn, d, m, a);
endfunction


А теперь после получения phi/theta делаем вот что:

A=[]; H=[]; for i = 1:98; A=[A 180-mod(theta(i), 2*pi)*180/pi]; H=[H phi(i)*180/pi]; endfor
[~,idx]=sort(A)
As=A(idx); Hs=H(idx);

f=fopen("out", "w")
for i = 1:98; fprintf(f, "%st%sn", ang(As(i)), ang(Hs(i))); endfor
fclose(f)


Сортировку делаем уже средствами Octave.
Ну, а сформировав файл, наводимся при помощи баш-скрипта:

#!/bin/bash

function sendcmd(){
    echo $1 | nc 192.168.70.33 10001 -q10
}

while read A H; do
    sendcmd ":Sz${A}#"
    sendcmd ":Sa${H}#"
    sendcmd ":MS#"
    while true; do
        ANS=$(sendcmd ":Gstat#")
        echo $ANS
        [ $ANS == "0#" ] && break
        sleep 2
    done
    fli_control -x15000 field
done


Как-то так:

./sendcmd < out

(вчера я допилил stellariumdaemon, чтобы можно было на порт 10001 подсоединяться в отладочную консоль, не мешая основным процессам; правда, забыл на гитхаб push сделать).
Единственный косяк в этом подходе — альтазимутальный порядок точек, в результате чего вблизи полюса монтировка довольно долго мотается туда-сюда. По-хорошему, нужно бы преобразовать эти координаты в часовой угол/прямое восхождение и отсортировать по часовому углу. Но для этого придется ваять уже сишную “наводилку”, т.к. придется подключать libsofa для преобразования координат между разными системами.

Условие задачи:

Небольшое тело скользит с вершины полусферы вниз. На какой высоте (h) от вершины полусферы тело оторвется от поверхности сферы радиусом (R)? Трением пренебречь.

Задача №2.8.47 из «Сборника задач для подготовки к вступительным экзаменам по физике УГНТУ»

Дано:

(R), (h-?)

Решение задачи:

Схема к решению задачиКогда тело оторвется от полусферы, то сила реакции опоры (N) станет равной нулю. Допустим это произойдет в момент, когда прямая, соединяющая тело и центр полусферы (смотри схему), составляет с вертикалью угол (alpha). Запишем второй закон Ньютона в проекции на ось (y), которая совпадает с упомянутой прямой.

[- mg cdot cos alpha  + N = – m{a_ц}]

Учитывая, что центростремительное ускорение (a_ц) равно (frac{{{upsilon ^2}}}{R}), то:

[mg cdot cos alpha  – N = mfrac{{{upsilon ^2}}}{R}]

Выше уже было сказано, что (N=0), поэтому:

[mg cdot cos alpha  = mfrac{{{upsilon ^2}}}{R}]

[{upsilon ^2} = gR cdot cos alpha ;;;;(1)]

Так как трением можно пренебречь, то воспользуемся законом сохранения энергии:

[mgR = frac{{m{upsilon ^2}}}{2} + mgR cdot cos alpha ]

[{upsilon ^2} = 2gRleft( {1 – cos alpha } right);;;;(2)]

Так как левые части в равенствах (1) и (2) равны, то приравняем их правые части:

[gR cdot cos alpha  = 2gRleft( {1 – cos alpha } right)]

[cos alpha  = 2 – 2cos alpha ]

[cos alpha  = frac{2}{3}]

Искомую высоту (h) можно найти по формуле (смотри схему):

[h = R – R cdot cos alpha  = Rleft( {1 – cos alpha } right)]

[h = Rleft( {1 – frac{2}{3}} right) = frac{R}{3}]

Ответ: (frac{R}{3}).

Если Вы не поняли решение и у Вас есть какой-то вопрос или Вы нашли ошибку, то смело оставляйте ниже комментарий.

Смотрите также задачи:

2.8.46 Колодец, имеющий глубину 5 м, площадь дна 0,5 м2, наполовину заполнен водой
2.8.48 Небольшое тело соскальзывает вниз по наклонному скату, переходящему в мертвую
2.8.49 Небольшое тело соскальзывает по наклонной плоскости, переходящей в мертвую

Полное условие задачи:

На горизонтальной поверхности неподвижно закреплена абсолютно гладкая полусфера радиусом R = 2,5 м. С ее верхней точки из состояния покоя соскальзывает маленькое тело. В некоторой точке тело отрывается от сферы и летит свободно. Найдите скорость тела в момент отрыва от сферы. Сопротивлением воздуха пренебречь.

Краткое условие задачи:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Решение задачи:

Для решения начертим схематичный рисунок:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Рассмотрим задачу в системе отсчета, связанной с Землей. Будем считать эту систему отсчета инерциальной. Тело примем за материальную точку, так как его размеры малы по сравнению с радиусом сферы.

При движении тела по поверхности сферы на тело действуют сила тяжести и сила реакции опоры со стороны сферы, перпендикулярная поверхности сферы. Трение отсутствует, так как поверхность сферы гладкая. Следовательно, тепловых потерь нет и полная механическая энергия тела при его движении сохраняется. Условие отрыва тела от поверхности сферы формулируется на основе второго закона Ньютона. В момент отрыва сила реакции опоры равна нулю.

Распишем формулы для энергий. Потенциальная энергия в верхней точке равна:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

В момент отрыва высота тела над горизонтальной поверхностью равна:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

поэтому потенциальная энергия в точке отрыва равна:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

В верхней точке тело покоилось, поэтому его кинетическая энергия в этой точке равна нулю:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

В момент отрыва тело уже имеет некоторую скорость, поэтому кинетическая энергия в этот момент равна:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Запишем закон сохранения энергии для двух состояний тела (на вершине сферы и в момент отрыва):

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

или

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Подставим формулы и получим:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

или

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Запишем в точке отрыва второй закон Ньютона:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Запишем его в проекциях на ось x. Ось x направим от точки отрыва по радиусу к центру сферы.

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

В момент отрыва сила реакции опоры равна нулю:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Тогда:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Формула для центростремительного ускорения следующая:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Следовательно, получаем:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

или

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Из рисунка видно, что:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Подставляем (3) в (2) и получаем:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Подставляем (4) в (1) и получаем:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Подставляем данные и получаем численный ответ:

ЕГЭ по физике. Задача 29 (18). Движение тела по выпуклой поверхности

Ответ: 4 м/с.

Как вы интерполируете данные о сфере/полушарии в C++?

У меня есть набор тета-, фи-сферических координат со связанным значением плотности. [Тета | Фи | Плотность] около 100 точек.

Если я сэмплирую новую точку данных, захваченную не в данных, а на сфере, как я могу найти, каким должно быть интерполированное значение плотности из точек данных?

Сплайны, РБФ, что-то еще?

1 ответ

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

Этот ответ может предложить несколько полезных указателей:

Алгоритм вычисления диаграммы Вороного на сфере?


4

Community
23 Май 2017 в 13:25

Добавить комментарий