Название: Повернуть отрезок Отправлено: 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 А кто говорил про лавры? Вы сами? :) Агааа :)Так вы в википедию зайдите, там все на пальцах объясняют. Прямо в первом предложении. :) По-моему там написано полное фуфло :) Если не так, прошу показать на живом примереКод Решение фыркркающего знатока(ов)? :) Название: 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) Название: Re: Повернуть отрезок Отправлено: Igors от Октябрь 06, 2013, 23:27 Аффи́нное преобразование (от лат. affinis — соприкасающийся, близкий, смежный) Ну одно другому не мешает, код повортота предъявляем, а не только базаримИ это... гоните от себя эти мысли про проституток... Лучше почитайте про что-то еще, кроме аффинных преобразований. Название: Re: Повернуть отрезок Отправлено: Old от Октябрь 06, 2013, 23:36 Ну одно другому не мешает, код повортота предъявляем, а не только базарим Вот и я про то-же. А то вы только базарите.Название: Re: Повернуть отрезок Отправлено: kambala от Октябрь 06, 2013, 23:43 Код
Название: Re: Повернуть отрезок Отправлено: Igors от Октябрь 07, 2013, 04:45 Код
Было 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 я немного невнимательно прочитал входные данные формулы: ось должна задаваться ортом. единственное изменение кода будет
Код и результат будет (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 и более измерений? Нет, ну тупо производить операции с векторами - ума много не надо, но чему это соответствует в реальном мире? Так чего "морщить носик" - отрезок от этого никак не повернулся, даже бытовой :)я немного невнимательно прочитал входные данные формулы: ось должна задаваться ортом. единственное изменение кода будет Хммм... ну опять-таки неясно почему так, откуда это взялосьКод и результат будет (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. Код
Задачка плюшевая.. Предлагаю обобщить алгоритм на случай произвольной размерности) На случай произвольной размерности задачка просто не обобщается, так как вращение в пространстве происходит не относительно оси, а в двухмерной плоскости. И только в 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. Все! Название: Re: Повернуть отрезок Отправлено: Igors от Октябрь 11, 2013, 09:20 после этого мне окончательно ясно, что понятие строгости математики либо для вас является пустым звуком (велосипеды = win) либо вы в своем численном (неабстрактном) мире просто не понимаете как это. Вот как я поворачиваюКод Вот тут мне все понятно что делаю и почему это работает. Но как это соотносится с формулой Родригеса? Смущает та самая "строгость математики" :) Edit: или настолько неочевидно, что перенос системы координат и поворот вектора выполняется умножением матриц? Необязательно, перенос и поворот могут выполняться и простыми операциями с векторами (см выше). Конечно результат будет тот же, просто выписывание матрицы не всегда удобно Название: Re: Повернуть отрезок Отправлено: kambala от Октябрь 11, 2013, 09:26 если все ваши операции собрать в одну (т.е. получить уравнение относительно неизвестного vec_rot = rot + vec_z) и выполнить преобразования, тогда и получится формула.
результат-то совпадает? :) |