Метод цифрового диференціального аналізатора

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Кафедра автоматизованих систем управління

Інформація про роботу

Рік:
2007
Тип роботи:
Лабораторна робота
Предмет:
Комп'ютерна графіка
Група:
КН

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти та науки України Національний університет «Львівська політехніка» Кафедра автоматизованих систем управління  Лабораторна робота №4 з дисципліни «Комп’ютерна графіка» на тему: “Метод цифрового диференціального аналізатора” Мета: Освоїти розкладання відрізка в растр методом цифрового диференціального аналізатора. ТЕОРЕТИЧНІ ОСНОВИ Один з методів розкладання відрізка в растр полягає в розв’язуванні диференціального рівняння, що описує цей процес. Для прямої лінії маємо dy/dx=const чи Dy/Dx=(y2 – y1)/(x2 – x1). Розв’язок представляється у вигляді yi+1=yi+Dy yi+1=yi+Dx(y2 – y1)/(x2 – x1) де x1, x2, y1, y2 – кінці відрізка, що розкладається, yi - початкове значення для чергового кроку вздовж відрізка. Фактично рівняння являє собою рекурентне співвідношення для послідовних значень у вздовж потрібного відрізка. Цей метод, використовуваний для розкладання в растр відрізків, називається цифровим диференціальним аналізатором (ЦДА). У простому ЦДА або Dx, або Dy (більше із збільшень) вибирається як одиниця растра. Нижче наводиться простий алгоритм, що працює у всіх квадрантах: передбачається, що кінці відрізка ( x1, y1) і (x2, y2) не збігаються. Апроксимуємо довжину відрізка: if abs(x2 – x1)>=abs(y2 – y1) then L= abs(x2 – x1) else L= abs(y2 – y1) назначаємо більше із збільшень Dx чи Dy рівним одиниці растра Dx=(x2 – x1)/L Dy=(y2 – y1)/L округляємо величини, а не відкидаємо дробову частину. Використання знакової функції робить алгоритм придатним для всіх квадрантів x=x1 y=y1 Plot(round(x),round(y)) //промалювання пікселі початок основного циклу i=1; while i<=L do begin x=x+Dx y=y+Dy i:=i+1; Plot(round(x),round(y)) End; finish ПОРЯДОК РОБОТИ Побудувати декартову двовимірну систему координат, у якій максимальне значення по осях х і у було би близько 10. Розграфити площину побудови відрізків у вигляді сітки, на якій будуть малюватися пікселі. Побудувати псевдовідрізок, який би з’єднував початок з кінцем відрізку. Привести результат роботи алгоритму накреслення відрізку методом цифрового диференціального аналізатора, у якому би підсвічувалися пікселі, або ж клітинки сітки. Проаналізувати результати. Текст програми unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, Menus, StdCtrls, Buttons; type TForm1 = class(TForm) Bevel1: TBevel; PaintBox1: TPaintBox; BitBtn1: TBitBtn; Label3, Label4, Label5, Label6: TLabel; Label7, Label8, Label9, Label10: TLabel; Label11, Label12, Label13, Label1: TLabel; Label2, Label14: TLabel; ex1, ey1, ex2, ey2: TEdit; Label15, Label16: TLabel; procedure Chusto; procedure Sitka; procedure Tochka(x,y: byte); procedure FiksYryxX(x1,y1,x2,y2: byte); procedure FormCreate(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure PaintBox1Paint(Sender: TObject); private public end; const CP=30;//ціна поділки var Form1: TForm1; x0,y0,w,h,x1,x2,y1,y2: integer; new,draw: Boolean; implementation {$R *.DFM} procedure TForm1.Chusto; begin new:=true; PaintBox1.Repaint; end; procedure TForm1.Sitka; var j: byte; begin with PaintBox1.Canvas do begin Pen.Color:=clGray; for j:=0 to 13 do begin MoveTo(x0+j*CP,y0); LineTo(x0+j*CP,0); MoveTo(x0,y0-j*CP); LineTo(w,y0-j*CP); end; end; end; procedure TForm1.Tochka(x,y: byte); begin with PaintBox1.Canvas do begin Brush.Color:=clGreen; Rectangle(x0+x*CP,y0-(y+1)*CP,x0+(x+1)*CP,y0-y*CP); FloodFill(x0+x*CP+1,y0-(y+1)*CP+1,clGreen,fsBorder); end; end; procedure TForm1.FiksYryxX(x1,y1,x2,y2: byte); var x,y: byte; begin x:=x1; y:=y1; Tochka(x1,y1); while (x<>x2)or(y<>y2) do begin if (x1<=x2)and(x<>x2) then inc(x); if (x1>x2)and(x<>x2) then dec(x); if (y1<=y2)and(y<>y2) then inc(y); if (y1>y2)and(y<>y2) then dec(y); Tochka(x,y); end; end; procedure TForm1.FormCreate(Sender: TObject); begin w:=PaintBox1.Width; x0:=0; h:=PaintBox1.Height; y0:=h; draw:=false; Chusto; end; procedure TForm1.BitBtn1Click(Sender: TObject); begin if (ex1.Text='')or(ex2.Text='')or(ey1.Text='')or(ey2.Text='') then begin Chusto; exit; end; x1:=StrToInt(ex1.Text); y1:=StrToInt(ey1.Text); x2:=StrToInt(ex2.Text); y2:=StrToInt(ey2.Text); draw:=true; new:=true; PaintBox1.Repaint; end; procedure TForm1.PaintBox1Paint(Sender: TObject); begin if new=true then begin new:=false; Sitka; end; if draw=true then begin draw:=false; FiksYryxX(x1,y1,x2,y2); end; end; end.  Висновок: в даній лабораторній роботі я ознайомився з основами комп’ютерної графіки – алгоритмом побудови відрізків методом цифрового диференціального аналізатора.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!