forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   2D-программирование (http://forum.boolean.name/forumdisplay.php?f=13)
-   -   Объединение многоугольников (http://forum.boolean.name/showthread.php?t=17817)

Serega 31.01.2013 15:55

Объединение многоугольников
 
Вложений: 2
Что-то типа программы для черчения. На рисунке 2 нарисован план дома, стены состоят из прямоугольников, каждый прямоугольник можно выделить отдельно и отредактировать(толщина стен и т.п.), при продолжении стены на стыне отображаются грани соседнего прямоугольника( на рисунке будет понятнее в красных кружках) . Ну и собственно вопрос как нарисовать план дома чтоб стены были как на рисунке 1, без перегородок при стыке. Может есть идеи, алгоритм?

Nex 31.01.2013 16:16

Ответ: Объединение многоугольников
 
Как то так: Сначала расставить/настроить все прямоугольники, а потом создать из них картинку где участок на котором лежит прямоугольник не прозрачный, а пространство самой комнаты прозрачное и сверху наложить другую картинку с диагональными линиями.
Но в Блитз3д стандартные картинки не поддерживают прозрачность так что надо подключать FastLibs.

Serega 31.01.2013 18:27

Ответ: Объединение многоугольников
 
Так наверно можно, но должен быть способ полегче, например в 3d редакторах можно объединить несколько наложенных друг на друга плоских полигонов(многоугольников) в один, рассчитываются точки пересечения, внутренняя часть отбрасывается, а внешний контур остаётся. Смотрел алгоритмы оверлея многоугольников, так там то они либо не должны самопересекаться, с дырками или без, ещё всякие условия, не сильно разобрался в этом. Ну как-то так?

Mr_F_ 31.01.2013 18:36

Ответ: Объединение многоугольников
 
Вложений: 1
вот так
боковые и нижние фейсы можно убрать

Serega 31.01.2013 19:33

Ответ: Объединение многоугольников
 
Mr_F_ , как мне получить результат как на твоей картинке (top view), я хочу попробывать реализовать это всё в 2d (если смогу:) конечно), без применения 3d, только пока не соображу путь к решению. Думаю создать тип каждого прямоугольника со своими параметрами(координаты, размеры), присоединить с привязкой стены друг к другу думаю могу, а если стенку будут пересекать много остальных и вдоль и поперёк немогу ничего придумать. коряво выложил мысли:)

Mr_F_ 31.01.2013 20:10

Ответ: Объединение многоугольников
 
2D оно в блице медленное все равно, а со всякими трюками будет ещё медленнее, юзай ортографик 3D.

Serega 31.01.2013 20:28

Ответ: Объединение многоугольников
 
Ортографик 3d -это как? А на счёт скорости - не главное, мне понять бы принцип как сделать , подскажите только), а дальше дело пойдёт легче

Mr_F_ 31.01.2013 20:41

Ответ: Объединение многоугольников
 
это 3д и камера в ортографическом режиме (без перспективы)

Serega 31.01.2013 22:18

Ответ: Объединение многоугольников
 
делать программу для 2d черчения через 3d наверно не совсем правильно, хотя может ошибаюсь, но вопрос остаётся в силе, как в blitz3d или pure basic(любой язык подойдёт с моим примером ) объединить многоугольники

dsd 31.01.2013 22:36

Ответ: Объединение многоугольников
 
стена => четыре линии
=>линия => массив отрезков
проверяем пересечение отрезка линии проходящей посередине каждого участка стены с каждой линией из текущего куска стены, если есть точка пересечения, то находим область пересечения и меняем массив отрезков рисующих эту линию текущего участка стену на такой в котором на месте пересечения линии не будет и т.д.

как-то так

Serega 01.02.2013 00:00

Ответ: Объединение многоугольников
 
Примерно так?
type прямоугольник: - стена состоит из 4 стен независимых отрезков

1---x1(1000)-координата х 1го отрезка
y1(1000)-координата y 1го отрезка

2---x2(1000)-координата х 2го отрезка
y2(1000)-координата y 2го отрезка

3---x3(1000)-координата х 3го отрезка
y3(1000)-координата y 3го отрезка

4---x4(1000)-координата х 4го отрезка
y4(1000)-координата y 4го отрезка

каждый отрезок может состоять из 1000 маленьких
начало 1го отрезка будет x1(n),y1(n) а конец x1(n+1),y1(n+1)
затем проверяем пересекает ли 1й отрезок 2й прямоугольник:
-если пересекает линию 2го значит перестаём рисовать, проверяем дальше если опять пересекает линию 2го, начинаем рисовать
Написал вроде правильно но непонятно
В массиве первые будут стоять полные длины отрезков чтоб сравнивать границы до куда рисовать эти сран...е кусочки, чёта совсем запутался(

dsd 01.02.2013 00:41

Ответ: Объединение многоугольников
 
есть массив отрезков у тебя. есть отрезок в котором не должно быть линий.
для каждого из отрезков в массиве смотришь. попадает ли он в тот отрезок в котором не должно его быть:
если попал то соответственно текущий отрезок либо совсем исчезает, либо становится короче либо бьется на два отрезка.
соответственно в результате либо удаляем элемент из массива, либо меняем, либо меняем и добавляем. вроде довольно просто.

Igor 01.02.2013 17:47

Ответ: Объединение многоугольников
 
Делаешь как Mr_F_ предложил, но в 2д - рисуешь чёрные прямоугольники (заполненные внутри), потом чуть потоньше белые

Serega 01.02.2013 19:32

Ответ: Объединение многоугольников
 
Нифига себе идея: рисую вначале все прямоугольники полностью черные и заполненые чёрным цветом, потом по тем же координатам прямоугольники белые и заполненые белым цветом? фиг бы догадался:super: Белые прямоугольники рисовать с небольшим смещением и меньшим размером, чем будут они тоньше, тем толще будет линия обводки (толщина линий окантовки). Я правильно понял?


Часовой пояс GMT +4, время: 14:38.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot