Точка

Поверхні, на яку програма може здійснювати виведення графіки, відповідає об’єкт Canvas. властивість pixels, є двовимірним масивом типу TColor, містить інформацію про колір кожної точки графічної поверхні. Використовуючи властивість Pixels, можна задати потрібний колір для будь-якої точки графічної поверхні, т. е. намалювати; точку. наприклад, інструкція

Form1.Canvas.Pixels [10,10]: = clRed

забарвлює точку поверхні форми в червоний колір.
Розмірність масиву pixels визначається розміром графічної поверхні. Розмір графічної поверхні форми (робочої області, яку також називають клієнтської) задається значеннями властивостей ciientwidth і ClientHeight, а розмір графічної поверхні компонента image – значеннями властивостей width і Height. Лівій верхній точці робочої області форми відповідає елемент pixels [0,0], а правої нижньої –Pixels [Ciientwidth – 1, ClientHeight – 1].
Властивість Pixels можна використовувати для побудови графіків. Графік будується, як правило, на основі обчислень за формулою. Межі діапазону зміни аргументу функції є вихідними даними. Діапазон зміни значення функції може бути обчислений. На підставі цих даних можна обчислити масштаб, що дозволяє побудувати графік таким чином, щоб він займав всю область форми, призначену для виведення графіка.
Наприклад, якщо деяка функція f (x) може приймати значення від нуля до 1000, і для виведення її графіка використовується область форми висотою в 250 пікселів, то масштаб осі Y обчислюється за формулою: т = 250/1000. Таким чином, значення f (x) = 70 буде відповідати точка з координатою Y = 233. Значення координати Y обчислено за формулою

Y = h -f (x) х т = 250 - 70х (250/1000),

де h – висота області побудови графіка.
Зверніть увагу на то, що точне значення виразу 250 – 70х (250/1000) одно 232,5. Але т. До. індексом властивості pixels, яке використовується для виведення точки на поверхню Canvas, може бути тільки ціле значення, то число 232,5 округляється до найближчого цілому, яким є число 233.
Наступна програма, текст якої наведено в лістингу 10.5, використовуючи властивість pixels, виводить графік функції у = 2 sin (jc) e * / 5 . Для побудови графіка використовується вся доступна область форми, причому якщо під час роботи програми користувач змінить розмір вікна, то графік буде виведений заново з урахуванням реальних розмірів вікна.

Лістинг 10.5. Графік функції

unit grfunc_;
interface
Windows, Messages, SysUtils, Classes,

Graphics, Controls, Forms, Dialogs;
type
TForm1 = Class (TForm)
procedure FormPaint (Sender: TObject);

procedure FormResize (Sender: TObject);

private
{ Private declarations}

public
{Public declarations}

end;
var
Forml: TForml;
implementation
{$ R * .DFM}
// Функція, графік якої треба побудувати

Function f (x: real): real;

begin
f: = 2 * Sin (x) * exp (x / 5) ;

end;
// будує графік функції
procedure GrOfFunc;
var
x1, x2: real; // межі зміни аргументу функції

y1, y2: real; // межі зміни значення функції

х: real; // аргумент функції

у: real; // значення функції в точці х

dx: real; // приріст аргументу

l, b: integer; // лівий нижній кут області виведення графіка

w, h: integer; // ширина і висота області виведення графіка

mx, my: real; // масштаб по осях X і Y

х0, у0: integer; // точка - початок координат
begin
// область виведення графіка
l: = 10; // X - координата лівого верхнього кута
b: = Forml.ClientHeight-20;

// У - координата лівого верхнього кута
h: = Forml.ClientHeight-40; // висота
w: = Forml.Width-40; // ширина
x1: = 0; // нижня межа діапазону аргументу
х2: = 25; // верхня межа діапазону аргументу

dx: = 0.01; // крок аргументу
// знайдемо максимальне і мінімальне значення
// функції на відрізку [x1, x2]
y1: = f (xl); // мінімум
y2: = f (xl); // максимум
x: = x1;
repeat
У : = F (х);
if у < yl then yl: = y;
if у > у2 then y2: = y;
х: = x + dx; until (x > = х2);
// обчислимо масштаб
my: = h / abs (y2-yl); // масштаб по осі Y
mx: = w / abs (x2-xl); // масштаб по осі X
х0: = 1;
у0: = b-Abs (Round (y1 * my)) ;
with form1.Canvas do
begin
// осі
MoveTo (l, b); LineTo (l, b-h);
MoveTo (x0, y0); LineTo (x0 + w, y0);
TextOut (l + 5, bh, FloatToStrF (y2, ffGeneral, 6,3)) ;
TextOut (l + 5, b, FloatToStrF (yl, ffGeneral, 6,3)) ;
// побудова графіка
x: = xl; repeat
y: = f (x);
Pixels [x0 + Round (x * mx), y0-Round (y * my) ]: = clRed;

x: = x + dx;
until (x > = x2);

end;

end;
procedure TForm1.FormPaint (Sender: TObject);

begin
GrOfFunc; end;
// змінився розмір вікна програми

procedure TForm1.FormResize (Sender: TObject);

begin
// очистити форму
forml.Canvas.FillRect (Rect (0,0, ClientWidth, < / p>

ClientHeight));
// побудувати графік
GrOfFunc;

end;
end.

Основну роботу виконує процедура GrOfFunc, яка спочатку обчислює максимальне (у2) і мінімальне (Yl) значення функції на відрізку [x1l, x2]. Потім, використовуючи інформацію про ширину (Forml.Clientwidth -40) і висоті (Form1.ClientHeight – 40) області виведення графіка, обчислює масштаб по осях X (mх) іY (mу).
Висота і ширина області виведення графіка визначається розмірами робочої (клієнтської) області форми, т. е. без урахування області заголовка і кордонів. Після обчислення масштабу процедура обчислює координату у горизонтальній осі (уо) і викреслює координатні осі графіка. Потім виконується безпосереднє побудова графіка (рис. 10.10).
Виклик процедури GrOfFunc виконують процедури обробки подій onPaint і onFormResize. Процедура TForm1. FormPaint забезпечує викреслювання графіка після появи форми на екрані в результаті запуску програми, а також після появи форми під час роботи програми, наприклад, в результаті видалення або переміщення інших вікон, повністю або частково перекривають вікно програми. Процедура TForm1.FormResize забезпечує викреслювання графіка після зміни розміру форми.

Рис. 10.10. Графік, побудований процедурою GrOfFunc

Наведена програма досить універсальна. Замінивши інструкції в тілі функції f (х), можна отримати графік іншої функції. Причому незалежно від виду функції її графік буде займати всю область, призначену для виведення.

Примітка

Розглянута програма працює коректно, якщо функція, графік якої треба побудувати, приймає як позитивні, так і негативні значення. Якщо функція у всьому діапазоні тільки позитивна або тільки негативна, то в програму слід внести зміни. які – нехай це буде вправою для читача.