Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Лабораторна робота №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.
Висновок: в даній лабораторній роботі я ознайомився з основами комп’ютерної графіки – алгоритмом побудови відрізків методом цифрового диференціального аналізатора.