Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Igors от Октябрь 06, 2013, 19:05



Название: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 19:05
Добрый день

Есть отрезок в трехмерном пр-ве заданный 2-мя точками p0(x, y, z) и p1(x, y, z). Требуется повернуть отрезок на заданный угол alpha вокруг оси проходящей через точку p0 и имеющей направление dir(x. y, z).

Ну что, пацаны, опять будет "молчание ассистентских ягнят" - или есть смелые?  :)

Спасибо


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 06, 2013, 20:25
http://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula вроде оно


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 21:56
http://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula вроде оно
Никогда этого не видел. Прочитав впал в просрацию/меланхолию - потому что как превратить это в реальный код = ноль мыслей  :)

Боже мой, ну ведь здесь всего три значения (ну пусть каждое вектор), значит и решение должно быть нормальным, простым. Мысли?


Название: Re: Повернуть отрезок
Отправлено: m_ax от Октябрь 06, 2013, 22:29
Задачка плюшевая..

Предлагаю обобщить алгоритм на случай произвольной размерности)


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 06, 2013, 22:32
Задачка плюшевая..
Зачем вы так.
Это аффинные преобразование... одна из немногих тем где уважаемый гуру может показать себя. ;)


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 22:42
Задачка плюшевая..

Предлагаю обобщить алгоритм на случай произвольной размерности)
Ну флаг Вам в руки - с удовольствием послушаю для 4 размерностей (4-я = время)

Это аффинные преобразование... одна из немногих тем где уважаемый гуру может показать себя. ;)
Мне остается только сожалеть что мои лавры не дают Вам покоя  :) Вот удобный случай - я никогда не понимал что значит "аффинные" (Афтна - богиня проституции). Объясните пожвлуйста куда здесь керосин заливать?  :)


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 06, 2013, 22:48
Мне остается только сожалеть что мои лавры не дают Вам покоя  :)
А кто говорил про лавры? Вы сами? :)

Вот удобный случай - я никогда не понимал что значит "аффинные" (Афтна - богиня проституции). Объясните пожвлуйста куда здесь керосин заливать?  :)
Так вы в википедию зайдите, там все на пальцах объясняют. Прямо в первом предложении. :)


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 06, 2013, 22:55
Никогда этого не видел. Прочитав впал в просрацию/меланхолию - потому что как превратить это в реальный код = ноль мыслей  :)
эта формула вызывает сложности в реализации?
(http://upload.wikimedia.org/math/6/6/0/660710c59e17341d460676bee702ecc8.png)

или в чем загвоздка?
Цитировать
Афтна - богиня проституции
может Афродита? да и отсутствие второй буквы «ф» тоже как бы намекает.


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 23:03
А кто говорил про лавры? Вы сами? :)
Агааа  :)

Так вы в википедию зайдите, там все на пальцах объясняют. Прямо в первом предложении. :)
По-моему там написано полное фуфло  :) Если не так, прошу показать на живом примере

Код
C++ (Qt)
QVector3D p0(0, 0, 0);
QVector3D p1(0.4, 0,5, 0.7);
QVector3D dir(0.707, 0,707, 0.707);
alpha = M_Pi / 6 (30 degrees)
 
Решение фыркркающего знатока(ов)?  :)


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 23:06
эта формула вызывает сложности в реализации?
(http://upload.wikimedia.org/math/6/6/0/660710c59e17341d460676bee702ecc8.png)
Конечно вызывает - я даже не знаю с чего начать


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 06, 2013, 23:10
По-моему там написано полное фуфло  :) Если не так, прошу показать на живом примере
Пожалуйста, я всегда готов помочь, даже в таком простом вопросе:
Цитировать
Аффи́нное преобразование (от лат. affinis — соприкасающийся, близкий, смежный)

И это... гоните от себя эти мысли про проституток... Лучше почитайте про что-то еще, кроме аффинных преобразований.



Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 06, 2013, 23:20
эта формула вызывает сложности в реализации?
(http://upload.wikimedia.org/math/6/6/0/660710c59e17341d460676bee702ecc8.png)
Конечно вызывает - я даже не знаю с чего начать
вектор — p1-p0, синус/косинус — стандартными функциями, сложение векторов и умножение вектора на скаляр — думаю можно не объяснять, скалярное произведение — сумма произведений компонент, векторное произведение — (http://upload.wikimedia.org/math/3/d/3/3d3f79a279ece404c977607da945632c.png). даже если в проекте не используется ни одна математическая библиотека, эти операции пишутся за 5 минут (действительно нужно блеснуть познаниями программирования?). или я чего-то в корне не понимаю? вон у QVector3D даже есть статические методы для вычисления произведений.


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 06, 2013, 23:27
Аффи́нное преобразование (от лат. affinis — соприкасающийся, близкий, смежный)
И это... гоните от себя эти мысли про проституток... Лучше почитайте про что-то еще, кроме аффинных преобразований.
Ну одно другому не мешает, код повортота предъявляем, а не только базарим


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 06, 2013, 23:36
Ну одно другому не мешает, код повортота предъявляем, а не только базарим
Вот и я про то-же. А то вы только базарите.


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 06, 2013, 23:43
Код
C++ (Qt)
   QVector3D p0(0, 0, 0);
   QVector3D p1(0.4, 0.5, 0.7);
   QVector3D dir(0.707, 0.707, 0.707);
   double alpha = M_PI / 6;
 
   QVector3D v = p1 - p0, k = dir - p0;
   QVector3D v_rot = v * cos(alpha) + QVector3D::crossProduct(k, v) * sin(alpha) + QVector3D::dotProduct(k, v) * (1 - cos(alpha)) * k;
   qDebug() << v_rot; // QVector3D(0.524257, 0.43411, 0.748715)


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 07, 2013, 04:45
Код
C++ (Qt)
   k;
   qDebug() << v_rot; // QVector3D(0.524257, 0.43411, 0.748715)
Давайте проверимся, здравый смысл говорит что после поворота длина вектора не должна измениться.

Было
0.4*04 + 0.5*0.5 + 0.7*0.7 = 0.16 + 0.25 + 0.49 = 0.9 (квадрат длины)

Стало
0.524257^2 + 0.43411^2 + 0.748715^2 = заметно больше 0.9, т.к каждая компонента больше
 
kambala, я уважаю когда доказывается делом/кодом (а не трепом как у предыдущих докладчиков). Но все-таки концы с концами должны сходиться. И хотелось бы понимать откудв эта формула взялась, почему так получается. Спасибо


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 07, 2013, 08:20
я уважаю когда доказывается делом/кодом
Да всем все равно, что вы уважаете, а что нет.

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


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 07, 2013, 09:36
я немного невнимательно прочитал входные данные формулы: ось должна задаваться ортом. единственное изменение кода будет
Код
C++ (Qt)
k = (dir - p0).normalized()
и результат будет (0.475598, 0.417863, 0.706538).

я не являюсь специалистом в аналитической/компьютерной геометрии (даже пришлось лезть в вики вспоминать что такое векторное произведение), так что объяснить как выводится формула сейчас не смогу. из того, что я вижу, основная хитрость находится в самом начале выведения. может тут вам будет понятнее:
http://mathworld.wolfram.com/RodriguesRotationFormula.html
http://mathworld.wolfram.com/RotationFormula.html


Название: Re: Повернуть отрезок
Отправлено: m_ax от Октябрь 07, 2013, 10:20
Задачка плюшевая..
... одна из немногих тем где уважаемый гуру может показать себя. ;)

Пожалуй может, но только там, где ещё не заканчивается его бытовой опыт.. т.е. критическая размерность D=3. 


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 08, 2013, 12:50
Да всем все равно, что вы уважаете, а что нет.
Ну что же Вы прибегаете к таким дешевым приемам? :) Пытаетесь задеть собеседника, раздражаетесь - а ведь никто в тему на аркане Вас не тянул

Пожалуй может, но только там, где ещё не заканчивается его бытовой опыт.. т.е. критическая размерность D=3.  
А Вы можете осознать что есть 4 и более измерений? Нет, ну тупо производить операции с векторами - ума много не надо, но чему это соответствует в реальном мире? Так чего "морщить носик" - отрезок от этого никак не повернулся, даже бытовой  :)

я немного невнимательно прочитал входные данные формулы: ось должна задаваться ортом. единственное изменение кода будет
Код
C++ (Qt)
k = (dir - p0).normalized()
и результат будет (0.475598, 0.417863, 0.706538).
Хммм... ну опять-таки неясно почему так, откуда это взялось

я не являюсь специалистом в аналитической/компьютерной геометрии
Я тоже не являюсь, да и что значит "специалист в геометрии"? Это курс первого семестра первого курса (по крайней мере в мое время было так) который считается легким. В практической работе это почему-то не так  :)

Ладно, вернемся к отрезку. Очевидно что если отрезок совпадает с осью вращения - он каким был таким и останется. И наоборот, перпендикулярный повернется полностью. Поэтому нам надо представить отрезок в виде суммы 2 векторов - проекцию на ось и на плоскость перпендикулярную оси. Первая компонента никак не меняется при вращении. Вторая вращается по тем же самым школьным формулам

cos(a + b) = cos(a) * cos(b) - sin(a) * sin(b)
sin(a + b) = cos(a) * sin(b) + cos(b) * sin(a)

C той лишь разницей что a и b - вектора. Наверняка в итоге и получится формула товарища Родригеса. Да, но такие выкладки - чисто для научных работников, поэтому я хотел бы послушать. Увы, пока с их стороны лишь дешевые понты, ничего более  :'(


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 13:00
Ну что же Вы прибегаете к таким дешевым приемам? :) Пытаетесь задеть собеседника, раздражаетесь - а ведь никто в тему на аркане Вас не тянул
Вооот, будем как в детском саду учить на личном примере. :)
Вас в раздел для новичков тоже на арканом не тянули, но вы пришли и спровоцировали конфликт.


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 08, 2013, 13:10
Вооот, будем как в детском саду учить на личном примере. :)
Вас в раздел для новичков тоже на арканом не тянули, но вы пришли и спровоцировали конфликт.
И правильно сделал, т.к. не могу видеть жизнь столь унылой и серой. А Вы, мужчина, Вы сосредоточьтесь на поворте отрезка - может там какие скрипты помогут, ну и вообще, Ваш богатый опыт  :)


Название: Re: Повернуть отрезок
Отправлено: m_ax от Октябрь 08, 2013, 13:13
А Вы можете осознать что есть 4 и более измерений? Нет, ну тупо производить операции с векторами - ума много не надо, но чему это соответствует в реальном мире? Так чего "морщить носик" - отрезок от этого никак не повернулся, даже бытовой  :)

Осознать могу) Так же как могу осознать, что тела состоят из молекул, молекулы из атомов и т.д.. А Вы можете принять только то, что можете пощупать сами?
И для того что бы что-то предсказать совершенно не обязательно полагаться на бытовой опыт: более того скажу, с начала двадцатого века все наши теории, которые мы пытались строить из соображений бытового опыта - терпели неудачи и только там, где от этого бытового опыта мы отказывались в пользу больше аксиоматического подхода - то все концы с концами начинали сходиться)

ЗЫ По поводу реальной размерности нашего пространства - вопрос до сих под открытый..






    


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 13:15
А Вы, мужчина, Вы сосредоточьтесь на поворте отрезка - может там какие скрипты помогут, ну и вообще, Ваш богатый опыт  :)
Это вам нужно сосредоточиться, что бы с этим разобраться. :)
Вам уже все показали, но теперь вы требуете что бы еще и разжевали. Сам, все сам. Такая у нас профессия, долго на поверхностных знаниях из интернет-уроков не протянуть.


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 08, 2013, 13:35
Цитировать
Хммм... ну опять-таки неясно почему так, откуда это взялось
могу объяснить как я понимаю картинку на вики: переносим систему координат так, чтобы ось совпала с осью z; проектируем наш вектор в плоскость, перпендикулярную оси; поворачиваем его там; «поднимаем» вектор обратно. в математике конечно желательно понимать то, что используешь, но это не всегда обязательно. плюс изобретение велосипедов оправдано намного реже, чем в программировании.
Цитировать
Я тоже не являюсь, да и что значит "специалист в геометрии"? Это курс первого семестра первого курса (по крайней мере в мое время было так) который считается легким.
пишете программу, очень тесно связанную с геометрией, и не являетесь специалистом? печально.

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


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 08, 2013, 13:35
Осознать могу
Такая у нас профессия, долго на поверхностных знаниях из интернет-уроков не протянуть.
Мужчины, пожалуйста меньше лирики и больше дела/кода. От того что Вы умничаете - отрезок никак не повернется  :)


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 13:54
Мужчины, пожалуйста меньше лирики и больше дела/кода. От того что Вы умничаете - отрезок никак не повернется  :)
Что так и не повернулся?
Забейте, есть еще куча тем в интернете, где можно рассказать о своей "крутизне". Это у вас лучше получается. :)


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 08, 2013, 14:44
Что так и не повернулся?
Забейте, есть еще куча тем в интернете, где можно рассказать о своей "крутизне". Это у вас лучше получается. :)
Когда-то (давно) я работал в советской организации и меня (и еще 2 пацанов) послали в командировку в Узбекистан. Пошли на базар скупляться. Видим - отличная дыня, спрашиваем - цена норм, ну достаем деньги.. Возмущению продавца не было предела. " Почему ты говоришь "ну давай" - ты думаешь мне нужны твои деньги?. Я сюда поговорить с людьми пришел! А ты "ну давай" - зачем ты меня обижаешььь?, Бери бесплатно, кушай, русский" (восточный акцент передать не могу).

Напрасно Вы ищете "ловушки" в моих темах, типа "я, мол, знаю решение" - я его не знаю, правда. Конечно я реализовал поворот из тех соображений что я изложил выше. Но все-таки интересно а как грамотно/правильно?



Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 15:09
Напрасно Вы ищете "ловушки" в моих темах, типа "я, мол, знаю решение" - я его не знаю, правда. Конечно я реализовал поворот из тех соображений что я изложил выше. Но все-таки интересно а как грамотно/правильно?
Я уже давно в ваших темах ничего не ищу, да и что мне думать, если очевидно, что вы не знаете не только решения, а даже где его искать.
В общем, ничего кроме помпезных заявлений от вас никто не ждет. :)


Название: Re: Повернуть отрезок
Отправлено: Bepec от Октябрь 08, 2013, 15:33
Вау вау тише тише. Спокойнее!

Я понимаю, зима на носу, холодно и радости в жизни нет, но не стоит же фигней страдать.
(http://cs403531.vk.me/v403531749/3a59/oRMfyaKW6Kw.jpg)


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 08, 2013, 17:33
Я уже давно в ваших темах ничего не ищу, да и что мне думать, если очевидно, что вы не знаете не только решения, а даже где его искать.
В общем, ничего кроме помпезных заявлений от вас никто не ждет. :)
Почему-то вспомнилось "Джон-Мэри настырный парень, все хочет быть капитаном"  :)". Ладно, про поворот в пр-ве ничего сказать не можете (кроме банального "разберись сам") - ну тау умолкайте и не засоряйте эфир, не мешайте тем у кого мысли есть.


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 17:37
не мешайте тем у кого мысли есть.
Ну тем у кого есть мысли я не мешаю. :)
Ладно.


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 08, 2013, 18:09
я понять не могу чем не устраивает приведенная формула Родригеса (которая, кстати, всплыла менее, чем за 5 минут поиска в гугле). тем, что не понятно, как она выводится? или она неправильно вектор поворачивает?


Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 08, 2013, 18:13
я понять не могу чем не устраивает приведенная формула Родригеса (которая, кстати, всплыла менее, чем за 5 минут поиска в гугле). тем, что не понятно, как она выводится? или она неправильно вектор поворачивает?
Блин, не выдержал. :)
Да не нужна она никому была с самого начала эта формула. Тема была создана в надежде, что сюда никто не зайдет, ну и гуру "победит без боя". А тут вы. :)
Умолкаю. :)


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 09, 2013, 00:50
:D видно плохо слежу за развитием событий в темах Igors'а

прочитав первый пост, я не поверил, что не существует готового решения — такая задача должна возникать много где


Название: Re: Повернуть отрезок
Отправлено: ssoft от Октябрь 09, 2013, 12:55
Решение простое - необходимо выполнить несколько преобразований в 3D.

Умножаем точки на матрицу переноса из p0 в начало отсчета.
Умножаем точки на матрицу поворота относительно произвольной оси (http://ru.wikipedia.org/wiki/Матрица_поворота (http://ru.wikipedia.org/wiki/Матрица_поворота)).
Умножаем точки на матрицу переноса из начала отсчета в p0.
Все!

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

Да и напомню материал из курса компьютерной графики

3D точка определяется как столбец (x, y, z, 1)
3D вектор определяется как столбец (x, y, z, 0)
3D трансформация - это матрица 4x4, где 3x3 - часть отвечающая за поворот, а последний столбец отвечает за перенос, последняя строка выглядит как (0, 0, 0, 1)

Да и вектор относительно которого вращаем не забываем нормировать.

  Wxx Wxy Wxz Tx
  Wyx Wyy Wyz Ty
  Wzx Wzy Wzz Tz
  0     0     0     1

Для 2-х точек тоже самое можно представить еще проще

p0 не изменяется
p1 = p0 + (p1-p0) * M

где
  точки определены как (x, y, z)
  M - матрица поворота 3x3 относительно произвольной оси из википедии.

Вообще, для всех операций в Qt есть необходимые классы QVector3D/QVector4D и QMatrix3D/QMatrix4D.

Код
C++ (Qt)
 
QVector3D p0(0, 0, 0);
QVector3D p1(0.4, 0,5, 0.7);
QVector3D dir(0.707, 0,707, 0.707);
alpha = M_Pi / 6;// (30 degrees)
QMatrix4x4 M;
M.rotate( alpha, dir.normalized() );
 
p1 = p0 + (p1 - p0) * M; // так или p1 = p0 + M.map(p1 - p0);
 
 
 

Задачка плюшевая..

Предлагаю обобщить алгоритм на случай произвольной размерности)

На случай произвольной размерности задачка просто не обобщается, так как вращение в пространстве происходит не относительно оси, а в двухмерной плоскости. И только в 3D пространстве вектору соответствует одна и только одна перпендикулярная плоскость.


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 09, 2013, 15:48
я понять не могу чем не устраивает приведенная формула Родригеса (которая, кстати, всплыла менее, чем за 5 минут поиска в гугле). тем, что не понятно, как она выводится?
Ну в общем-то да, хотелось бы понимать почему так получается. Правильно она работает или нет - да хз, то ли ее можно применять только для нормированных векторов, то ли нет - не знаю. Конечно прижмет - придется использовать что нашлось. Но разве нас кто-то торопит? Почему бы не посидеть и не разобраться капитально во всех тонкостях? В конечном итоге обойдется дешевле

Решение простое - необходимо выполнить несколько преобразований в 3D.

Умножаем точки на матрицу переноса из p0 в начало отсчета.
Умножаем точки на матрицу поворота относительно произвольной оси (http://ru.wikipedia.org/wiki/Матрица_поворота (http://ru.wikipedia.org/wiki/Матрица_поворота)).
Умножаем точки на матрицу переноса из начала отсчета в p0.
Все!
Ну вот, нормальный разговор! Конечно преобразование линейное, матричное, всегда определено и обратимое (кстати почему - доказать не могу  :)). Поэтому и к бабке не ходи - матрица есть. Я не вполне понял Ваши рассуждения, сам конструировал матрицу так:

Создаю 2 матрицы, ось Y - одна и та же для обеих, оси X - отличаются на угол поворота, оси Z - что получилось. Теперь домножая первую транспонированную на 2-ю я имею нужную. Это работает для любого числа точек.  Однако для сопливого отрезка получается ужасно громоздко   :'(

На случай произвольной размерности задачка просто не обобщается, так как вращение в пространстве происходит не относительно оси, а в двухмерной плоскости. И только в 3D пространстве вектору соответствует одна и только одна перпендикулярная плоскость.
Согласен




Название: Re: Повернуть отрезок
Отправлено: Old от Октябрь 09, 2013, 17:09
Я не вполне понял Ваши рассуждения
Почитайте эту и следующую главу:
http://sernam.ru/book_mm3d.php?id=59
В начале есть объяснение на пальцах.


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 09, 2013, 17:40
Правильно она работает или нет - да хз, то ли ее можно применять только для нормированных векторов, то ли нет - не знаю. Конечно прижмет - придется использовать что нашлось. Но разве нас кто-то торопит? Почему бы не посидеть и не разобраться капитально во всех тонкостях? В конечном итоге обойдется дешевле
после этого мне окончательно ясно, что понятие строгости математики либо для вас является пустым звуком (велосипеды = win) либо вы в своем численном (неабстрактном) мире просто не понимаете как это. формула Родригеса выводится довольно просто и решение получается абсолютно негромоздким, еще и работать быстрее будет (не нужно вычислять матрицу поворота и умножать на нее). а чтобы проверить корректность решения, можно взять простенький пример, который легко посчитать ручками, и сравнить с результатом применения формулы.
Решение простое - необходимо выполнить несколько преобразований в 3D.

Умножаем точки на матрицу переноса из p0 в начало отсчета.
Умножаем точки на матрицу поворота относительно произвольной оси (http://ru.wikipedia.org/wiki/Матрица_поворота (http://ru.wikipedia.org/wiki/Матрица_поворота)).
Умножаем точки на матрицу переноса из начала отсчета в p0.
Все!
Ну вот, нормальный разговор!
поправьте если я ошибаюсь, но я практически то же самое описал «простыми словами» (приведенное в вики доказательство ведь геометрическое, наглядное). или настолько неочевидно, что перенос системы координат и поворот вектора выполняется умножением матриц? да, от проекции и обратной операции (rejection) можно избавиться, если зафиксировать соответствующие элементы матрицы.


Название: Re: Повернуть отрезок
Отправлено: Igors от Октябрь 11, 2013, 09:20
после этого мне окончательно ясно, что понятие строгости математики либо для вас является пустым звуком (велосипеды = win) либо вы в своем численном (неабстрактном) мире просто не понимаете как это.
Вот как я поворачиваю
Код
C++ (Qt)
QVector3D MyRotate( const QVector3D & vec. // поворачиваемый вектор (длина любая)
                   const QVector3D & dir,  // ось пворота, длина должна быть = 1
                   qreal alpha )                 // угол поворота  
{
// проекция vec на ось вращения
QVector3D vec_z = dir * QVector3D::dotProduct(vec, dir);
 
// проекция vec на плоскость вращения
QVector3D vec_x = vec - vec_z;
 
// вторая ось в плоскости (длина ее = первой)
QVector3D vec_y = QVector3D::crossProduct(dir, vec_x);
 
// школьная формула поворота
QVector3D rot = vec_x * cos(alpha) - vec_y * sin(alpha);
 
// возвращаем проекцию в плоскости (повернутую) + проекцию на ось (она не изменилась)
return rot + vec_z;
}
 
Вот тут мне все понятно что делаю и почему это работает. Но как это соотносится с формулой Родригеса? Смущает та самая "строгость математики"  :)

Edit:
или настолько неочевидно, что перенос системы координат и поворот вектора выполняется умножением матриц?
Необязательно, перенос и поворот могут выполняться и простыми операциями с векторами (см выше). Конечно результат будет тот же, просто выписывание матрицы не всегда удобно


Название: Re: Повернуть отрезок
Отправлено: kambala от Октябрь 11, 2013, 09:26
если все ваши операции собрать в одну (т.е. получить уравнение относительно неизвестного vec_rot = rot + vec_z) и выполнить преобразования, тогда и получится формула.

результат-то совпадает? :)