Пропустить навигацию.
Главная

Нестандартные многоугольники

Для построения контура произвольного многоугольника можно воспользоваться методом Polyline, предусмотрев дублирование начальной и конечной точек в массиве xy. В отличие от такой ломаной можно залить (заштриховать) внутреннюю область многоугольника xy c учетом текущих характеристик кисти, обратившись к методу Polygon. Контур многоугольника при этом не обводится, но замыкается он автоматически, т.е. координаты начальной и конечной точек в массиве xy могут не совпадать:

имя_объекта->Canvas->Polygon(xy,last_ind); //BCB

имя_объекта.Canvas.Polygon(xy); {Delphi}

Единственным аргументом в Delphi является ссылка на открытый массив, поэтому нужда в дополнительном параметре отпала.

Для заливки замкнутой фигуры, граница которой обведена сплошной линией известного цвета, можно обратиться и к методу FloodFill:

имя_объекта->Canvas->FloodFill(x,y,col,fs);

Заливка фигуры начинается из точки с координатами (x,y). Продолжение операции зависит от значения параметров col и fs. При fs=fsSurface заливка продолжается до тех пор, пока в окрестности текущей точки находятся пикселы цвета col. При fs=fsBorder заливка продолжается до выхода на граничные пикселы цвета col.

Обращаем ваше внимание на то, что заливка фигур правильно выполняется в тех случаях, когда в контуре отсутствуют самопересечения. На примере звезды, проведенной единым росчерком пера через 5 наиболее удаленных вершин, вы можете убедиться, что просто так залить полученную фигуру нельзя ни методом Polygon, ни методом FloodFill. Если бы мы строили звезду, проводя короткие отрезки между каждыми смежными вершинами, то получилась бы нормальная невыпуклая фигура, которую бы полностью залил как метод Polygon, так и метод FloodFill.

Приложение 8_10 (Delphi).

В приведенном ниже приложении на форме помимо объекта PaintBox1 находится компонент StatusBar1 (Строка Состояния), на котором выделены 4 панели для фиксации координат мыши при перемещении ее курсора. В панели с индексами 0 и 2, соответственно, внесен текст "x=" и "y=".

procedure TForm1.PaintBox1Paint(Sender: TObject);

var

p:array [0..5] of Tpoint;

begin

p[0].X:=140; p[0].Y:=10;

p[1].X:=120; p[1].Y:=60;

p[2].X:=170; p[2].Y:=30;

p[3].X:=110; p[3].Y:=30;

p[4].X:=160; p[4].Y:=60;

p[5].X:=140; p[5].Y:=10;

with Sender as TPaintBox do

begin

Canvas.Pen.Color := clWhite;

Canvas.Brush.Color := clBlack;

Canvas.Polygon([Point(40, 10),Point(20, 60),

Point(70, 30),Point(10, 30),Point(60, 60)]);

Canvas.Polyline(p);

Canvas.FloodFill(140,40,clWhite,fsBorder);

end;

end;

procedure TForm1.PaintBox1MouseMove(Sender: TObject;

Shift: TShiftState; X, Y: Integer);

begin

StatusBar1.Panels[1].Text:=IntToStr(X);

StatusBar1.Panels[3].Text:=IntToStr(Y);

end;

end.

Пример работы этого приложения показан на рис. 8.8. Нетрудно догадаться, что для полной заливки правой звезды потребовалось бы еще 5 обращений к методу FloodFill с указанием координат внутренних точек в каждом луче. Но даже и в этом случае внутренняя часть звезды отделялась бы от лучей белой границей. Так что гораздо проще добавить еще 5 точек с координатами внутренних вершин и один раз обратиться к методу Polygon.

Машинная графика

Рис. 8.8. Заливка сложной фигуры