Рисование изображений
Для работы с графикой в Delphi введено свойство Canvas. В Object Pascal существует стандартный класс TCanvas, поэтому можно считать, что Canvas является также и объектом. В среде Windows 98 для вывода информации используется интерфейс графических устройств GDI (Graphics Device Interface), что обеспечивает независимую от устройства (экран, принтер и др.) область рисования графических изображений. Т.е. задача программиста - просто сообщить, что надо рисовать и где. Для разных устройств используются одни и те же команды. Свойство Canvas недоступно в окне Инспектора объектов. Для построения графического изображения требуется изменить значения составных свойств или вызвать специальные методы Canvas.
Наиболее часто используемые свойства объекта Canvas - Font, Pen, Brush. Свойство Font задает характеристики текста, выводимого на канву Canvas. Свойство Реn позволяет задать тип "карандаша" — инструмента, рисующего линии. Свойство Brush определяет "кисть" - цвет и шаблон закраски внутренней области. Кроме того, к каждому пикселу канвы можно обратиться через свойство Pixels (напрямую работать с данным свойством не рекомендуется. И сложнее работать, и программа работает медленнее). Свойство Pixels[i,j] представляет собой двумерный массив цветов пикселов, где [i,j] — ее координаты.
Координаты точки на канве Canvas задаются практически аналогично Turbo Pascal. Левый верхний угол имеет координаты (0,0), а правый нижний - координаты (Width, Height). Для этого используются свойства компонента, на котором рисуют. Обычно это PaintBox.
Для канвы формы правый нижний угол имеет координаты (ClientWidth, ClientHeight).
Основные методы объекта Canvas:
Arc(xl, yl, x2, y2, хЗ, уЗ, х4, у4) - дуга эллипса. Центр эллипса совпадает с центром прямоугольника, левый верхний угол которого - (xl, yl), и правый нижний - (х2, у2), дуга соединяет точки (хЗ,уЗ) и (х4,у4) против часовой стрелки.
|
Chord (xl, yl, х2, у2, хЗ, уЗ, х4, у4) - рисование хорды (прямой линии, соединяющей две точки эллипса).
Draw (x, у, Ris) - отобразить графический объект Ris типа TGraphics в области с левым верхним углом (х, у).
Ellipse (xl, yl, x2, y2) — нарисовать эллипс, замкнутый в прямоугольник с вершинами (xl, yl) и (х2, у2).
FillRect (Rect(xl, yl, x2, y2)) - заливка прямоугольника с вершинами (х 1, у 1) и (х2, у2). Цвет заливки задан свойством Brash.Color.
FloodFill (х, у, Color, FillStyle) - заливка ограниченной области с внутренней точкой (х, у). Способ заполнения задан свойством FillStyle. Возможные значения: fsBorder и fsSurface. При первом значении закрашивается область, замкнутая линией цвета Color, иначе закрашивается область цвета Color.
MoveTo (x, у)- поместить указатель (текущей точки) в позицию (х, у).
LineTo (x, у) - нарисовать линию из текущей точки в позицию (х, у), при этом указатель также перейдет в новую позицию.
Команды Line в Delphi нет. Вместо нее используются команды MoveTo и LineTo.
Pie (xl, yl, x2, y2, хЗ, уЗ, х4, у4) - рисование сегмента эллипса, замкнутого в прямоугольник (xl, yl) - (х2, у2). Сегмент определяется двумя линиями, соединяющими центр эллипса с точками (хЗ, уЗ) и (х4, у4).
Poligon (Point) - рисование замкнутого многоугольника, заданного
массивом координат Point
PolyLine (Point) — рисование незамкнутого многоугольника, заданного массивом координат Point.
Rectangle (xl, yl, x2, y2) - рисование прямоугольника с вершинами (xl, У1) и (х2,У2).
RoundRect (xl, yl, x2, y2,x3,y3) рисование прямоугольника с закругленными углами.
StretchDraw (Rect, Ris) - рисование графическое изображение Ris в прямоугольнике Rect. При этом автоматически изменяется масштаб изображения.
|
TextOut (x, у, Text) - вывод строки, переданной в параметре Text, на экран, начиная с (х, у).
При работе с графическими изображениями в Delphi необходимо определять реакцию на событие OnPaint. В обработчике данного события пишут код, который должен перерисовывать рисунок в случае его пропажи. Причиной пропажи может послужить переход формы из невидимого состояния в видимое (например, свертывание и развертывание окна) или временное закрытие рисунка другим объектом.
Пример. При создании формы на ее канву вывести графическое изображение из файла Primer.bmp.
Создать проект. Используется свойство формы Canvas и метод Draw. Рисование изображения происходит при событии OnPaint. Для объекта класса TBitMap определены методы Create, LoadFromFile и Free. В текущем каталоге проекта должен быть графический файл Primer.bmp.
Procedure TForml.FormPaint(Sender:TObject); {Определяем графический объект}
var Ris:TBitmap;
begin
{создаем графический объект}
Ris:=TBitMap. Create;
{записываем в него содержимое графического файла}
Ris.LoadFromFile('Primer.bmp');
{выводим изображение из файла на канву формы}
Canvas. Draw(0,0,Ris);
{уничтожаем графический объект}
Ris.Free;
End;
Пример. Нарисовать на компоненте PaintBoxl прямоугольник красного цвета с зеленой границей. Толщина линии границы - 5 пиксел.
Создать проект. Поместить на форму компонент PaintBox (группа System), событие OnPaint. Используются свойства компонента PaintBoxl Canvas, его свойства Brush, Color, Pen, Width и команда Rectangle.
Procedure TForm.PaintBox 1.Paint(Sender:TObject);
{работаем с областью рисования}
With PaintBoxl.Canvas do
Begin
{Задаем цвет фона - красный}
|
Brush.Color:=clRed;
{Задаем цвет границы - зеленый}
Pen.Color:=clGreen;
{Задаем толщину линии границы}
Pen.Width:=5;
{Рисуем прямоугольник}
Rectangle(5,5,100,100);
End;
End;
Построение графиков функций
Для построения графика функции необходимо привести декартовы координаты к графическим. Для этого вычислим масштаб и сдвиг для х и у (Мх, Sx, My, Sy), решая следующие системы уравнений:
Для x:
Для y:
где xmi, xma, ymi, yma - max и min значения х и у в заданном промежутке, Ax1, Ax2, Ay1, Ay2 - размеры окна в которое хотим вывести график (следует помнить, что ymi должен находиться ниже, чем yma, иначе график будет перевернутым).
Тогда х будет вычисляться как Мх*х + Sx, а у - My*f(x) + Sy.
Ниже приведен обработчик события "Щелчок по кнопке «Выполнить», реализующий построение графика функции х2 +2х - 3 в заданном промежутке с заданным шагом.
procedure TForml.BitBtnlClick(Sender: TObject);
var
i,n:integer;
x,b,a,h,mx,my:real;
minx,maxx,miny,maxy,sx,sy:real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
h:=StrToFloat(Edit3.Text);
n:=round(abs(b-a)/h);
x:=a;
minx:=a;
maxx:=a;
miny:=x*x+2*x-3;
maxy:=x*x+2*x-3;
for i:=0 to n do begin
if minx>x then minx:=x;
if maxx<x then maxx:=x;
if miny>(x*x+2*x-3) then miny:=x*x+2*x-3;
if maxy<(x*x+2*x-3) then maxy:=x*x+2*x-3;
x:=x+h;
end;
with PaintBox1.Canvas do begin
mx:=257/(maxx-minx);
sx:=-minx*mx;
my:=241 /(miny-maxy);
sy:=-maxy*my;
x:=a;
for i:=0 to n do
begin
Pixels[round(x*mx+sx),
round((x*x+2 *x-3)*my+sy)]:=clBlue;
x:=x+h;
end;
Pen.Color:=clgreen;
moveto(0, round(sy));
lineto(257, round(sy));
{639,479}
moveto(round(sx),0);
lineto(round(sx),241); {319,239} end;
end;
Результат работы программы для функции x2+2х -3= 0, в промежутке [-5;5] с шагом 0,01.