Russian Qt Forum
Июнь 25, 2018, 11:17 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 ... 19 20 [21]   Вниз
  Печать  
Автор Тема: Геометрия (задачки)  (Прочитано 58599 раз)
deMax
Программист
*****
Offline Offline

Сообщений: 564



Просмотр профиля
« Ответ #300 : Февраль 12, 2018, 08:27 »

Если бы нужно было только треугольник построить, то достаточно найти длину трех сторон и построить этот треугольник на плоскости. (самый быстрый способ для нахождения треугольника и для восстановления треугольника достаточно хранить 3 стороны, а не 3 вектора и матрицу)
А вот для нахождения матрицы придется решать систему уравнений.
Записан
ViTech
Бывалый
*****
Offline Offline

Сообщений: 448



Просмотр профиля
« Ответ #301 : Февраль 12, 2018, 12:04 »

Жила-была точка "a" на плоскости, как полагается, имела координаты a.x и a.y. Теперь кто-то взял и повернул оси координат, вместо обычных X и Y они вот стали axisX и axisY, причем их напр-я известны в начальных.
...

Чем этот подход отличается от того, что предложил m_ax?

Код
C++ (Qt)
// build 3 normalized axes
QVector3D axisZ = QVector3D::normal(a, b, c);
QVector3D axisX = (b - a).normalized();
QVector3D axisY = QVector3D::crossProduct(axisZ, axisX);
 
// save the axes into matrix
QMatrix4x4 M;
M.setRow(0, axisX);
M.setRow(1, axisY);
M.setRow(2, axisZ);

Сформировали Вы матрицу поворота одним из способов, исходя из своих соображений, и ... хорошо Улыбающийся.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #302 : Март 17, 2018, 10:10 »

Извиняюсь за задержку, почему-то(?) не увидел Ваших ответов, обнаружил их только когда хотел запостить новую задачку.

А вот для нахождения матрицы придется решать систему уравнений.
Нет, матрица выписывается напрямую, и даже есть готовый метод для этого  Улыбающийся

Чем этот подход отличается от того, что предложил m_ax?
См нижнюю матрицу - это поворот вокруг одной из координатных осей, а для производного тр-ка и ось поворота произвольна. Возможно m_ax уточняет это в своем ЗЫ, но с таким наукообразным стилем изложения понять мудрено.

Сформировали Вы матрицу поворота одним из способов, исходя из своих соображений, и ... хорошо Улыбающийся.
Так я ж смещение оставил на закуску!
есть еще мелкая пакость смещение, ведь центр новой СК необязательно в (0, 0, 0). Конечно можно назначить его напр в точке A отняв ее от всех точек ABC, но хотелось бы чисто, одной матрицей.
Ну что, покажем как это делается - или опять отмолчимся до оглашения ответа, а потом будем иронизировать?  Улыбающийся

Update: хотя эту задачку и можно свести к "матрице поворота" - такой подход, на мой взгляд, неверен. Рассматривать ее как "построение СК" гораздо лучше - и для понимания, и для реализации
« Последнее редактирование: Март 17, 2018, 10:23 от Igors » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #303 : Март 20, 2018, 11:17 »

Ладно, поехали дальше

28) Нарисовать (т.е. "визуализировать") QMatrix4x4. А то табличка чисел (что выдает qDebug()) мало информативна
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #304 : Апрель 23, 2018, 09:30 »

28) Нарисовать (т.е. "визуализировать") QMatrix4x4.
И глухо (как в танке) Улыбающийся. А ведь визуальное изображение матриц каждый видел сотни раз (если не больше). Да-да, это просто тройка осей обычно рисуемая RGB цветами (аттач).

Вернемся к предыдущей задаче. Не надо там ничего "поворачивать", решать "системы уравнений" и.т.п. Просто представить картинку, вот же она, матрица, "живьем". Это локальная СК (система координат) с центром в точке A. Синяя ось Z - нормаль к тр-ку. Красная ось X - любой вектор в плоскости тр-ка, хотя бы AB, Зеленую Y вычисляем из Z и X. Если мы множим точку на эту матрицу, то мы переводим ее в локальную СК, а в ней все что лежит в плоскости тр-ка имеет z = 0, что и требовалось. Вписываем эти оси в строки матрицы (column-mаjor) - и вся любовь. Др словами если мы матрицу "видим", то можем ее просто "записать". Это самый простой (и самый лучший) способ создания матрицы, поэтому такой вызов есть в любом API.

Ну а обратное тем более верно - если мы имеем матрицу, то конечно можем ее "увидеть", т.е. нарисовать. Ну с осями все просто - берем строки матрицы да рисуем, нужно только подгадать масштаб чтобы удачно выглядело на экране.

А вот где взять центр? Последний столбец матрицы работать не будет, самой точки A в матрице нет. Опять "прильнем к основам". Нам нужна точка которая в локальной СК имеет координаты (0, 0. 0). Значит помножим ее на обратную и получим точку A (центр в исходной СК)
Код
C++ (Qt)
QVector3D center = matrix.inverted() * QVector3D();

Возможно все это кажется ну очень простым, "элементарным" и.т.п.  Это не совсем так, такая простота обманчива  Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2545


Просмотр профиля
« Ответ #305 : Май 22, 2018, 16:59 »

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

Я туповат... А почему тройка, а не 4ка? Верно я понимаю, что строки - это вектора - 3 координаты + длина? Или нет?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #306 : Май 23, 2018, 09:32 »

А почему тройка, а не 4ка?
Потому что в 3D пр-ве 3 оси. Последняя строка - не ось, это дополнение необходимое для некоторых операций (напр транспонирование - поменять местами строки/столбцы). Обычно она (0, 0, 0, 1)

Верно я понимаю, что строки - это вектора - 3 координаты + длина? Или нет?
Не совсем, длина явно не хранится. Если мы хотим вытянуть объект напр по X, то первые 3 числа множим на масштаб, т.е. красный вектор станет больше/меньше. А в последнем столбце - смещение, т.е. центр тройки. Причем в локальной СК (а не в исходной). Напр если мы хотим нарисовать ту же картинку, но с красной осью длиннее - в матрице должно сидеть уже др смещение (хотя на рисунке центр останется там же).

Ну и не стоит "слишком твердо" запоминать "строки". Красный вектор - это то на что множится (скалярно) исходная точка/координата и получается локальный X. QMatrix4x4 следует column-major соглашению, для него умножение точки на матрицу (перевод в локальную СК) определено как
Код
C++ (Qt)
local_point = matrix * source_point
Т.е. строка матрицы множится на столбец исходной точки, поэтому вектора на картинке - строки. Но при др соглашении это уже не так.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #307 : Май 28, 2018, 13:53 »

Еще матрицы? (они так милы). Вот задачка чуть-чуть сложнее предыдущей

29) Жил-был треугольник ABC, и юзер его как-то крутил и двигал много раз. В результате известны только 3 конечные точки (A2, B2, C2). Для простоты полагаем что длины сторон остались теми же.

Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)

Записан
deMax
Программист
*****
Offline Offline

Сообщений: 564



Просмотр профиля
« Ответ #308 : Май 28, 2018, 16:14 »

Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)
берем матрицу сдвига, чтобы А стал в центре системы координат,
потом вращаем чтобы AB стал A2 B2 (QQuaternion::rotationTo(AB, A2B2) -> получаем угол -> матрица поворота).
потом аналогично QQuaternion::rotationTo(AC', A2C2) -> еще матрица поворота.
и потом двигаем точку A в координаты A2
перемножаем матрицы, профит!

если стороны изменят длинну, тогда масштабированием нужно исправить длинну, тоже можно но уже надо чуть подумать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #309 : Май 29, 2018, 04:29 »

берем матрицу сдвига, чтобы А стал в центре системы координат,
потом вращаем чтобы AB стал A2 B2 (QQuaternion::rotationTo(AB, A2B2) -> получаем угол -> матрица поворота).
потом аналогично QQuaternion::rotationTo(AC', A2C2) -> еще матрица поворота.
и потом двигаем точку A в координаты A2
перемножаем матрицы, профит!
Да, и здесь можно действовать через повороты, но их уже 2 и выходит совсем коряво. Зачем? Есть же красивое решение в 1 строку.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #310 : Май 30, 2018, 08:25 »

Есть детская книжка, про хоббитов. Называется "Туда и обратно".  Здесь этот прием в чистом виде, причем выше подробно разжевали как "туда". Ну это я уже изо всех сил подсказываю  Улыбающийся

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

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

Сообщений: 3914



Просмотр профиля
« Ответ #311 : Май 30, 2018, 08:57 »

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

P.S. Как все таки жалко выглядят потуги оправдать свою безграмотность. И главное вся "гениальность" проявляется в одной узенькой области, которую чудом удалось освоить по книгам. Грустный
Записан
deMax
Программист
*****
Offline Offline

Сообщений: 564



Просмотр профиля
« Ответ #312 : Май 30, 2018, 09:02 »

предположу, засунуть координаты треугольника в матрицу 3х3. тогда M1 * Mтрансформации = M2. 
Смеющийся Mтрансформации = M2 / M1

Только для перемножения матриц придется размер до 4ей наростить, ну и не деление а умножение на обратную матрицу.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #313 : Май 30, 2018, 10:42 »

предположу, засунуть координаты треугольника в матрицу 3х3. тогда M1 * Mтрансформации = M2. 
Смеющийся Mтрансформации = M2 / M1

Только для перемножения матриц придется размер до 4ей наростить, ну и не деление а умножение на обратную матрицу.
А можно внятнее? Как "засунуть тр-к в матрицу"? И какой засовывать (их здесь 2)?

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

- мы строим матрицу для перевода в локальную СК тр-ка. Правила перевода мы выбираем таким образом чтобы все точки в плоскости тр-ка имели z = 0 в локальной СК.

Т.е. для любого планарного тр-ка мы уже умеем строить матрицу перевода в его локальную СК. Возвращаемся к текущей задачке. Здесь надо просто подоить ту же корову дважды
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10050


Просмотр профиля
« Ответ #314 : Июнь 05, 2018, 10:57 »

Ну вот.. и парнишка затих (из второго батальона). Не вышло на готовых классах - и усе. Ладно, попробуем чуть иначе
Цитировать
Жил-был треугольник ABC, и юзер его как-то крутил и двигал много раз. В результате известны только 3 конечные точки (A2, B2, C2). Для простоты полагаем что длины сторон остались теми же.

Найти QMatrix4x4 для перевода тр-ка из начального положения в конечное, т.е. если применим ее к (A, B. C) то получатся (A2, B2. C2)
Вот эта "неизменность длин" фактически означает: в локальной СК все точки (local_A, local_B, local_C) будут получаться одни т те же для разных тр-ков т.е.

- исходные тр-ки имеют разные точки, напр (A, B, C) и (A2, B2, C2)
- соответственно и матрицы перевода в локальные СК разные
- а вот после умножения на матрицы
local_A, = local_A2
local_B = local_B2
local_C = local_C2

В какой же вумной книге я это прочитал? Та ни в какой Улыбающийся Представим наблюдателя в точке A тр-ка - он смотрит на точку B (или С). Пусть тр-к несется с огромной скоростью и вращается в космосе подобно планете Земля. Но для наблюдателя точка B где была - там и осталась, сам-то тр-к никто не вытягивал и не сжимал.

Да, но это "художественное" объяснение, а в геометрии все положено доказывать. Хорошо, давайте так. Ось малюнок (аттач). Точку A(A2) мы выбирали центром локальной СК, там ее координаты (0, 0, 0). по-любому одинаковы. Локальную ось X мы вычислили как нормированный вектор стороны AB, стало быть  local_X(X2) = ((B - A).length(), 0, 0) - тоже одинаковы, ведь длина AB у тр-ков одинакова. С точкой С(C2)  чуть сложнее, ее координаты - проекции на локальные оси. Но поскольку угол A у тр-ков тот же самый (и длина AB та же) - то и проекции те же

Значит, что получается? Из (A, B. C) в локаль - имеем матрицу. Из (A2, B2. C2) в локаль - тоже имеем. И в локали одно и то же... Ну и..... 


Записан
Страниц: 1 ... 19 20 [21]   Вверх
  Печать  
 
Перейти в:  

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