Некаторыя кампаненты ў Delphi, такія як форма, кампанент Image і інш., маюць уласцівасць Canvas (канва, палатно). Канва ўяўляе сабой вобласць, на якой можна маляваць ці выводзіць на яе растравыя відарысы. Сістэма каардынат у канвы такая ж, як і для кожнага кампанента ў Delphi — пункт з каардынатамі (0, 0), змешчаная ў верхнім левам вугле, вось ОY накіравана ўніз. Кожны пункт канвы мае каардынаты X і Y. Каардынаты мераюцца ў пікселях. Найважнейшая ўласцівасць пікселя — яго колер. Колер пікселя канвы вызначаецца значэннем уласцівасці Pixels. Гэта ўласцівасць уяўляе сабой двухвымерны масіў, у якім захоўваецца колер кожнага пікселя. Для задання колеру ў Delphi можна выкарыстаць некалькі спосабаў (прыклад 4.4).
Клас TCanvas змяшчае вялікую колькасць уласцівасцей і метадаў, якія дазваляюць будаваць відарысы. Шмат якія з метадаў канвы супадаюць з працэдурамі, што выкарыстоўваліся ў бібліятэцы GraphABC асяроддзя праграміравання PascalABC.Net Апісанне гэтых метадаў прыведзена ў дадатку.
Прыклад 4.5. Стварыць праект, у якім пабудаваць графік функцыі y = xsinx на прамежку, зададзеным карыстальнікам.
Этапы выканання задання
- Змясціць на форму кампаненты: Image, два кампаненты Label, два кампаненты Edit і кампанент Button.
- Змяніць уласцівасці Caption у кампанентаў Label1, Label2 на x0 і xn адпаведна.
- Змяніць уласцівасці Text у кампанентаў Edit1 і Edit2 на -20 і 20 адпаведна.
- Змяніць уласцівасці Caption у кампанента Button1 на «Пабудаваць графік».
- Напісаць апрацоўшчык падзеі 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:
- Заданне колеру з дапамогай канстант. Значэнні канстантаў пачынаюцца на спалучэнне літар cl. Далей можа ісці імя колеру (напрыклад, clSkyBlue — нябесна-сіні, clRed — чырвоны) ці элементаў Windows, колер якіх залежыць ад настроек карыстальніка (clBtnFace — колер паверхні кнопкі, clActivCaption — колер радка загалоўка актыўнага акна). Спіс магчымых значэнняў можна паглядзець у інспектары аб'ектаў у любога кампанента, які валодае ўласцівасцю Color, ці паглядзець у дадатку.
- Заданне колеру з дапамогай шаснаццацярычных лікаў. Пары лічбаў шаснаццацярычнага ліку задаюць інтэнсіўнасць сіняга, зялёнага і чырвонага колераў адпаведна. Напрыклад, $FF0000 — сіні колер, $00FF00 — зялёны колер, $000000 — чорны колер, $FFFFFF — белы колер.
- Шаснаццацярычныя лікі можна перавесці ў дзесятковую сістэму лічэння і карыстацца гэтымі значэннямі.
- Для задання колеру можна выкарыстаць функцыю 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 мае значэнне «нічога». Фармальна — гэта значэнне паказальніка, які не спасылаецца ні на які аб'ект.
|