Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod_zbirna.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
2 Мб
Скачать
☆

Лабораторна робота №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

ПОРЯДОК ВИКОНАННЯ РОБОТИ

1. Побудуйте декартову двовимірну систему координат, у якій максимальне значення по осях x i y було би близько 10.

2. Розграфте площину побудови відрізків у вигляді сітки, на якій будуть будуватися піксели.

3. Побудуйте псевдовідрізок, який би з’єднував початок з кінцем відрізку.

4. Приведіть результат роботи алгоритму накреслення відрізку, у якому би підсвічувалися піксели, або ж клітинки сітки.

5. Проаналізуйте результати.

ЗМІСТ ЗВІТУ

Звіт повинен містити:

1) назву роботи;

2) мету роботи;

3) короткий теоретичний вступ;

4) завдання до лабораторної роботи;

5) тексти розроблених і відлагоджених програм

6) малюнки з реалізацією програми

7) висновки

ПРИКЛАД ПРОГРАМНОЇ РЕАЛІЗАЦІЇ

unit Unit1;

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

ExtCtrls,math, StdCtrls, Spin;

type

b=array[1..2,1..2] of real;

TForm1 = class(TForm)

p: TPaintBox;

Label1: TLabel;

Label2: TLabel;

SpinEdit1: TSpinEdit;

Panel1: TPanel;

X Panel2: TPanel;

procedure pPaint(Sender: TObject);

procedure pMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure pMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

procedure pMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

procedure SpinEdit1Change(Sender: TObject);

procedure FormCreate(Sender: TObject);

procedure Panel2Click(Sender: TObject);

procedure Panel1Click(Sender: TObject);

end;

var

Form1: TForm1;

pos:b;

DR:boolean=false;

temp_x,temp_y:real;

dx:integer;

implementation

{$R *.DFM}

procedure draw;

var pos_x,pos_y,pos_xx,pos_yy:real;

i:integer;

Dy,Dxx,l:real;

begin form1.p.Canvas.Brush.Style:=bssolid;

if abs(pos[2,1]-pos[1,1])>=abs(pos[2,2]-pos[1,2]) then

L:=abs((pos[2,1]-pos[1,1])) else L:=abs(pos[2,2]-pos[1,2]) ;

dxx:=((pos[2,1]-pos[1,1])/l)*dx;

dy:=((pos[2,2]-pos[1,2])/l)*dx;

pos_x:=((pos[1,1]*dx));

pos_y:=((pos[1,2]*dx));

i:=1; form1.p.Canvas.Brush.Color:=cllime; form1.p.Canvas.Rectangle(round(pos_x), round(pos_y), round(pos_x+dx),round(pos_y+dx)); form1.p.Canvas.Brush.Color:=clblack;

while i<=l do

begin

pos_xx:=0;

pos_yy:=0;

pos_x:=(pos_x+dxx);

pos_y:=(pos_y+dy); form1.p.Canvas.Brush.Style:=bssolid; form1.p.Canvas.Brush.Color:=cllime;

if (round(pos_y) mod dx) <>0 then

begin

pos_yy:=(round(pos_y) / dx);

pos_yy:=pos_Y-(round(pos_yy)*DX); //D(X)

pos_yy:=pos_y-pos_YY; //x-dx pos_xx:=pos_x;

end else pos_yy:=pos_y;

if (round(pos_x) mod dx) <>0 then

begin

pos_xx:=(round(pos_x) / dx);

pos_xx:=pos_x-(round(pos_xx)*dx);

pos_xx:=pos_x-pos_xx;

pos_yy:=pos_y;

end else pos_xx:=pos_x; form1.p.Canvas.Rectangle(round(pos_xx), round(pos_yy), round(pos_xx+dx),round(pos_yy+dx)); form1.p.Canvas.Brush.Color:=clblack;

inc(i);

end;

end;

procedure TForm1.pPaint(Sender: TObject);

var i:integer;

begin

p.Canvas.FillRect(clientrect); i:=0;

p.Canvas.Pen.Color:=clwhite;

while i<=p.Width do

begin

p.Canvas.moveto(i,0);

p.Canvas.lineto(i,p.Height);

inc(i,dx);

end; i:=0;

while i<=p.height do

begin

p.Canvas.moveto(0,i);

p.Canvas.lineto(p.width,i);

inc(i,dx);

end;

end;

procedure TForm1.pMouseDown(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

begin

ppaint(form1);

DR:=true;

pos[1,1]:=x;

pos[1,2]:=y;

temp_x:=pos[1,1];

temp_y:=pos[1,2];

end;

procedure TForm1.pMouseMove(Sender: TObject; Shift: TShiftState; X,

Y: Integer);

begin

if dr then

begin

p.Canvas.Pen.Mode:=pmxor; p.Canvas.MoveTo(round(pos[1,1]), round(pos[1,2])); p.Canvas.lineTo(round(temp_x), round(temp_y));

p.Canvas.Pen.Color:=clyellow;

pos[2,1]:=x;

pos[2,2]:=y;

form1.Canvas.Font.Color:=cllime;

label1.Caption:=’X = ‘+IntToStr(Round(pos[2,1]/dx))+#10+#13+’Y = ‘+IntToStr(Round(pos[2,2]/dx)); p.Canvas.MoveTo(round(pos[1,1]), round(pos[1,2])); p.Canvas.lineTo(round(x),round(y));

temp_x:=x;

temp_y:=y;

end;

end;

procedure TForm1.pMouseUp(Sender: TObject; Button: TMouseButton;

Shift: TShiftState; X, Y: Integer);

var i:byte;

begin

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;

i:=0;

if round(y) mod dx <>0 then

while round(y-i) mod dx <>0 do

inc(i);

pos[2,2]:=y-i ;

pos[2,1]:=pos[2,1] / dx;

pos[2,2]:=pos[2,2] / dx;

pos[1,1]:=pos[1,1] / dx;

pos[1,2]:=pos[1,2] / dx;

dr:=false;

if LAb=2 then

if (pos[1,1]<>pos[2,1])or(pos[2,2]<>pos[1,2]) then

draw else else

if (pos[1,1]<>pos[2,1])or(pos[2,2]<>pos[1,2]) and (lab=1)then

draw1;

end;

procedure TForm1.SpinEdit1Change(Sender: TObject);

begin

if SpinEdit1.Value>1 then

dx:=SpinEdit1.Value;

ppaint(form1);

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

SpinEdit1.Value:=50;

dx:=SpinEdit1.value;

end;

procedure TForm1.Panel2Click(Sender: TObject);

begin

panel2.BevelOuter:=bvLowered;

panel2.Color:=clActiveBorder;

panel1.BevelOuter:=bvRaised;

panel1.Color:=clBtnFace;

form1.Caption:=’LAB 4';

lab:=1;

end;

procedure TForm1.Panel1Click(Sender: TObject);

begin

panel1.BevelOuter:=bvLowered;

panel1.Color:=clActiveBorder;

panel2.BevelOuter:=bvRaised;

panel2.Color:=clBtnFace;

form1.Caption:=’LAB 5';

lab:=2;

end;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]