Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с многоугольниками. Требуется закрасить полигон. 
:(
    Опции темы
FataList
Дата 27.6.2006, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!

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

 
PM MAIL   Вверх
Coocky
Дата 27.6.2006, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Создаешь регион на основе этих точек, а потом все просто-CDC::FillRgn  


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Earnest
Дата 27.6.2006, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Есть функция CDC::Polygon. Ставишь в контекст кисть и перо (для границы) и рисуешь. 


--------------------
...
PM   Вверх
Coocky
Дата 27.6.2006, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

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



Цитата(Earnest @  27.6.2006,  14:42 Найти цитируемый пост)
Есть функция CDC::Polygon.

Ну да.. smile  Действительно  smile  Рисуя полигон, мы его закрашиваем smile  Забыли-с.  smile 
Вот из МСДН. Красный ромб
Код

 CBrush brushRed(RGB(255, 0, 0));
  CBrush* pOldBrush = pDC->SelectObject(&brushRed);

  CPoint pts[4];
  pts[0].x = rect.left + rect.Width()/2;
  pts[0].y = rect.top;

  pts[1].x = rect.right;
  pts[1].y = rect.top + rect.Height()/2;

  pts[2].x = pts[0].x;
  pts[2].y = rect.bottom;

  pts[3].x = rect.left;
  pts[3].y = pts[1].y;

  pDC->Polygon(pts, 4);
  pDC->SelectObject(pOldBrush);

 


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
FataList
Дата 27.6.2006, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, все работает, все закрашивается  smile 

Я реализовал это так 
Код


  CRgn Region;
  CPoint ptVertex[3];

  ptVertex[0].x = Vertex_Polygon[A].x; 
  ptVertex[0].y = Vertex_Polygon[A].y;
  ptVertex[1].x = Vertex_Polygon[B].x;  
  ptVertex[1].y = Vertex_Polygon[B].y;
  ptVertex[2].x = Vertex_Polygon[C].x;
  ptVertex[2].y = Vertex_Polygon[C].y;

  CBrush brush(RGB(200, 200, 200));
  CBrush* oldbrush = pDC->SelectObject(&brush);

  Region.CreatePolygonRgn(ptVertex, 3, ALTERNATE);
  FillRgn(pDC->m_hDC, (HRGN)Region, brush); 

  pDC->SelectObject(oldbrush);


Замучился пока разобрался в этом. 


Продолжение эпопеи.

Теперь есть полигон, который разбивается на треугольники - триангуляция, но разбивается выпуклый полигон(треугольник).
Это не работает, когда заданная "территория" является не выпуклой (например, вид штанов).
Задача состоит в том, чтобы правильно разбить на треугольники не выпуклый полигон и эти треугольники (координаты вершин) сохранить в массиве со структурой.
Код

struct VertexTriangle
  {
    CPoint v_A, v_B, v_C;
  };
  VertexTriangle Traingles[NumberTraingles]; 


Один из вариантов реализаци:
Берем любую вершину, пусть будет A, и две смежные ей: B и C (треугольник ABC).
Выпуклым треугольником является треугольник, у которого угол BAC будет < 180 град. Делается это как-то через умножение одной смежной стороны на  другою (AB * BC).
Если условия выполняются, то отсекаем этот треугольник и записываем его координаты вершин в массив.
Это не самый лучший метод, но должен работать. Вопрос в том, как его экономично реализовать, т.к. меня постоянно тенят на усложнение кода. Приходится потом упрощать. Это лечится?   smile 

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


Бывалый
*


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

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



Ну лечится то всеsmile
Давай написанный код.. Я его упрощу по максимуму.. smile 
 
PM MAIL   Вверх
Earnest
Дата 28.6.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Модератор: Пожалуйста, один топик - один вопрос. 


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


Новичок



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

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



Earnest, а как сменить описание темы, не мененяя самой темы? Или удалить все и создать заново? 
PM MAIL   Вверх
Earnest
Дата 29.6.2006, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Новую тему создай, и постарайся, чтобы название темы отражало ее суть. 


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




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


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

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