You are on page 1of 5

МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ

НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
"ЛЬВІВСЬКА ПОЛІТЕХНІКА”

МЕТОДИЧНІ ВКАЗІВКИ ДО ЛАБОРАТОРНОЇ РОБОТИ № 4


з курсу "Компютерна графіка"

Для студентів бакалаврського рівня


підготовки по спеціальності
«Видавничо-поліграфічна справа»

Затверджено на засіданні
кафедри АСУ. Протокол № 3
від 10.05.2004.

Львів – 2010
Алгоритм креслення відрізків: Методичні вказівки до лабораторної
роботи № 4 з курсу "Комп’ютерна графіка" для студентів спеціальності
«Видавничо-поліграфічна справа» / Укл.: О.Я. Різник, М.А. Назаркевич, Д.
Скрибайло-Леськів - Львів: Видавництво Національного університету
"Львівська політехніка", 2004. - 12 с.

Укладач О.Я. Різник,


М.А. Назаркевич,
Д. Скрибайло-Леськів

Відповідальний за випуск Шпак З.Я., канд. техн. наук, доц.

Рецензент Вальковський В.А., д-р техн. наук, проф.


Лабораторна робота №4

Тема: Алгоритм креслення відрізків.

Оскільки екран растрового дисплея з електронно-променевою трубкою


(ЕПТ) можна розглядати як матрицю дискретних елементів (пікселів),
кожний з яких може бути підсвічений, не можна безпосередньо провести
відрізок з однієї точки в іншу. Процес визначення пікселів, щонайкраще
апроксимуючих заданий відрізок, називається розкладанням у растр. У
сполученні з процесом порядкової візуалізації зображення він відомий як
перетворення растрової розгортки. Для горизонтальних, вертикальних і
нахилених під кутом 45° відрізків вибір растрових елементів очевидний. При
будь-якій іншій орієнтації вибрати потрібні піксели складніше, що і показано
на мал.4.1.

мал.4.1. Розкладання в растр відрізків прямих.


В цій лабораторній роботі, нам потрібно показати всі недоліки расту, при
малюванні прямих.
Загальні вимоги до алгоритмів креслення відрізків наступні: Відрізки
повинні виглядати прямими, починатися і закінчуватися в заданих точках,
яскравість уздовж відрізка повинна бути постійною і не залежати від
довжини і нахилу, малювати потрібно швидко.
Постійна уздовж всього відрізка яскравість досягається лише при
проведенні горизонтальних, вертикальних і нахилених під кутом 45° прямих.
Для всіх інших орієнтація розкладання в растр приведе до нерівномірності
яскравості, як це показано на мал.4.1.
У більшості алгоритмів креслення відрізків для спрощення обчислень
використовується покроковий алгоритм. Наведемо приклад подібного
алгоритму:
Простий покроковий алгоритм
позиція=початок
крок=збільшення
1 if позиція - кінець<точність then 4
if позиція>кінець then 2
if позиція<кінець then 3
2 позиція=позиція - крок
go to 1
3 позиція=позиція+крок
go to 1
4 finish
Простий алгоритм розкладання відрізка в растр, описаний у
наступному розділі, ілюструє застосування покрокових методів.

Текст програми
unit Unit1; L:=abs((pos[2,1]-pos[1,1])) else
L:=abs(pos[2,2]-pos[1,2]) ;
interface dxx:=((pos[2,1]-pos[1,1])/l)*dx;
dy:=((pos[2,2]-pos[1,2])/l)*dx;
uses pos_x:=((pos[1,1]*dx));
Windows, Messages, SysUtils, Classes, Graphics, pos_y:=((pos[1,2]*dx));
Controls, Forms, Dialogs, i:=1;
ExtCtrls,math, StdCtrls, Spin; form1.p.Canvas.Brush.Color:=cllime;
type form1.p.Canvas.Rectangle(round(pos_x),round(pos_
b=array[1..2,1..2] of real; y),
TForm1 = class(TForm) round(pos_x+dx),round(pos_y+dx));
p: TPaintBox; form1.p.Canvas.Brush.Color:=clblack;
Label1: TLabel; while i<=l do
Label2: TLabel; begin
SpinEdit1: TSpinEdit; pos_xx:=0;
Panel1: TPanel; pos_yy:=0;
X Panel2: TPanel; pos_x:=(pos_x+dxx);
procedure pPaint(Sender: TObject); pos_y:=(pos_y+dy);
procedure pMouseDown(Sender: TObject; Button: form1.p.Canvas.Brush.Style:=bssolid;
TMouseButton; form1.p.Canvas.Brush.Color:=cllime;
Shift: TShiftState; X, Y: Integer); if (round(pos_y) mod dx) <>0 then
procedure pMouseMove(Sender: TObject; Shift: begin
TShiftState; X, pos_yy:=(round(pos_y) / dx);
Y: Integer); pos_yy:=pos_Y-(round(pos_yy)*DX); //D(X)
procedure pMouseUp(Sender: TObject; Button: pos_yy:=pos_y-pos_YY; //x-dx
TMouseButton; pos_xx:=pos_x;
Shift: TShiftState; X, Y: Integer); end else pos_yy:=pos_y;
procedure SpinEdit1Change(Sender: TObject); if (round(pos_x) mod dx) <>0 then
procedure FormCreate(Sender: TObject); begin
procedure Panel2Click(Sender: TObject); pos_xx:=(round(pos_x) / dx);
procedure Panel1Click(Sender: TObject); pos_xx:=pos_x-(round(pos_xx)*dx);
end; pos_xx:=pos_x-pos_xx;
pos_yy:=pos_y;
var end else pos_xx:=pos_x;
Form1: TForm1; form1.p.Canvas.Rectangle(round(pos_xx),round(pos
pos:b; _yy),
DR:boolean=false; round(pos_xx+dx),round(pos_yy+dx));
temp_x,temp_y:real; form1.p.Canvas.Brush.Color:=clblack;
dx:integer; inc(i);
end;
implementation end;
{$R *.DFM} procedure TForm1.pPaint(Sender: TObject);
procedure draw; var i:integer;
var pos_x,pos_y,pos_xx,pos_yy:real; begin
i:integer; p.Canvas.FillRect(clientrect); i:=0;
Dy,Dxx,l:real; p.Canvas.Pen.Color:=clwhite;
begin form1.p.Canvas.Brush.Style:=bssolid; while i<=p.Width do
if abs(pos[2,1]-pos[1,1])>=abs(pos[2,2]- begin
pos[1,2]) then p.Canvas.moveto(i,0);
p.Canvas.lineto(i,p.Height); i:=0;
inc(i,dx); if round(y) mod dx <>0 then
end; i:=0; while round(y-i) mod dx <>0 do
while i<=p.height do inc(i);
begin pos[2,2]:=y-i ;
p.Canvas.moveto(0,i); pos[2,1]:=pos[2,1] / dx;
p.Canvas.lineto(p.width,i); pos[2,2]:=pos[2,2] / dx;
inc(i,dx); pos[1,1]:=pos[1,1] / dx;
end; pos[1,2]:=pos[1,2] / dx;
end; dr:=false;
procedure TForm1.pMouseDown(Sender: TObject; if LAb=2 then
Button: TMouseButton; if (pos[1,1]<>pos[2,1])or(pos[2,2]<>pos[1,2]) then
Shift: TShiftState; X, Y: Integer); draw else else
begin if (pos[1,1]<>pos[2,1])or(pos[2,2]<>pos[1,2]) and
ppaint(form1); (lab=1)then
DR:=true; draw1;
pos[1,1]:=x; end;
pos[1,2]:=y; procedure TForm1.SpinEdit1Change(Sender:
temp_x:=pos[1,1]; TObject);
temp_y:=pos[1,2]; begin
end; if SpinEdit1.Value>1 then
procedure TForm1.pMouseMove(Sender: TObject; dx:=SpinEdit1.Value;
Shift: TShiftState; X, ppaint(form1);
Y: Integer); end;
begin procedure TForm1.FormCreate(Sender: TObject);
if dr then begin
begin SpinEdit1.Value:=50;
p.Canvas.Pen.Mode:=pmxor; dx:=SpinEdit1.value;
p.Canvas.MoveTo(round(pos[1,1]),round(pos[1,2])); end;
p.Canvas.lineTo(round(temp_x),round(temp_y)); procedure TForm1.Panel2Click(Sender: TObject);
p.Canvas.Pen.Color:=clyellow; begin
pos[2,1]:=x; panel2.BevelOuter:=bvLowered;
pos[2,2]:=y; panel2.Color:=clActiveBorder;
form1.Canvas.Font.Color:=cllime; panel1.BevelOuter:=bvRaised;
label1.Caption:='X = panel1.Color:=clBtnFace;
'+IntToStr(Round(pos[2,1]/dx))+#10+#13+'Y = form1.Caption:='LAB 4';
'+IntToStr(Round(pos[2,2]/dx)); lab:=1;
p.Canvas.MoveTo(round(pos[1,1]),round(pos[1,2])); end;
p.Canvas.lineTo(round(x),round(y)); procedure TForm1.Panel1Click(Sender: TObject);
temp_x:=x; begin
temp_y:=y; panel1.BevelOuter:=bvLowered;
end; panel1.Color:=clActiveBorder;
end; panel2.BevelOuter:=bvRaised;
procedure TForm1.pMouseUp(Sender: TObject; panel2.Color:=clBtnFace;
Button: TMouseButton; form1.Caption:='LAB 5';
Shift: TShiftState; X, Y: Integer); lab:=2;
var i:byte; end;
begin end.
i:=0;
if round(pos[1,1]) mod dx <>0 then
while round(pos[1,1]-i) mod dx <>0 do
inc(i);
pos[1,1]:=pos[1,1]-i;
i:=0;
if round(pos[1,2]) mod dx <>0 then
while round(pos[1,2]-i) mod dx <>0 do
inc(i);
pos[1,2]:=pos[1,2]-i ;
i:=0;
if round(x) mod dx <>0 then
while round(x-i) mod dx <>0 do
inc(i);
pos[2,1]:=x-i;

You might also like