§ 4. Элементы кіравання для работы з графікай

4.2. Пабудова графікаў функцый

Некаторыя кампаненты ў Delphi, такія як форма, кампанент Image і інш., маюць уласцівасць Canvas (канва, палатно). Канва ўяўляе сабой вобласць, на якой можна маляваць ці выводзіць на яе растравыя відарысы. Сістэма каардынат у канвы такая ж, як і для кожнага кампанента ў Delphi — пункт з каардынатамі (0, 0), змешчаная ў верхнім левам вугле, вось ОY накіравана ўніз. Кожны пункт канвы мае каардынаты X і Y. Каардынаты мераюцца ў пікселях. Найважнейшая ўласцівасць пікселя — яго колер. Колер пікселя канвы вызначаецца значэннем уласцівасці Pixels. Гэта ўласцівасць уяўляе сабой двухвымерны масіў, у якім захоўваецца колер кожнага пікселя. Для задання колеру ў Delphi можна выкарыстаць некалькі спосабаў (прыклад 4.4).

Клас TCanvas змяшчае вялікую колькасць уласцівасцей і метадаў, якія дазваляюць будаваць відарысы. Шмат якія з метадаў канвы супадаюць з працэдурамі, што выкарыстоўваліся ў бібліятэцы GraphABC асяроддзя праграміравання PascalABC.Net Апісанне гэтых метадаў прыведзена ў дадатку.

Прыклад 4.5. Стварыць праект, у якім пабудаваць графік функцыі y = xsinx на прамежку, зададзеным карыстальнікам.

Этапы выканання задання 

  1. Змясціць на форму кампаненты: Image, два кампаненты Label, два кампаненты Edit і кампанент Button.
  2. Змяніць уласцівасці Caption у кампанентаў Label1, Label2 на x0 і xn адпаведна.
  3. Змяніць уласцівасці Text у кампанентаў Edit1 і Edit2 на -20 і 20 адпаведна.
  4. Змяніць уласцівасці Caption у кампанента Button1 на «Пабудаваць графік».
  5. Напісаць апрацоўшчык падзеі OnClick для кампанента Button1, у якім графік функцыі будаваць па пунктах.

5.1. Намаляваць восі каардынат у выглядзе дзвюх перпендыкулярных ліній, перакрыжаваных у цэнтры кампанента Image.
5.2. Колькасць пунктаў, якія ўтвараюць графік функцыі, павінен быць не меншай за  10000 (n = 10000 ),  каб атрымаць бачнасць суцэльнай лініі.
5.3. Шаг змянення значэння x вызначаецца як  
5.4. Пры пабудове трэба ўлічваць маштаб: шырыня кампанента Image павінна адпавядаць даўжыні зададзенага прамежку. Тады маштабны каэфіцыент можна разлічыць па формуле 
5.5. Паколькі змяшчэнне восей каардынат на экране не супадае са змяшчэннем восей, прынятым у матэматыцы, то трэба ператварыць каардынаты: пункту (0; 0) павінны адпавядаць пункт у цэнтры кампанента Image. Для гэтага атрыманае значэнне x неабходна павялічыць на значэнне  cx = Image1.Widt div2, а значэнне у на cy = Image1.Height div2. Паколькі вось Y накіравана ўніз, а не ўверх, то значэнне y неабходна змяніць, памяняўшы знак на процілеглы. На канве будзе зафарбоўвацца пункт з каардынатамі ( xekr = x · k + cx,  yekr = –y · k + cy).
5.6. Неабходна ўлічваць, што пры вылічэнні значэння x і y будуць рэчыўнымі, а значэнні каардынат на канве могуць быць толькі цэлымі. Таму перад прарысоўкай пункта неабходна ператварыць рэчаісныя лікі ў цэлыя з дапамогай функцыі trunc.

Калі дадатку, які працуе, змяніць канцы прамежку, то графік будзе прарысаваны па-над ужо наяўным (прыклад 4.6). Каб пазбегнуць такой сітуацыі, перад пабудовай графіка неабходна ачысціць кампанент. Для гэтага можна выкарыстоўваць каманду:

  Image1.Picture := Nil;

Прыклад 4.4. Спосабы задання колеру ў  Delphi:

  1. Заданне колеру з дапамогай канстант. Значэнні канстантаў пачынаюцца на спалучэнне літар cl. Далей можа ісці імя колеру (напрыклад, clSkyBlue — нябесна-сіні, clRed — чырвоны) ці элементаў Windows, колер якіх залежыць ад настроек карыстальніка (clBtnFace — колер паверхні кнопкі, clActivCaption — колер радка загалоўка актыўнага акна). Спіс магчымых значэнняў можна паглядзець у інспектары аб'ектаў у любога кампанента, які валодае ўласцівасцю Color, ці паглядзець у дадатку.
  2. Заданне колеру з дапамогай шаснаццацярычных лікаў. Пары лічбаў шаснаццацярычнага ліку задаюць інтэнсіўнасць сіняга, зялёнага і чырвонага колераў адпаведна. Напрыклад, $FF0000 — сіні колер, $00FF00 — зялёны колер, $000000 — чорны колер, $FFFFFF — белы колер.
  3. Шаснаццацярычныя лікі можна перавесці ў дзесятковую сістэму лічэння і карыстацца гэтымі значэннямі.
  4. Для задання колеру можна выкарыстаць функцыю RGB, тры параметры якой задаюць інтэнсіўнасць чырвонага, сіняга і зялёнага колераў адпаведна. Значэнні параметраў могуць змяняцца ад 0 да 255. 

Прыклад 4.5. Форма на этапе канструявання:

Апрацоўшчык падзеі OnClick для кампанента Button1

procedure TForm1.Button1Click(Sender: TObject);
var x0, xn, x, y, h, k :real;
    x_ekr, y_ekr, c_x, c_y, n, i :integer;
 begin
  // колькасць пунктаў
  n := 10000;
  // канцы прамежка
  x0 := StrToFloat(Edit1.Text);
  xn := StrToFloat(Edit2.Text);
  // цэнтр вобласці пабудовы
  c_x := Image1.Width div 2;
  c_y := Image1.Height div 2;
  // маштабны каэфіцыент
  k := Image1.Width / (xn - x0);
  // шаг
  h := (xn - x0) / n;
  // восі
  Image1.Canvas.MoveTo(0, c_y);
  Image1.Canvas.LineTo(2*c_x, c_y);
  Image1.Canvas.MoveTo(c_x, 0);
  Image1.Canvas.LineTo(c_x, 2*c_y);
  x := x0;
  for i := 1 to n do
  begin
    y := x * sin(x);
    //ператварэнне каардынат
    x_ekr := trunc(x * k) + c_x;
    y_ekr := trunc(-y * k) + c_y;
    //пабудова  пункта сінім колерам
    Image1.Canvas.Pixels[x_ekr, y_ekr] := clBlue;
    //наступны пункт
    x := x + h;
  end;
end;

 Дадатак у час работы:

Прыклад 4.6. Змяненне пачатковых значэнняў канцоў прамежку:

Канстанта Nil мае значэнне «нічога». Фармальна — гэта значэнне паказальніка, які не спасылаецца ні на які аб'ект.