Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не могу понять как работает SetPolyFillMode, вот такие дела 
:(
    Опции темы
nmn
Дата 8.8.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



к примеру данное изображение получено с PolyFillMode=ALTERNATE
user posted image
В MSDN написано что заливка производится между четными и нечетными сторонами региона, тогда почему центральный пентагон не залит?

Это сообщение отредактировал(а) nmn - 8.8.2007, 16:33
PM Skype   Вверх
Alexeis
Дата 8.8.2007, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



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


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
nmn
Дата 8.8.2007, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

procedure RotatePoint(ptCenter:TFloatPoint;var pt:TFloatPoint;Angle:real);
var r,c:real;
begin
  if Angle=0 then exit;
  with pt do
    begin
      pt.X:=pt.X-ptCenter.X;
      pt.Y:=pt.Y-ptCenter.Y;
    end;
  r:=sqrt(sqr(pt.X)+sqr(pt.Y));
  if r<>0 then
    begin
      c:=abs(RadToDeg(arcsin(pt.Y/r)));
      with pt do
        if (x<0)and(y>=0) then c:=180-c
          else if (x<=0)and(y<0) then c:=c+180
            else if (x>0)and(y<0) then c:=360-c;
      Angle:=DegToRad(Angle+c);
      with pt do
        begin
          X:=R*cos(Angle)+ptCenter.X;
          Y:=R*sin(Angle)+ptCenter.Y;
        end;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var rgn:hrgn;
    ptCenter,pt_:TFloatPoint;
    pt:array[1..5] of TPoint;
    i:integer;
begin
  ptCenter:=FloatPoint(150,150);
  for i:=1 to 5 do
    begin
      pt_:=FloatPoint(150,100);
      RotatePoint(ptCenter,pt_,360/5*2*(i-1));
      with pt[i] do
        begin
          X:=round(pt_.X);
          Y:=round(pt_.Y);
        end;
      Canvas.TextOut(pt[i].X,pt[i].Y,IntToStr(i-1));
    end;
  rgn:=CreatePolygonRGN(pt,5,ALTERNATE);
  Canvas.Brush.Color:=clWhite;
  PaintRGN(Canvas.Handle,rgn);
  DeleteObject(rgn);
end;

PM Skype   Вверх
Alexeis
Дата 9.8.2007, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Так в справке же подробно описан именно этот случай
Цитата(MSDN @ SetPolyFillMode,Remarks)

In general, the modes differ only in cases where a complex, overlapping polygon must be filled (for example, a five-sided polygon that forms a five-pointed star with a pentagon in the center). In such cases, ALTERNATE mode fills every other enclosed region within the polygon (that is, the points of the star), but WINDING mode fills all regions (that is, the points and the pentagon). 

When the fill mode is ALTERNATE, GDI fills the area between odd-numbered and even-numbered polygon sides on each scan line. That is, GDI fills the area between the first and second side, between the third and fourth side, and so on. 

When the fill mode is WINDING, GDI fills any region that has a nonzero winding value. This value is defined as the number of times a pen used to draw the polygon would go around the region. The direction of each edge of the polygon is important. 


ALTERNATE - оставит дырку ввиде пентограммы, т.е. не заливает пересекающиеся , а WINDING зальет всю звезду


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
nmn
Дата 9.8.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alexeis @  9.8.2007,  12:08 Найти цитируемый пост)
ALTERNATE - оставит дырку ввиде пентограммы, т.е. не заливает пересекающиеся , а WINDING зальет всю звезду 

вот это мне и надо было
PM Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


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

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


 




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


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

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