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

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Распознать кубик  (Прочитано 29221 раз)
ufna
Гость
« Ответ #15 : Февраль 12, 2011, 21:17 »

Цитировать
Хмм... не выглядит изящным, да и как это сделать?

А Вам задачу решить нужно, или красиво решить? Улыбающийся Решать "изящно" на Ваш вкус нет ни времени ни желания, честно Улыбающийся

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

Цитировать
Не думаю так. Лучше сначала найти матрицу поворота и помножить все точки на ей обратную - задача сводится к первоначальной.

Не думаю. Основания для определения такой матрицы? Может быть и есть, но "проще" они точно не будут, имхо.

Цитировать
Во как - и то "элементарно" и это. Ну тогда прошу показать мне как найти матрицу поворота (это вроде проще). Конечно полагаем треугольники есть (нужны нормали)

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

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Февраль 12, 2011, 22:07 »

Насколько мне не изменяет моя память, то первое, что стоит сделать, это на основании построенных ранее плоскостей (любые три точки из сета плоскости), берем угол поворота относительно (0,0,0) по каждой из осей. Далее задача чисто тригонометрическая, в чем сложность?
Вот уж не предполагал что здесь нужна память  Улыбающийся Теряюсь в догадках что то за "угол поворота" и причем здесь тригонометрия? Ладно, давайте определимся с матрицей вращения
Код
C++ (Qt)
struct CRotMatrix {
float m[3][3];
};
 
Правило преобразования "строка (вектора) на столбец (матрицы)".
Код
C++ (Qt)
void Transform( float vec[3], const CRotMatrix & M )
{
float x = vec[0], y = vec[1], z = vec[2];
vec[0] = x * M.m[0][0] + y * M.m[1][0] + z * M.m[2][0];
vec[1] = x * M.m[0][1] + y * M.m[1][1] + z * M.m[2][1];
vec[2] = x * M.m[0][2] + y * M.m[1][2] + z * M.m[2][2];
}
 
Даны все точки и полигоны (пусть только треугольники). Находим матрицу поворота (ведь это "элементарно"  Улыбающийся)
Записан
ufna
Гость
« Ответ #17 : Февраль 12, 2011, 22:22 »

Igors, уж извините, но код и прочие мат. выкладки делайте сами, задача то 1 курс любого матфака по курсу геометрия Улыбающийся Только надо идти не от матрицы (это конечный продукт на основе трех углов), а от поиска этих самых углов. Успехов Улыбающийся
Записан
brankovic
Гость
« Ответ #18 : Февраль 12, 2011, 22:30 »

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

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Февраль 12, 2011, 22:41 »

Igors, уж извините, но код и прочие мат. выкладки делайте сами, задача то 1 курс любого матфака по курсу геометрия Улыбающийся Только надо идти не от матрицы (это конечный продукт на основе трех углов), а от поиска этих самых углов. Успехов Улыбающийся
"Матфаков" не кончал, но матрицу построю. Хотите покажу как? (только чур не злиться  Улыбающийся)

1. строим выпуклую оболочку
2. рекурсивным перебором от самых богатых граней к самым бедным ищем комбинацию граней, такую, что получается параллелепипед (собственно не обязательно прямоугольный)
Ой мама, чего ж так сложно? Кто такая "выпуклая оболочка", bound box что ли? Непрямоугольный найти не требуется - просто кубик с масштабам по осям.
Записан
ufna
Гость
« Ответ #20 : Февраль 12, 2011, 22:53 »

Igors,

ну покажите как из сиих данных построите матрицу поворота, всем же интересно чем топик закончится Улыбающийся


Цитировать
Кто такая "выпуклая оболочка", bound box что ли?

А вот это :7: как говорится, или  Шокированный
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #21 : Февраль 12, 2011, 23:10 »

Да всё просто, млин))

1) Берём любые 3 точки. (Через 3 точки всегда можно провести плоскость)
2) Перебираем оставшиеся 5 точек и для каждой проверяем, лежит ли она в данной плоскости (см п.1)
3) Если нет - это не параллепипед. Если лежит, то проверяем, является ли она 4-ой вершиной параллеограмма на плоскости. Если нет - это не параллепипед
4) Если да, запоминаем эти 4 точки. Выбираем из этих 4-ёх точек любые 2 и из оставшихся 4ёх берём любую одну точку - получается 3 точки.
5) Перебираем из оставшихся 3ёх точек каждую точку и проверяем лежит ли она в плоскости, образованой теми тремя точками. Если ни одна не лежит - это не параллепипед, если да проверяем является ли она 4ой вершиной параллеограмма. Если нет - это не параллепипед
6) Если да..
Дальше докончите сами))

Мне бы ваши проблемы Смеющийся
« Последнее редактирование: Февраль 12, 2011, 23:16 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
brankovic
Гость
« Ответ #22 : Февраль 12, 2011, 23:12 »

Ой мама, чего ж так сложно? Кто такая "выпуклая оболочка", bound box что ли? Непрямоугольный найти не требуется - просто кубик с масштабам по осям.

Если грани параллельны плоскостям OXY OXZ OYZ, то ufna уже дал решение выше. А если "масштабы по осям" это какой-то другой зверь, то лучше расшифруйте.
Записан
brankovic
Гость
« Ответ #23 : Февраль 12, 2011, 23:20 »

Да всё просто, млин))

Вы кажется условия не поняли. Даны не 8 вершин пп, а 1024 точки лежащие на его гранях..
« Последнее редактирование: Февраль 13, 2011, 17:31 от brankovic » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

ну покажите как из сиих данных построите матрицу поворота, всем же интересно чем топик закончится Улыбающийся
Берете первый треугольник, вычисляете перпендикуляр к нему (N0), нормируете и записываете как первую строку матрицы поворота. Просматриваете оставшиеся треугольники, для каждого вычисляете перпендикуляр N Находите угол между N0 и N (достаточно косинус dotProduct). Варианты

- угол = 0. Это та же грань куба, пропускаем.
- угол = 180. Это противоположная грань, пропускаем.
- угол != 90. Это вообще не куб, возвращаем false
- наконец угол = 90, выходим из цикла

Тогда записываем N как 2-ю строку матрицы и вычисляем 3-ю как векторное двух первых. Матрица поворота готова, если теперь помножить на нее все точки, то повернутая фигура встанет "по осям". Ну правда это для куба с центром в (0, 0, 0) но учесть сдвиг - неудобно и рассказывать.

Давно замечал - OpenGL и все такое - ничему хорошему не научит  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #25 : Февраль 12, 2011, 23:33 »

Да всё просто, млин))

1) Берём любые 3 точки. (Через 3 точки всегда можно провести плоскость)
Не всегда, они могут лежать на 1 прямой. Любая (или все) из граней может быть сколь угодно деталированы (т.е. точек любое число). А для только 8 точек незачем прилагать столько усилий - проще выписать др. 8 из bound box и сравнить с имеющимися.

Мне бы ваши проблемы Смеющийся
Да уж  Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #26 : Февраль 12, 2011, 23:39 »

Если грани параллельны плоскостям OXY OXZ OYZ, то ufna уже дал решение выше. А если "масштабы по осям" это какой-то другой зверь, то лучше расшифруйте.
Пардон, но не вижу "решения" а только "соображения", и хотя я с ними согласен, они довольно расплывчаты.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Я не правильно понял условие задачи.  Злой
Я имел в виду: провирить являются ли заданные 8 вершин - вершинами параллеограмма.

Тогда положение меняется))
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
ufna
Гость
« Ответ #28 : Февраль 12, 2011, 23:46 »

Igors,

это нахождение матрицы поворота для параллелипида (причем далеко не оптимальное в общем случае), а в случае сабжевой задачи будет false в общем случае. Так что я как бы не понял Вы о чем вообще? Улыбающийся

Цитировать
Не всегда, они могут лежать на 1 прямой

Еще раз  Шокированный Плоскость провести можно ВСЕГДА, вопрос ее единственности Улыбающийся
Записан
ufna
Гость
« Ответ #29 : Февраль 12, 2011, 23:48 »

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

могу уточнить еще раз Улыбающийся

а) строим bounding box в соответствии с осями
б) гоним по всем точкам на предмет их принадлежности боксу

Что тут расплывчато?
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


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