- Настройки шрифта для вывода строк на канву
with Image1.canvas.font do
begin
color:= clNavy; // Цвет символов
style:= []; //Начертание символов
name:= ‘Arial Cyr’; //Имя шрифта
size:= 14; //Размер шрифта
end;
В приведённом выше фрагменте процедуры настройки шрифта — стиль (Style) это массив стилей, поэтому стили можно складывать. Массив имеет следующие значения:
[] — пустое значение — нормальный шрифт;
[fsBold] — жирный шрифт;
[fsItalic] — шрифт Италик (наклонный);
[fsStrikeOut] — Перечеркнутый шрифт;
[fsUnderLine] — Подчеркнутый шрифт;
Имена шрифтов (name) — все имена, содержащиеся в операционной системе, например Times New Roman, Ms Sans Serif, Courier New, .
Размер шрифта (Size) — может принимать значения от 1 до 32768.
Для вывода строки текста, с настроенным предварительно шрифтом, на канву следует воспользоваться процедурой TextOut(x,y,’Строка текста’);. Не следует забывать, что эта процедура должна относиться к определенному холсту (в программе холстов может быть много), поэтому следует четко указывать объект на котором мы хотим разместить надпись, например так: Image25.canvas.textout(10,20,’Строка’);. Координаты x и y определяют начало первого символа надписи на холсте (в пикселях). - Следующим шагом при рисовании является настройка пера (карандаша) для рисования — свойство Pen:
with Image1.canvas.pen do
begin
width:= 2; // Толщина карандаша в пикселях
color:= clBlack; // Цвет карандаша
end;
Сам холст тоже может иметь цвет, который задается свойством canvas.brush.color:= clWhite;
Произведя все настройки, можно начинать рисование.
Для рисования на холсте имеются следующие процедуры:
with image1.canvas do
begin
MoveTo(10,10); // Перемещает перо в точку с координатами 10,10
LineTo(100,100); //Рисуем линию из точки 10,10 к точке 100,100
Rectangle(10,10,100,100); // Рисуем прямоугольник с координатами верхнего левого угла 10,10 и координатами нижнего правого угла 100, 100
Ellipse(10,10,100,100); // Рисуем эллипс вписанный в виртуальный прямоугольник с начальной координатой 10,10 и конечной координатой 100,100
end;
На самом деле процедур для рисования намного больше, нежели чем перечислено выше, причем с каждой новой версией Delphi их количество увеличивается, поэтому для рисования следует воспользоваться справочником графических процедур и функций для конкретной версии Delphi или Lazarus.
Еще одно свойство, которое часто используется для рисования, это свойство Pixels. Pixels — это массив всех точек в области холста. Пиксели можно как записывать на холст с определенным цветом: Image1.Canvas.Pixels[x,y]:= clRed;, так и считывать с холста цвет пикселя: variable:= Image1.canvas.pixels[x,y];. В приведенном выше свойстве Pixels — координатами пикселя являются X и Y, variable — переменная, которая должна иметь тип LongInt.
Уроки программирования в Lazarus. Урок №31. Примеры на OpenGL

Графика в Lazarus
Создание приложения «Построитель графиков»
Создайте новый проект. Разместите на окне компонент панель и присвойте панели свойство Align = alBottom. Панель будет расположена внизу окна. Установите в окне компонент Image и присвойте свойству Align значение alClient. Форме присвойте свойству BorderStyle значение bsSingle, а свойству caption значение «Построитель графиков функций».
Установите на панель строчный редактор Edit1 — в него мы будем вводить имя функции. Затем установите на панель редакторы Edit2 и Edit3 в которые мы будем вводить начальное и конечное значение угла функции соответственно.
Еще нам понадобятся 2-е кнопки (Button1, Button2). Первая будет очищать лист, подготавливая его для вывода графика, а вторая будет выводить на лист непосредственно график по заданным параметрам введенным в редакторы. Кнопке Button1 присвойте заголовок «Строить», а кнопке Button2 — заголовок «Очистить». У вас должно получиться приложение показанное на рисунке:

Сначала следует создать событие onCreate для формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
// Очищаем редакторы и присваиваем значения по умолчанию
edit1.text:= ‘SIN’;
edit2.text:= ‘1’;
edit3.text:= ‘600’;
end;
Затем, нам следует создать событие onClick на нажатие кнопки «Очистить»:
procedure TForm1.Button2Click(Sender: TObject);
var r: TRect; // обьявляем переменную типа прямоугольник
begin
// Присваиваем переменной r размер нашего листа Image1
r:= rect(0, 0, image1.width, image1.height);
with Image1.canvas do
begin
brush.style:= bsSolid; // Присваиваем кисти тип заливки — «полная»
brush.color:= clWhite; //делаем цвет холста белым
fillrect(r); //заливаем холст заказанным цветом
pen.color:= clRed; //задаем цвет карандаша: красный
// Рисуем рамку по периметру листа
rectangle(2, 2, image1.width-2, image1.height-2);
// Рисуем ось Х для будущего графика посредине листа
moveto(2,image1.Height div 2);
lineto(image1.width-2, Image1.Height div 2);
end; end;
И наконец, нам осталось создать событие на построение графика вычисления синуса или косинуса — нажатие кнопки Button1- «Строить»:
procedure TForm1.Button1Click(Sender: TObject);
var
alpha1, alpha2: Integer; // переменные для начального и конечного значения угла
z: integer; // переменная для организации цикла
q: integer; // внутренний счетчик
fun: integer; // Значение функции в цикле
begin
alpha1:= StrToInt(edit2.text); //Считываем начальное значение угла
alpha2:= StrToInt(Edit3.Text); // Конечное значение угла
q:= 2;
for z:= alpha1 to alpha2 do // Создаем цикл от начального до конечного значения угла
begin
if UpperCase(Edit1.text) = ‘SIN’ then
fun:= round(sin(z*3.14/180)*60);
if UpperCase(Edit1.text) = ‘COS’ then
fun:= round(cos(z*3.14/180)*80);
image1.canvas.pixels[q,fun+ image1.Height div 2]:= clBlack;
inc(q);
end;
end;
Рассмотрим подробнее действия происходящие в цикле:
Строка: if UpperCase(Edit1.text) = ‘SIN’ then fun := round(sin(z*3.14/180)*60);
означает, что если строка преобразованная к символам верхнего регистра из редактора ввода функции (Edit1) равна значению ‘SIN’, то следует вычислять синус для всех значений z и присваивать переменной fun. Так как эта переменная целого типа, то значение функции следует округлять до целого значения функцией round. Так как аргумент функции должен быть в радианах, а мы вводим угол в градусах, то следует преобразовать градусы в радианы — (z*3.14/180). Далее мы помножаем значение синуса на 60. 60 это масштабный коэффициент амплитуды функции, чем он больше, тем больше амплитуда кривой по оси Y.
Аналогичным образом устроена строка:
if UpperCase(Edit1.text) = ‘COS’ then fun:= round(cos(z*3.14/180)*80); только здесь производится вычисление косинуса и масштабный коэффициент равен 80.
Строка — image1.canvas.pixels[q, fun+ image1.Height div 2]:= clBlack; означает следующее: последовательно, точка за точкой выводим на экран график выбранной функции. С каждым тактом цикла смещаем точку по оси Х на расстояние q, а по оси Y смещаем на значение функции (fun) и плюс ? высоты листа, для того чтобы график проходил положительными значениями над осью Х, а отрицательными значениями под осью Х. Последняя строка цикла inc(q) — увеличение значения q на 1 с каждым тактом цикла. Запустите полученную программу на исполнение, нажмите кнопку «Очистить», а затем кнопку «Строить» — вы получите график синуса со значениями по умолчанию. Затем введите другое значение например COS и нажмите кнопку «Строить», у вас должно получиться примерно то, что изображено на рисунке.
Источник: hi-intel.ru
Графические примитивы класса TCanvas в Lazarus
Класс TCanvas — сердцевина графической подсистемы Delphi (Lazarus). Он объединяет в себе и «холст» (контекст конкретного устройства GDI), и «рабочие инструменты» (перо, кисть, шрифт) и даже «подмастерьев» (набор функций по рисованию типовых геометрических фигур).
Канва не является компонентом, но она входит в качестве свойства во многие другие компоненты, которые должны уметь нарисовать себя и отобразить какую-либо информацию.
Для рисования канва включает в себя шрифт, перо и кисть:
(рb) property Font: TFont ; (Pt) property Pen: TPen; (Рb) property Brush: TBrush;
Кроме того, можно рисовать и поточечно, получив доступ к каждому пикселу. Значение свойства
property Pixels [ X , Y : Integer ] : TColor;
соответствует цвету точки с координатами (X,Y).
Класс TCanvas
| procedure Arc ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; | Метод рисует сегмент эллипса. Эллипс определяется описывающим прямоугольником (X1,Y1) — (X2,Y2). Начальная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X3,Y3). Конечная точка сегмента лежит на пересечении эллипса и луча, проведенного из его центра через точку (X4,Y4). Сегмент рисуется против часовой стрелки. |
| procedure Chord ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; | Рисует хорду и заливает отсекаемую ею часть эллипса. Эллипс, начальная и конечная точки определяются, как в методе Arc. |
| procedure Ellipse ( X1 , Y1 , X2 , Y2 : Integer ) ; | Рисует и закрашивает эллипс, вписанный в прямоугольник (X1,Y1) — (X2,Y2). |
| procedure MoveTo ( X , Y : Integer ) ; | Перемещает текущее положение пера (свойство PenPos) в точку (X,Y). |
| procedure LineTo ( X , Y : Integer ) ; | Проводит линию текущим пером из текущей точки в (X,Y). |
| procedure BrushCopy ( const Dest : TRect; Bitmap : TBitmap; const Source : TRect; Color : TColor ) ; | Производит специальное копирование. Прямоугольник Source из битовой карты Bitmap копируется в прямоугольник Dest на канве; при этом цвет Color заменяется на цвет текущей кисти (Brush.Color). |
| procedure CopyRect ( const Dest : TRect; Canvas : TCanvas; const Source : TRect ) ; | Производит копирование прямоугольника Source из канвы Canvas в прямоугольник Dest в области самого объекта. |
| procedure FillRect ( const Rect : TRect ) ; | Производит заливку прямоугольника (текущей кистью). |
| procedure Draw ( X , Y : Integer ; Graphic : TGraphic ) ; | Осуществляет рисование графического объекта Graphic |
| procedure StretchDraw ( const Rect : TRect; Graphic : TGraphic ) ; | Осуществляет рисование объекта Graphic в заданном прямоугольнике Rect. Если размеры их не совпадают, Graphic масштабируется. |
| procedure FloodFill ( X , Y : Integer ; Color : TColor; FillStyle : TFillStyle ) ; TFillStyle = ( fsSurface , fsBorder ) ; | Производит заливку области текущей кистью. Процесс начинается с точки (X,Y). Если режим FillStyle равен fsSurface, то он продолжается до тех пор, пока есть соседние точки с цветом Color. В режиме fsBorder закрашивание, наоборот, прекращается при выходе на границу с цветом Color. |
| procedure Pie ( X1 , Y1 , X2 , Y2 , XЗ , Y3 , X4 , Y4 : Integer ) ; | Рисует сектор эллипса, описываемого прямоугольником (X1,Y1) — (X2,Y2). Стороны сектора лежат на лучах, проходящих из центра эллипса через точки (X3.Y3) и (X4,Y4). |
| procedure Polygon ( const Points : array of TPoint ) ; | Строит многоугольник, используя массив координат точек Points. При этом последняя точка соединяется с первой и внутренняя область закрашивается. Polygon ([Point(10,10), Point(30,30),Point(20,40)]) |
| procedure Polyline ( const Points : array of TPoint ) ; | Строит ломаную линию, используя массив координат точек Points. |
| procedure Rectangle ( X1 , Y1 , X2 , Y2 : Integer ) ; | Рисует прямоугольник с диагональю заданной координатами (X1,Y1) и (X2,Y2). |
| procedure RoundRect ( X1 , Yl , X2 , Y2 , ХW , YH : Integer ) ; | Рисует прямоугольник с закругленными углами. Координаты вершин — те же, что и в методе Rectangle. Закругления рисуются как сегменты эллипса с размерами осей по горизонтали и вертикали ХW и YH. |
| function TextHeight ( const Text : string ) : Integer ; | Возвращает высоту строки Text в пикселах. |
| function TextWidth ( const Text : string ) : Integer ; | Возвращает ширину строки Text в пикселах. |
| procedure TextOut ( X , Y : Integer ; const Text : string ) ; | Производит вывод строки Text. Левый верхний угол помещается в точку канвы (X,Y). |
| procedure TextRect ( Rect : TRect; X , Y : Integer ; const Text : string ) ; | Производит вывод текста с отсечением. Как и в TextOut, строка Text выводится с позиции (X,Y); при этом часть текста, лежащая вне пределов прямоугольника Rect, отсекается и не будет видна. |
| property PenPos : TPoint; | Содержит текущую позицию пера канвы (изменяется посредством метода MoveTo). |
procedure TForm1.Button1Click(Sender: TObject); begin with Paintbox1.Canvas do begin Brush.
Color := clGray; Rectangle(10,100,250,300); // корпус Polygon([Point(0,100),Point(130,20),Point(260,100)]); // крыша Brush.Color := clWhite; Ellipse(110,40,150,80); // чердак Rectangle(30,150,110,230); // окно MoveTo(70,150); LineTo(70,230); Rectangle(150,300,230,150); // дверь Brush.Color := clGray; Polygon([Point(150,300),Point(150,150),Point(210,160),Point(210,300)]); end; end;
Источник: grafika.me
Графические возможности Lazarus
Lazarus позволяет программисту разрабатывать программы, которые могут выводить графику: схемы, чертежи, иллюстрации. Программа выводит графику на поверхность объекта (формы или компонента Image). Поверхности объекта соответствует свойство canvas . Для того чтобы вывести на поверхность объекта графический элемент (прямую линию, окружность, прямоугольник и т. д.), необходимо применить к свойству canvas этого объекта соответствующий метод. Например, для вычерчивания в окне программы прямоугольника, задается команда: Form1.Canvas.Rectangle (10,10,100,100)
| Объект Свойство | Метод |
Свойство canvas — это объект
типа TCanvas. Методы этого типа обеспечивают вывод графических примитивов (точек, линий, окружностей, прямоугольников и т. д.), Свойства задают характеристики выводимых графических примитивов: цвет, толщину и стиль линий; цвет и вид заполнения областей; характеристики шрифта при выводе текстовой информации.
Холст состоит из отдельных точек — пикселов. Положение пиксела характеризуется его координатами (X,Y). Левый верхний пиксел имеет координаты (0, 0). Координаты возрастают сверху вниз и слева направо. Значения координат правой нижней точки холста зависят от размера холста.
Размер холста можно получить, обратившись к свойствам Height и width области иллюстрации (image) или к свойствам формы: ClientHeight и Clientwidth.
Карандаш и кисть
Художник в своей работе использует карандаши и кисти. Методы, обеспечивающие вычерчивание на поверхности холста графических примитивов, тоже используют карандаш и кисть. Карандаш применяется для вычерчивания линий и контуров, а кисть — для закрашивания областей, ограниченных контурами. Карандашу и кисти, используемым для вывода графики на холсте, соответствуют свойства Реn (карандаш) и Brush (кисть), которые представляют собой объекты типа TPen и TBrush , соответственно. Значения свойств этих объектов определяют вид выводимых графических элементов.
Карандаш
Карандаш используется для вычерчивания точек, линий, контуров геометрических фигур: прямоугольников, окружностей, эллипсов, дуг и др. Вид линии, которую оставляет карандаш на поверхности холста, определяют свойства объекта треп, которые перечислены в табл. 10.1. Свойства объекта карандаш
| Свойство | Определяет |
| Color | Цвет линии |
| Width | Толщину линии |
| Style | Вид линии |
| Mode | Режим |
| отображения |
Значение свойства Color определяет цвет линии
| Константа | Цвет | Константа | Цвет |
| clBlack | Черный | clNavy | Темно-синий |
| clSilver | Серебристый | clFuchsia | Ярко-розовый |
| clMaroon | Каштановый | clPurple | Розовый |
| clRed | Красный | clAqua | Бирюзовый |
| clGreen | Зеленый | clTeal | Зелено-голубой |
| clLime | Салатный | clWhite | Белый |
| clOlive | Оливковый | clGray | Серый |
| clBlue | Синий |
Свойство width задает толщину линии (в пикселах). Например, инструкция Canvas. Pen. width: =2 устанавливает толщину линии в 2 пиксела.
Значение свойства Реn.Style определяет вид линии
| Константа | Вид линии |
| psSolid | Сплошная линия |
| psDash | Пунктирная линия, длинные штрихи |
| psDot | Пунктирная линия, короткие штрихи |
| psDashDot | Пунктирная линия, чередование длинного |
| и короткого штрихов | |
| psDashDotDot | Пунктирная линия, чередование одного |
| длинного и двух коротких штрихов | |
| psClear | Линия не отображается (используется, |
| если не надо изображать границу | |
| области, например, прямоугольника) |
Значение свойства Реп. Mode влияет на цвет линии
Свойство Mode определяет, как будет формироваться цвет точек линии в зависимости от цвета точек холста, через которые эта линия прочерчивается.
| Константа | Цвет линии |
| pmBlack | Черный, не зависит от значения |
| свойства Pen. Color | |
| pmWhite | Белый, не зависит от значения |
| свойства Pen. Color | |
| pmCopy | Цвет линии определяется значением |
| свойства Pen . Color | |
| pmNotCopy | Цвет линии является инверсным по |
| отношению к значению свойства Pen. | |
| Color | |
| Цвет точки линии определяется как | |
| pmNot | инверсный по отношению к цвету |
| точки холста, в которую выводится |
Кисть
Кисть (canvas.Brush) используется методами, обеспечивающими вычерчивание замкнутых областей, например геометрических фигур, для заливки (закрашивания) этих областей. Кисть, как объект, обладает двумя свойствами:
| Свойств | Определяет |
| о | |
| Color | Цвет закрашивания замкнутой |
| Style | области |
| Стиль (тип) заполнения области |
Значения свойства Brush.Style определяют тип
| закрашивания | |
| Константа | Тип заполнения (заливки) |
| области | |
| bsSolid | Сплошная заливка |
| bsClear | Область не закрашивается |
| bsHorizontal | Горизонтальная штриховка |
| bsVertical | Вертикальная штриховка |
| bsFDiagonal | Диагональная штриховка с |
| наклоном линий вперед | |
| bsBDiagonal | Диагональная штриховка с |
| наклоном линий назад | |
| bsCross | Горизонтально-вертикальная |
| штриховка, в клетку | |
| bsDiagCross | Диагональная штриховка, в клетку |
Источник: studfile.net