Программирование алгоритмов с использованием графики




Рисование изображений

Для работы с графикой в 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.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-08-19 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: