- Машинная графика
- Рисуем? Где? Чем?
- Что позволяет рисовать система VB?
- Работа с отдельными точками
- Отрезки прямых и прямоугольники
- Окружности, эллипсы, дуги и сектора
- Очистка канвы графического объекта
- Что позволяют рисовать системы BCB и Delphi?
- Отрезки прямых и ломаные
- Стандартные прямоугольники
- Нестандартные многоугольники
- Кривые второго порядка
- Обмен с графическими файлами
- Вывод символьных и числовых данных на канве
- Отображение текстовой и числовой информации в VB
- Работа с текстами в BCB и Delphi
- Графические объекты в системе VB
- Графические объекты в системах BCB и Delphi
- Копирование растровых изображений
- Создание монотонно изменяющегося фона
- Формирование регулярных заливок замкнутых областей в BCB
- Формирование регулярных заливок замкнутых областей в Delphi
Нестандартные многоугольники
Опубликовано admin в Сб, 05/08/2010 - 20:47
Для построения контура произвольного многоугольника можно воспользоваться методом 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. Заливка сложной фигуры
