Russian Qt Forum
Ноябрь 23, 2024, 12:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Повернуть отрезок  (Прочитано 19152 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #30 : Октябрь 08, 2013, 17:33 »

Я уже давно в ваших темах ничего не ищу, да и что мне думать, если очевидно, что вы не знаете не только решения, а даже где его искать.
В общем, ничего кроме помпезных заявлений от вас никто не ждет. Улыбающийся
Почему-то вспомнилось "Джон-Мэри настырный парень, все хочет быть капитаном"  Улыбающийся". Ладно, про поворот в пр-ве ничего сказать не можете (кроме банального "разберись сам") - ну тау умолкайте и не засоряйте эфир, не мешайте тем у кого мысли есть.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #31 : Октябрь 08, 2013, 17:37 »

не мешайте тем у кого мысли есть.
Ну тем у кого есть мысли я не мешаю. Улыбающийся
Ладно.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #32 : Октябрь 08, 2013, 18:09 »

я понять не могу чем не устраивает приведенная формула Родригеса (которая, кстати, всплыла менее, чем за 5 минут поиска в гугле). тем, что не понятно, как она выводится? или она неправильно вектор поворачивает?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #33 : Октябрь 08, 2013, 18:13 »

я понять не могу чем не устраивает приведенная формула Родригеса (которая, кстати, всплыла менее, чем за 5 минут поиска в гугле). тем, что не понятно, как она выводится? или она неправильно вектор поворачивает?
Блин, не выдержал. Улыбающийся
Да не нужна она никому была с самого начала эта формула. Тема была создана в надежде, что сюда никто не зайдет, ну и гуру "победит без боя". А тут вы. Улыбающийся
Умолкаю. Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #34 : Октябрь 09, 2013, 00:50 »

Веселый видно плохо слежу за развитием событий в темах Igors'а

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
ssoft
Гость
« Ответ #35 : Октябрь 09, 2013, 12:55 »

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

Умножаем точки на матрицу переноса из p0 в начало отсчета.
Умножаем точки на матрицу поворота относительно произвольной оси (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 пространстве вектору соответствует одна и только одна перпендикулярная плоскость.
« Последнее редактирование: Октябрь 09, 2013, 14:45 от ssoft » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #36 : Октябрь 09, 2013, 15:48 »

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

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

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

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

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


Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #37 : Октябрь 09, 2013, 17:09 »

Я не вполне понял Ваши рассуждения
Почитайте эту и следующую главу:
http://sernam.ru/book_mm3d.php?id=59
В начале есть объяснение на пальцах.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #38 : Октябрь 09, 2013, 17:40 »

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

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #39 : Октябрь 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:
или настолько неочевидно, что перенос системы координат и поворот вектора выполняется умножением матриц?
Необязательно, перенос и поворот могут выполняться и простыми операциями с векторами (см выше). Конечно результат будет тот же, просто выписывание матрицы не всегда удобно
« Последнее редактирование: Октябрь 11, 2013, 09:28 от Igors » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #40 : Октябрь 11, 2013, 09:26 »

если все ваши операции собрать в одну (т.е. получить уравнение относительно неизвестного vec_rot = rot + vec_z) и выполнить преобразования, тогда и получится формула.

результат-то совпадает? Улыбающийся
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.156 секунд. Запросов: 23.