Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Полигон с дыркой 
:(
    Опции темы
Flap
Дата 10.4.2006, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Как в векторных редакторах реализован алгоритм закраски полигона, из которого с помощью булевых операций "вырезан" другой полигон? Или, хотя бы, как это реализовать с помощью функций winapi?
PM MAIL   Вверх
nostromo
Дата 10.4.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Что конкретно Вас интересует: подходящие структуры данных для хранения таких вещей (тогда winapi как бы ни причем),
или процесс рендеринга при выводе на экран?
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Flap
Дата 10.4.2006, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Я пока еще не могу ответить на этот вопрос, но положение вещей таково:
Разработаны структуры данных с помощью которых я могу комфортно редактировать и хранить полигоны сложной формы, состоящие из различных линий и кривых. Рендеринг пока осуществляется с помощью функций winapi. В данный момент встала задача реализации булевых операций. Дырка в бублике, например, это частный случай операции вычитания.

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

Наверно, так будет правильнее.


PM MAIL   Вверх
nostromo
Дата 10.4.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



Тогда желательно ответить еще на ряд вопросов:

Как выглядит структура полигона?
Строго говоря, если границы могут быть криволинейными, то это уже
не полигон.

Что Вы понимаете под булевыми операциями?
Не знаете как определить рузультирующий цвет или
результирующую область?

Что касается области, то обычно структуры хранения плоских полигонов содержат среди прочего список сторон, записанных в виде функций вида A*x + B*y + C (хранятся, естественно, только коэффициенты).
Для точек прямой f(x,y) = 0, для области с одной стороны от прямой
f(x,y)>0, с другой стороны --- f(x,y)>0.

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

Вполне возможно, Ваши проблемы решатся путем использования подходящей библиотеки, которая все это умеет.

И еще, на сайтах, посвященных компьютерной графике, наверняка полно всевозможных вводных статей, книг, и даже реализаций. Обратитесь сначала туда.

Может быть, конечно, Вы разрабатываете что-то очень специализированное и уникальноое. Тогда расскажите подробнее.
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
Flap
Дата 10.4.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Рассмотрим пример:

Есть розовый полигон сложной формы (две линии и две кривые). Из него хочу вырезать белый пятиугольник так, чтобы просвечивал зеленый.

Структура полигона представляет собой массив вершин, сегментов их соединяющих и класса, отвечающего за закраску полигона. Выршины, сегменты и заливка - это все классы, естественно.

Это сообщение отредактировал(а) Flap - 10.4.2006, 16:35

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  sample1.PNG 3,36 Kb
PM MAIL   Вверх
nostromo
Дата 10.4.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 194
Регистрация: 23.3.2006

Репутация: 5
Всего: 10



И все же сначала нужно уточнить постановку вопроса:

1. Умеете ли Вы выводить на экран, то, что хранится в структуре?
2. Допускает ли Ваша структура хранение результата вычитания одного полигона из другого?
3. Если да, то будет ли алгоритм, строящий этот результат вычитания, тем что Вы хотите? Или все же проблемы с выводом на экран?
--------------------
На пыльных тропинках далеких планет останутся наши следы.
PM MAIL   Вверх
maxim1000
Дата 10.4.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



ну раз уж упомянули WinAPI, то можно воспользоваться его средствами:
1. создаем промежуточный device context
2. рисуем на нем внешний полигон и заполняем его нужным цветом
3. рисуем на нем вычитаемый полигон и заполняем его ненужным цветом (этот цвет будет означать прозрачность)
4. переносим с него на основной device context с помощью TransparentBlt, указывая при этом выбранный прозрачный цвет


--------------------
qqq
PM WWW   Вверх
SoWa
Дата 10.4.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


Профиль
Группа: Комодератор
Сообщений: 2422
Регистрация: 18.10.2004

Репутация: 6
Всего: 74



Или- раз уже вырезали прямоугольник- то и создадим новый полигон из этой фигурки с TransparenColor=White.
Затем поместим под него зелений треугольник и все. Рендеринг по-моему без разницы как делать.


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Flap
Дата 11.4.2006, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Большое спасибо за ответы. Все решается с помощью комбинирования регионов. Как это дела сохранять - дело техники. Буду думать.
PM MAIL   Вверх
regis
Дата 14.4.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



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

--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
Flap
Дата 28.4.2006, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.11.2005

Репутация: нет
Всего: нет



Можно поподробней. Что значит четностного многоугольника? А еще до кучи не помешал бы алгоритм пересечения невыпуклых многоугольников. Вообще была бы красота.
Большое спасибо.
 
PM MAIL   Вверх
maxim1000
Дата 28.4.2006, 22:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: 33
Всего: 110



Цитата(Flap @  28.4.2006,  12:34 Найти цитируемый пост)
А еще до кучи не помешал бы алгоритм пересечения невыпуклых многоугольников.

для этого лучше создать новую тему...
глядишь, чего-нибудь и придумаем... 


--------------------
qqq
PM WWW   Вверх
regis
Дата 11.5.2006, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 232
Регистрация: 12.12.2005
Где: Москва, Россия

Репутация: нет
Всего: 7



Цитата(Flap @ 28.4.2006,  13:34)
Можно поподробней. Что значит четностного многоугольника? А еще до кучи не помешал бы алгоритм пересечения невыпуклых многоугольников. Вообще была бы красота.
Большое спасибо.

Многоугольник "четностным" не бывает, таким может быть алгоритм заполнения (Even/Odd Rule). имеется в виду то, что если от "внешнего пространства" какую-то область отделяет нечетное число отрезков, то она заполняется; если четное -- остается нетронутой.
 
--------------------
В. В чем разница между hardware и software?О. В отличие от второго, по первому можно двинуть кулаком или пнуть ногой.
PM MAIL WWW   Вверх
RomanEEP
Дата 18.5.2006, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

Репутация: нет
Всего: 8



Можешь попробовать использовать библиотеку glu:
Разбиваешь каждый контур (если он задан кривыми) на линии и задаешь их
gluBeginContour .. gluEndContour
На выходе получишь набор треугольников. 
PM MAIL   Вверх
Earnest
Дата 23.5.2006, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 7
Всего: 183



Цитата(Flap @  28.4.2006,  14:34 Найти цитируемый пост)
Можно поподробней. Что значит четностного многоугольника? А еще до кучи не помешал бы алгоритм пересечения невыпуклых многоугольников. Вообще была бы красота.


Если многоугольник - это именно многоугольник (т.е. никаких кривых), то алгоритм, вкратце такой:
1. Полигоны должны быть ориентированы определенным образом, например, чтобы "внутри" было слева. 
Т.е.  самопересекающиеся полигоны нужно сначала "нормализовать". 
2. Строим эвклидов граф, вычисляя все пересечения и отслеживая принадлежность каждого ребра. Причем фиксируем ориентацию ребер и различаем, где полигон (слева, вправа). 
3. Отфильтровываем "лишние" ребра (по принципу что слева, а что справа).
4. Обходим то, что осталось.
5. Для того, чтобы все корректно работало, нужно обязательно ограничить точность сравнения точек - т.е. округлять их до некоторой сетки.

Алгоритм годится для любых операций с полигонами - объединения, разности, ... Изменяется только принцип отсева ребер. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Алгоритмы | Следующая тема »


 




[ Время генерации скрипта: 0.1124 ]   [ Использовано запросов: 20 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.