- •Комп’ютерна графіка
- •1.3 Перетворення прямих ліній (відрізків)
- •1.4 Обертання
- •1.5 Відображення
- •1.6 Зміна масштабу
- •1.7 Двовимірний зсув і однорідні координати
- •2.6 Відображення в просторі
- •2.2 Тривимірна зміна масштабу
- •2.3 Перетворення трьохвимірних координат в двовимірні
- •2.4 Тривимірний зсув
- •2.7 Просторовий перенос
- •2.8 Тривимірне обертання навколо довільної осі
- •3.2 Косокутні проекції
- •Лабораторна робота №4 Алгоритм креслення відрізків
- •Теоретичні основи
- •Лабораторна робота № 5 Метод цифрового диференціального аналізатора
- •Теоретичні відомості
- •Алгоритм Брезенхема розкладання в растр відрізка для першого октанта
- •6.2. Загальний алгоритм Брезенхема.
- •Узагальнений цілочисельний алгоритм Брезенхема для усіх квадрантів
- •Лабораторна робота № 7 Алгоритм Брезенхема для генерації кола
- •Теоретичні основи
- •8.2 . Простий алгоритм з упорядкованим списком ребер
- •Простий алгоритм з упорядкованим списком ребер
- •8.3. Більш ефективні алгоритми з упорядкованим списком ребер
- •Більш ефективний алгоритм з упорядкованим списком ребер
- •9.1 Простий алгоритм заповнення з запалом і стеком
- •9.2 Простий алгоритм заповнення
- •Приклад 9.1. Простий алгоритм заповнення з запалом
- •Приклад 9.2. Алгоритм заповнення з запалом для багатокутника з діркою
- •9.3 Порядковий алгоритм заповнення з запалом
- •9.4 Алгоритм порядкового заповнення з запалом
- •9.5 Порядковий алгоритм заповнення з запалом
- •Приклад 9.3. Порядковий алгоритм заповнення з запалом
- •Література
- •Комп’ютерна графіка Методичні вказівки
Лабораторна робота №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.
