Некаторыя кампаненты ў 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 вызначаецца як ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFwAAAAmCAYAAABJVvz/AAACv0lEQVRoBe2Z0U3DMBCG+4JgAsQECCZA3QCYALEBsAF9gzdgAxgBNqAjwAhVJygjGH2R/iitnDhpbTey7qSoxEnufJ9/n50wcWZZCUyyRrNgzoBnFoEBN+CZCWQOZwo34JkJZA43OoUvFgt3MZ2645MTt1r9ufePD3dweOQur66zoEkdf3TAAfvz81sBf3l9q0Df3N5mA546/uiAS8Ykfnp2XqlcbUN/mRltR2jGxIjv6+9ogVNWOPZlvviUONoZRMTATBxqNfC7+4daDaqfQ53tej8lhIO+oDASIyn+/p7Pd3UffD4Un+uadfRxG0HUwOkNI0iSoekW7PmWN0g9JEZfSI7Bl5I0CNR02mP3MxSf64DGPj+/KlYsskNsDbickPBYDdAkze4F8DlNsYnJjEOcQ2feGnAS2cZJrqQRBKrHgM15TouucJJRQoLPqA6dNqkg0KfH2axyT7+YiTmhq4bTAfoiVkPyrRUOVNSNcnDGuV46QiWGadXnGNKxzXup6UAGMDWdvob6telj1/OouxQ6TxKMGo4xtXXVKQ0Uz4aOXRMu4fla4doBNKcoNQtVmcUjUAMHLIBlUm7unYDil/pbAffVapUTrnWZBiZUTrjus+Vy6Z6en4s5yKfLKuDakQBP1tyxAL1rgeqzYHatA4pZ0i8sYUjlaHKtgDfhkjSLJopkIIAd+42uJLBtuahCwFFbWe6dsEjSuFmrqeeC3ubU2tsJdCq8/TG7EptAvUuJ7dj8+QkYcD+XZK0GPBlav+NigbNosehrQ8BOgb/ZpunThR9J2taigTehs73lALoBTyQqAdb3Iba+m9vfRKFb3RarcDLmhU3fh1A15YRB4K13XyovFjhAKR/6JCG1c47Km6/brXJMcKFY4Hq11j+gdb7vzxTFAk8gziguDXgUjP2dGPD+rKLcacCjYOzv5B9oWAGLYH34zQAAAABJRU5ErkJggg==) 5.4. Пры пабудове трэба ўлічваць маштаб: шырыня кампанента Image павінна адпавядаць даўжыні зададзенага прамежку. Тады маштабны каэфіцыент можна разлічыць па формуле ![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAAmCAYAAAD5hRiIAAAFhElEQVR4Ae2a4W3UQBBG8wdBBSgVIKgApQOgApQOgA5IB0AHpITQAUikgKDQQJQKQgmHnqVn5ka2zz7ubN95R7LWuzs7O/PNt7u2705WRQoCAxE4Gahf1AsCq9mR5urq2+rR4ydrF21zlO8/fqxenp2t3r3/sNG9p6enazF9+vylGhdjpY0rtr09P99oG4U4rguvh4c/tf1Xr9/0sp2VZkcaHLy5+VUF1icZOaAx6nd3dzXwJLivnx8vLqpxXy8vKzeJ0zYIqHD/7PmLCgfbXEyMaRPsQs4+gh5E20ZmSRoB6lox2wS76zEkdwhpSCr6kgZ/IBxtMVbaog56YhLJleNhV8o7E/W8o7go45zZVld9lqRx9bGVKqwKgu9aaepuWw4lwbb6rnB2LHaUSCTiy0nmCESHskvy7uFR5HyOpY69iK99fcpZkgZwmgBytRG0QHIvCIBGIqKw0gCIiwTlhMR+xlOPc0tgxtMXZShpXOH4i+CLu49tzN20MNDFlyjMLw7G6NjcHuOmj0vcGJtxi/Pk+9mRRmAzQDhuAgk4rlK2c8cJGvroQRR0c3LoFzTAR9CN8wI0RKKf8fRHGUoaVz7+sgCYH99ImkdSnD/OhR/xOHEBMQ6hRCcK9nObPjAn/cYQcYs2mu5r0sQVB9hTiYmMAOmLJCBwwRZkxsWkShIJod0IDmMdQzsAR3sAix/YAJ+8nQu4idPPrhKbkJFLe7bhi23RhvPYR4mvcV78zjsheOU2yRbjFIM4Z9d9TRqSoHMAPJUQZF4d+EJSXR3U8RE9gQQggCAOdKlzKSSJOn3EqQ3asMsVAbadxLThIV4xec7XVpIg5oLUCnHkNvsoictYmNPEu7AkEXXsgoGLSh3t4WvEDX+ID7tiqW5bWZMGBQbjvKC2DdpXO4ESkADFefSNpCPomGQBQod2/AcMiIIAFHFR0g84gMlcbcJYbKCLfeoZF+razXaYhz79tV/yWqdEl6tN6IM4jCVGfMe2BHEu6mIiXvouIYhZkqNPHV3b2nyI7WukEaioMNY9oABEvAwUHyLYJELQ6DN5gAdICIBoC0AABxKYRImmDiXjnRM99G3XLrabxqLHnIqJdD7b8SWTj9iynvqU2ML/OA47zImPEgQ7isSiTd/FST+bxjm+q1wjjSwEOJ3CMYwfkxBfToIkE+BjinfXsdSkkYVsb5GdrtC2iRnX52obP1V73tlYsa7AqXw6lHlr0ggiW6HCqoM09DVJ2zbN7pSvpvGl7TARqEnj+e3ZSgmB4jl5mCEWr3eNQEUadwyPJnYJyJJf13Y9OfZub3+vfl5fl2tGGNzf33emuiKND4Ge6T55W2+zINnyUdRUb7NRSDO/BdOLNL4pQQIkkohjynf/psT3eQhGp8hhIsCJwyYQN5Bqp+F5hkvxoZhkM8hvF/aXchkIsGF4asQXpBOPoribxI8+7j7LgKlEmRFo3WmyYqkXBLoQqF+5u5RKX0EgIlBIE9Eo970QKKTpBVNRiggskjQ+3PF2yBsCb478XDLWW+LU80cCbHO/ONLwOcFPCXyf4lWStrFIM/X825Akj1kcaQTAzwrsNNuKO4bfMnLZZXcX83fZ32ffYknjB8yxjqScxKnnz/4MqS+KNBxLJItP4u4S3HNMjfFHsz7z+5NO/nQ/JKn71l0UaVzdEAbhK/iYydk0P6TCH45Mf/+baifsIt6iSNMFBH0mjbcpdyLaxhJI5W+AkGVMQg+JsZAmocUxxZuUr+L/86CcTG+ssvNJGpQhzRjH5kbHkkIhTQKEV3COBsgSf9lNanuplp1mL7Du16h/KuNoYIXzUBp//d/v7P+OR/zwmWaO/zIoO01gAkRxd/GoGDtp5e0pJKTcHg8CZac5nlyOFslf+GCCGwi6mYcAAAAASUVORK5CYII=) 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. Форма на этапе канструявання:
![](http://profil.adu.by/pluginfile.php/4850/mod_book/chapter/13574/4.5-%D0%B0.jpg)
Апрацоўшчык падзеі 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;
|
Дадатак у час работы:
![](http://profil.adu.by/pluginfile.php/4850/mod_book/chapter/13574/4.5-%D0%B1.jpg?time=1629180797922)
Прыклад 4.6. Змяненне пачатковых значэнняў канцоў прамежку:
![](http://profil.adu.by/pluginfile.php/4850/mod_book/chapter/13574/4.6.jpg?time=1629292476220)
Канстанта Nil мае значэнне «нічога». Фармальна — гэта значэнне паказальніка, які не спасылаецца ні на які аб'ект.
|