Эллипс и его фрагменты
По умолчанию параметру i Pol у Fi 11 Mode присваивается значение ALTERNATE. В этом случае кисть заливает только те области, в которые можно попасть, двигаясь извне по горизонтальным линиям и пересекая границу многоугольника нечетное число раз. При этом прохождение линии через точку пересечения двух ребер многоугольника или его вершину, являющуюся локальным экстремумом, надо засчитывать за два пересечения границы. Если параметру i PolyFi 11 Mode присваивается значение WINDING, то будут закрашены все внутренние области, как показано в нижней части рисунка. Режим закраски многоугольников является атрибутом контекста, и его текущее значение можно узнать,при помощи функции GetPolyFillModeO.
Реализация алгоритма закраски основана на заполнении области горизонтальными отрезками, концы которых лежат на границах многоугольника. Такой алгоритм закраски называется растровым. Он обеспечивает высокую скорость рисования за счет вычисления координат начала и конца каждого отрезка по аналитическим выражениям и быстрого рисования горизонтального отрезка, представленного в видеопамяти последовательностью байтов с возрастающими адресами.
В листинге 13.1 приведен фрагмент программы из папки Primitivs, рисующий два пятиугольника, показанных на рис. 13.1.
Листинг 13.1
POINT Points [] - {{90.25}.{105.90}.{35.50}.{115.45}.{50.90}}; POINT PointlC] - {{90.75}.{105.140}.{35.100}.{115.95}.{50.140}}; LOGBRUSH lb - {BS_SOLID.RGB(0.0.255).HS_DIAGCROSS}; HDC hdc - GetDC(hWnd);
HBRUSH hb - SelectObject(hdc.CreateBrushIndirect(&lb));
HPEN hp - (HPEN) SelectObjectChdc.
CreatePen(PS_DASH.1.RGB(255.0.0)));
Polygon (hdc. Points.5);
SetPolyFillMode (hdc. WINDING);
Polygon (hdc. Pointl.5);
DeleteObject(SelectObject(hdc. hb)):
DeleteObject(SelectObject(hdc. пз));
ReleaseDC(hWnd.hdc);
В данном фрагменте параметры кисти задавались при помощи структуры LOGBRUSH 1 b. В первом поле структуры задана сплошная кисть, поэтому последнее поле с типом штриховки при создании кисти игнорируется. Верхний пятиугольник закрашен в режиме ALTERNATE, а нижний - в режиме WINDING.