Алгоритм вырезания одной фигуры из другой

Разговоры на любые темы: вы можете обсудить здесь какой-либо сайт, найти единомышленников или просто пообщаться...
d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Алгоритм вырезания одной фигуры из другой

Сообщение d3drm » 10.07.2006 (Пн) 18:12

Приветствую =)

Возникла задача в редакторе реализовать вырезку одной фигуры из другой в 3Д. Алгоритм не разбирал изначально, знал что понадобится вырезать двумерные фигуры друг из друга и поэтому для начала реализовал класс, который вырезает из одного многоугольника другой, в результате чего получается несколько новых многоугольников (все выпуклое). Не сложная задача, но возился с ней долго...

Так вот сделал и теперь перехожу к основному вопросу. Алгоритм вырезания 3Д объектов.

Для начала объясню как у меня выглядит объект.
Объект - это совокупность выпуклых многоугольников (полигонов). Все вершины каждого многоугольника лежат в одной плоскости. В принципе тут все просто.

Теперь расскажу что я придумал и в чем сложности, чтобы Вы не подумали, что я бездельничую и сам ничего не пытаюсь делать =)

Мой алгоритм примерно таков.

Для каждой стороны ЗАДАННОГО объекта (ЗО) ищем пересечение с гранями ВЫРЕЗАЕМОГО объекта (ВО). При этом ищутся все точки пересечения граней ВО с плоскостью, где лежит сторона ЗО.

Сторона - выпуклый многоугольник, точки кот. леж. в одной плоскости.
Грань - одна грань стороны.

Собрав все точки, которые получились при пересечениях и спроецировав на плоскость- у нас есть ВЫРЕЗАЕМАЯ фигура (ВФ). Спроецировав на плоскость сторону ЗО получаем ЗАДАННУЮ фигуру (ЗФ). Тоже 2Д фигура, которая будет обрезана с помощью ВФ.

Теперь уже имеющимся алгоритмом вырезаем ВЗ из ЗФ. Получается обрезанная фигура, которую мы из проекции выносим в 3Д на место обрезанной стороны.

И так для каждой стороны.

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

Вопрос тут такой. Как сказать программе, какие из пересеченных точек составляют каждую фигуру?

Вот тут находится некоторая иллюстрация:

Изображение

Алгоритм вырезания одной фигуры из другой

На рисунке 2 конуса пересекают сторону. Как видно глазу, точки пересечения образуют 2 четырехугольника. Как объяснить программе, что эти четыре точки именно ДВА четырехугольника, а НЕ ОДИН непонятный многоугольник.

Повторюсь, что несмотря на то, что конусы далеко друг от друга - это один объект.
ХЎ

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 10.07.2006 (Пн) 20:24

Брать полигоны из 3 точек, смотреть внутри ли они ВО и если внутри то вырезать. Или надо именно придумать алгоритм определения внутри/снаружи для хитрых невыпуклых тел?

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.07.2006 (Пн) 20:29

На рисунке ни одна из точек полигона не находится внутри ВО, тем не менее вырезаются 2 четырехугольника...

Может надо уточнить задачу?
ХЎ

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 10.07.2006 (Пн) 20:47

Полигон то всё равно внутри ВО хотя все точки на границе. Задача вроде ясна. Если стороны подопытного полигона не пересекают грани ВО и точка не лежащая на его гранях (центр например) лежит внутри ВО - то вырезаем этот полигон нафиг.

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 10.07.2006 (Пн) 20:59

А вообще у тебя есть точки и линии пересечения ВО и ЗО (я надеюсь) Берем одну точку из них, по линиям пересечения красим, ищем остальные. Получаем первый квадрат (не квадрат, а вообще границу), вырезаем. Если что-то осталось, ищем второй, третий и.т.д.


Если нет линий пересечения, то надо поглядеть алгоритм и вместо пересечений ребер использовать пересечения граней. Т.е. искать не точки пересечения грани ЗО и ребер ВО и по ним придумывать многоугольник, а сразу искать линии пересечения граней ВО и грани ЗО.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.07.2006 (Пн) 21:21

Спасибо, GAGArin, за пищу для мозгов, буду думать =) о результатах сообщу в конце лета )
ХЎ


Вернуться в Народный треп

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 139

    TopList  
cron