Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158

Почему так странно находятся углы в сферической системе координат

23.03.2016, 22:14. Показов 1430. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!
Вот краткая вырезка, которая меня и интересует.
Всё по инфе из WIKI СФЕРИЧЕСКИЕ КООРДИНАТЫ.
1 Есть координаты точки и центра.
2 Находится длина вектора.
3 Находятся углы фи и тетта( как арктангенс наклона касательной ).
4 после "поворота на 0" находятся новые Х1 и У1(Xr1 & Yr1).
Они не равны даже приблизительно исходным, в чём проблема?
пс, знаю, что углы находятся ээ странно...главное находятся и правильно, но я с удовольствием узнаю как это всё сделать нормально, только сперва объясните, почему не работает так?
Заранее спасибо большое!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    long double Xc=0.0;
    long double Yc=0.0;
    long double Zc=0.0;
    long double X1=100.0;
    long double Y1=100.0;
    long double Z1=100.0;
    long double Len1 = sqrt(pow(X1-Xc,2)+pow(Y1-Yc,2)+pow(Z1-Zc,2));
    
    long double Alfa001 = (Xc==X1? 0 : atan((Y1-Yc)/(X1-Xc)))
        + (Xc>X1? M_PI : (Xc==X1? (Yc>Y1? -M_PI_2 : (Yc<Y1? M_PI_2 : 0) ) : 0 ));
    long double Alfa002 = (Zc==Z1? 0 : atan((Y1-Yc)/(Z1-Zc)))
        + (Zc>Z1? M_PI : (Zc==Z1? (Yc>Y1? -M_PI_2 : (Yc<Y1? M_PI_2 : 0) ) : 0 ));
    long double Xr1=Xc + Len1 * sin(0 + Alfa002) * cos(0 + Alfa001);
    long double Yr1=Yc + Len1 * sin(0 + Alfa002) * sin(0 + Alfa001);
 
    //cout<<Alfa001<<" "<<Alfa002<<endl;
    //cout<<(Alfa002*360.0)/(2*M_PI)<<endl;
    cout<<Xr1<<" "<<Yr1<<endl;
Спасибо модератору за издевательское имя топика, что не так с нахождением углов?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2016, 22:14
Ответы с готовыми решениями:

Поворот поверхности в сферической системе координат
Здравствуйте! Столкнулся с интересной проблемой(наверное только для меня :) ). В сферической системе координат задано уравнение...

Построить в сферической системе координат поверхность
Построить в сферической системе координат поверхность, модуль радиус- вектора точек которых изменяется по закону R = cos(α ). ...

Единичные вектора в сферической системе координат
Добрый день, реализирую в матлабе диаграмму направленности антенны. Столкнулся с проблемой в реализации сферической системы координат,...

9
 Аватар для palva
4257 / 2953 / 688
Регистрация: 08.06.2007
Сообщений: 9,862
Записей в блоге: 4
23.03.2016, 23:40
C++
1
2
3
4
    long double Len1 = sqrt((X1-Xc)*(X1-Xc)+(Y1-Yc)*(Y1-Yc)+(Z1-Zc)*(Z1-Zc));
    long double Alfa001 = atan2(Y1-Yc, X1-Xc);
    if(Alfa001<0) Alfa001 += 2*M_PI;
    long double Alfa002 = Len1==0 ? 0 : acos((Z1-Zc)/Len1);
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
24.03.2016, 01:24  [ТС]
Спасибо!
1 Можете показать вариант с atan(не с atan2)?
2 Действительно в конкретном примере координаты восстанавливаются в 100, но у меня немного обширнее задача:
нужно, чтобы фигура вращалась в 3д вокруг своего центра.
Я делал по старому - у меня она сжималась и разжималась при повороте.
Сделал по вашему - тоже сжимается и разжимается.
(меняю Fi1 += 0.01)
(а с Fi - всё нормально крутится на плоскости как и должно.)
Подскажите, пожалуйста, в чём проблема?
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
void Tetrahedron::Create()
{
    double Xc = (X1+X2+X3+X4)/4;
    double Yc = (Y1+Y2+Y3+Y4)/4;
    double Zc = (Z1+Z2+Z3+Z4)/4;
    
    putpixel(Xc,Yc,15);
    
    double Len1 = sqrt(pow(X1-Xc,2)+pow(Y1-Yc,2)+pow(Z1-Zc,2));
    double Len2 = sqrt(pow(X2-Xc,2)+pow(Y2-Yc,2)+pow(Z2-Zc,2));
    double Len3 = sqrt(pow(X3-Xc,2)+pow(Y3-Yc,2)+pow(Z3-Zc,2));
    double Len4 = sqrt(pow(X4-Xc,2)+pow(Y4-Yc,2)+pow(Z4-Zc,2));
 
    double Alfa01 = atan2(Y1-Yc, X1-Xc);
    if(Alfa01<0) Alfa01 += 2*M_PI;
    double Alfa02 = Len1==0 ? 0 : acos((Z1-Zc)/Len1);   
    
    double Alfa11 = atan2(Y2-Yc, X2-Xc);
    if(Alfa11<0) Alfa11 += 2*M_PI;
    double Alfa12 = Len2==0 ? 0 : acos((Z2-Zc)/Len2);   
    
    double Alfa21 = atan2(Y3-Yc, X3-Xc);
    if(Alfa21<0) Alfa21 += 2*M_PI;
    double Alfa22 = Len3==0 ? 0 : acos((Z3-Zc)/Len3);   
    
    double Alfa31 = atan2(Y4-Yc, X4-Xc);
    if(Alfa31<0) Alfa31 += 2*M_PI;
    double Alfa32 = Len4==0 ? 0 : acos((Z4-Zc)/Len4);
    
    Xr1=Xc + Len1 * sin(Fi1 + Alfa02) * cos(Fi + Alfa01);
    Yr1=Yc + Len1 * sin(Fi1 + Alfa02) * sin(Fi + Alfa01);
    
    Xr2=Xc + Len2 * sin(Fi1 + Alfa12) * cos(Fi + Alfa11);
    Yr2=Yc + Len2 * sin(Fi1 + Alfa12) * sin(Fi + Alfa11);
 
    Xr3=Xc + Len3 * sin(Fi1 + Alfa22) * cos(Fi + Alfa21);
    Yr3=Yc + Len3 * sin(Fi1 + Alfa22) * sin(Fi + Alfa21);
 
    Xr4=Xc + Len4 * sin(Fi1 + Alfa32) * cos(Fi + Alfa31);
    Yr4=Yc + Len4 * sin(Fi1 + Alfa32) * sin(Fi + Alfa31);
        
    line(Xr1,Yr1,Xr2,Yr2);
    line(Xr1,Yr1,Xr3,Yr3);
    line(Xr1,Yr1,Xr4,Yr4);
    line(Xr2,Yr2,Xr3,Yr3);
    line(Xr2,Yr2,Xr4,Yr4);
    line(Xr3,Yr3,Xr4,Yr4);
    
    line(X1,Y1,X2,Y2);
    line(X1,Y1,X3,Y3);
    line(X1,Y1,X4,Y4);
    line(X2,Y2,X3,Y3);
    line(X2,Y2,X4,Y4);
    line(X3,Y3,X4,Y4);
}
0
 Аватар для palva
4257 / 2953 / 688
Регистрация: 08.06.2007
Сообщений: 9,862
Записей в блоге: 4
24.03.2016, 02:03
Поворот будет только если вы добавляете угол поворота к Alfa1 (ну или вычитаете). Это будет поворот вокруг фиксированной оси Oz. К Alfa2 ничего добавлять нельзя. Это будет уже не поворот. А если синус получившегося угла Alfa2 будет отрицательным то координаты вообще сменят знак.

С использованием только atan сейчас попробую вывести формулы.
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
24.03.2016, 02:27  [ТС]
Но мне нужен поворот в 3D, а не на плоскости =]
Альфы2 должны соответствовать тетте(всё та же вики сферические координаты), почему я не могу её изменить и тем самым повернуть точки?
Если можно...покажите, как надо вращать(в трёхмерном).
Спасибо.
0
 Аватар для palva
4257 / 2953 / 688
Регистрация: 08.06.2007
Сообщений: 9,862
Записей в блоге: 4
24.03.2016, 02:54
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    long double Len1 = sqrt((X1-Xc)*(X1-Xc)+(Y1-Yc)*(Y1-Yc)+(Z1-Zc)*(Z1-Zc));
    //long double Alfa001 = atan2(Y1-Yc, X1-Xc);
    //if(Alfa001<0) Alfa001 += 2*M_PI;
    long double Alfa001 =
        X1==Xc ?
            Y1==Yc ?
            0.0 : 
                Y1>Yc ?
                M_PI_2 :
                M_PI + M_PI_2 :
        atan((Y1-Yc)/(X1-Xc));
    if(X1<Xc) Alfa001 += M_PI;
    if(Alfa001<0) Alfa001 += 2*M_PI;
    long double Alfa002 = Len1==0 ? 0 : acos((Z1-Zc)/Len1);
В трехмерном надо вращать либо с использованием кватернионов либо вычислением углов Эйлера. Наверно есть готовые библиотеки, в которых есть эти функции.

Я неправильно вам написал выше. У вас получается не поворот вокруг оси Oz, а вокруг оси ей параллельной, проходящей через центр, который вы задаете. Но это уже не важно, поскольку вам нужно другое.

Добавлено через 3 минуты
Вообще где-то я видел готовые формулы, когда задана ось в виде вектора и величина поворота. Там матрица 3x3 с кучей синусов и косинусов. Найдите и запрограммируйте умножение на эту матрицу.
1
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
24.03.2016, 10:26  [ТС]
Этих библиотек миллион, но я хочу это сделать сам.
Нигде нету реализации 3д руками, устал искать вот и написал, у самого что-то не получается =)
Спасибо ещё раз.
0
 Аватар для palva
4257 / 2953 / 688
Регистрация: 08.06.2007
Сообщений: 9,862
Записей в блоге: 4
24.03.2016, 11:10
Сначала вам надо определиться с задачей. Проходит ли ось через начало координат или произвольно в пространстве. Как задается поворот. Вам надо задать прямую, как-то указать ее положительное направление и угол поворота. Или у вас есть новые положения осей системы координат, жестко связанной с телом. Какие-то намеки в вашем коде увидеть можно. Видимо, ось вращения проходит через заданный центр. Но тогда преобразование надо делать следующим образом: сначала перенести центр в начало координат, потом сделать поворот вокруг начала координат (это умножение на матрицу, но это отдельная тема) и потом вернуть центр на его прежнее место.
0
 Аватар для niceonehere
13 / 13 / 0
Регистрация: 14.04.2012
Сообщений: 158
26.03.2016, 14:44  [ТС]
Поразительно, всё таки нашёл 3д ручками причём в той же среде borland turbo c++

http://codelab.ru/s/126/

может кому-то пригодится
0
 Аватар для palva
4257 / 2953 / 688
Регистрация: 08.06.2007
Сообщений: 9,862
Записей в блоге: 4
26.03.2016, 16:48
niceonehere, это вы нашли повороты вокруг координатных осей. Поворота вокруг произвольной оси, пусть даже для простоты проходящей через начало координат, я там не увидел. Хотя я так и не понял, в чем заключается задача, и какая цель: сделать самому или найти реализацию.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.03.2016, 16:48
Помогаю со студенческими работами здесь

Почему так странно работает калькулятор
Здраствуйте, я сегодня решил взяться за C++, решил написать самое простое, калькулятор: #include &lt;cstdlib&gt; #include...

Почему мой div так странно позиционируется?
У меня есть страница с дивами, в аттаче есть скриншот. У меня 5 основных блоков (AAA, BBB, CCC, Community, News), которые в лежиме float:...

Почему так странно обрабатывается запрос по селекции дат?
У меня есть поле dataTime в нем хранятся данные 14.01.2020 10:08 14.01.2020 10:10 14.01.2020 10:10 14.01.2020 10:10 14.01.2020...

Почему так странно срабатывает селекция дат в запросе?
Делаю запрос к представлению код запроса SELECT orders_view.*, orders_view.data FROM orders_view WHERE orders_view.data...

Обьясните, почему код так странно считает факториалы
Добрый день, ув. форумчане. Есть код, считающий факториалы:#include &quot;stdio.h&quot; #include &quot;windows.h&quot; __int64 factorial(__int64 n)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »