Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління
Лабораторна робота №4
З курсу:
«Комп’ютерна графіка»
Тема: Алгоритм креслення відрізків.
Мета: Освоїти найпростіший метод креслення відрізків.
.
ТЕОРЕТИЧНІ ОСНОВИ
Оскільки екран растрового дисплея з електронно-променевою трубкою (ЕПТ) можна розглядати як матрицю дискретних елементів (пікселів), кожний з яких може бути підсвічений, не можна безпосередньо провести ввдрізок з однієї точки в іншу. Процес визначення пікселів, щонайкраще апроксимуючих заданий відрізок, називається розкладанням у растр. У сполученні з процесом порядкової візуалізації зображення він відомий як перетворення растрової розгортки. Для горизонтальних, вертикальних i нахилених під кутом 45° відрізків вибір растрових елемента очевидний. При будь-якій іншій opiєнтації вибрати потрібні пікселі складніше, що i показано на рис.4.1.
Рис.4.1. Розкладання в растр відрізків прямих
В цій лабораторній роботі, нам потрібно показати вci недоліки растру, при малюванні прямих.
Загальні вимоги до алгоритмів креслення відрізків наступні: відрізки повинні виглядати прямими, починатися i закінчуватися в заданих точках, яскравість уздовж відрізка повинна бути постійною i не залежати від довжини i нахилу, малювати потрібно швидко.
Постійна уздовж всього відрізка яскравість досягається лише при проведенні горизонтальних, вертикальних i нахилених під кутом 45° прямих. Для всіх інших орієнтація розкладання в растр приведе до нерівномірності яскравості, як це показано на рис.4.1.
Текст програмного коду:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StringGrid2: TStringGrid;
Button1: TButton;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure koord();
procedure draw_P(x_k,y_k:integer);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x0,y0,delta:integer;
implementation
procedure TForm1.koord();
var delta_p,x1,x2,x3,x4,y1,y2,y3,y4,i:integer;
begin
x0:=round(image1.Width/2);
y0:=round((image1.Height)/2);
with image1.Canvas do
begin
if (image1.Width-x0)>(image1.Height-y0) then
delta:=round((image1.Height-y0)/10)
else
delta:=round((image1.Width-x0)/10);
x1:=x0;
x2:=x0;
x3:=x0;
x4:=x0;
y1:=y0;
y2:=y0;
y3:=y0;
y4:=y0;
for i:=0 to 30 do begin
delta_p:=delta;
MoveTo(x0,y1);
LineTo(x0,y1-delta_p);
moveto(x0-2,y1-delta_p);
LineTo (x0+2,y1-delta_p);
y1:=y1-delta_p;
MoveTo(x0,y2);
LineTo(x0,y2+delta_p);
moveto(x0-2,y2+delta_p);
LineTo (x0+2,y2+delta_p);
y2:=y2+delta_p;
MoveTo(x3,y0);
LineTo(x3+delta_p,y0);
moveto(x3+delta_p,y0-2);
LineTo (x3+delta_p,y0+2);
x3:= x3+delta_p;
MoveTo(x4,y0);
LineTo(x4-delta_p,y0);
moveto(x4-delta_p,y0-2);
LineTo (x4-delta_p,y0+2);
x4:= x4-delta_p;
end;
x1:=x0;
x2:=x0;
x3:=0;
x4:=x0;
y1:=Image1.Height;
y2:=y0;
y3:=y0;
y4:=y0;
for i:=0 to 30 do begin
delta_p:=delta;
pen.Style:=psDot;
moveto(0,y1-delta_p);
LineTo (image1.Width,y1-delta_p);
moveto(x3+delta_p,0);
LineTo (x3+delta_p,image1.Height);
y1:=y1-delta_p;
x3:= x3+delta_p;
end;
end;
end;
procedure TForm1.draw_P(x_k,y_k:integer);
var xx,yy,col:integer;
begin
with image1.Canvas do
begin
pen.Color:=clgray;
pen.Width:=5;
xx:=x0+x_k*delta;
yy:= y0-y_k*delta;
MoveTo(xx,yy);
LineTo(xx,yy);
pen.Width:=1;
col:= brush.Color;
brush.Color:=clblack;
fillRect(rect(xx,yy,xx+delta,yy-delta));
brush.Color:=col;
TextOut(x0+x_k*delta,y0+7,inttostr(x_k));
TextOut(x0+7,y0-y_k*delta,inttostr(y_k));
pen.Style:=psSolid;
end;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
str: array[0..2] of array[0..2] of integer;
x:array[0..2]of array[0..2] of integer;
a:array[0..2]of array[0..2] of integer;
i,j,l,x_t,y_t,x_t0,y_t0,x_tk,y_tk,flag:integer;
m,e:double;
begin
image1.Canvas.FillRect(Rect(0,0,image1.Width,image1.Height));
image1.Transparent:=true;
koord();
x_t0:=strtoint(StringGrid1.Cells[0,0]);
y_t0:=strtoint(StringGrid1.Cells[1,0]);
draw_P(x_t0,y_t0);
///*****************
x_tk:=strtoint(StringGrid2.Cells[0,0]);
y_tk:=strtoint(StringGrid2.Cells[1,0]);
draw_P(x_tk,y_tk);
//**********
e:=-0.5;
x_t:=x_t0;
y_t:=y_t0;
flag:=0;
if x_tk-x_t0 =0 then begin
m:=(x_tk-x_t0)/(y_tk-y_t0);
flag:=1;
end
else
m:=(y_tk-y_t0)/ (x_tk-x_t0) ;
while ((x_t<x_tk) or (y_t<y_tk)) do begin
if (m<=1) and (flag=0) then begin
e:=e+m;
if e<0 then begin
x_t:=x_t+1;
draw_P(x_t,y_t);
end else
begin
y_t:=y_t+1;
x_t:=x_t+1;
draw_P(x_t,y_t);
e:=e-1;
end;
end else begin
m:=(x_tk-x_t0)/(y_tk-y_t0);
flag:=1;
e:=e+m;
if e<0 then begin
y_t:=y_t+1;
draw_P(x_t,y_t);
end else
begin
y_t:=y_t+1;
x_t:=x_t+1;
draw_P(x_t,y_t);
e:=e-1;
end;
end;
end;
with image1.Canvas do
begin
pen.color:=clGreen;
Moveto(x0+x_t0*delta,y0-y_t0*delta);
LineTo(x0+delta+x_tk*delta,y0-delta-y_tk*delta);
pen.color:=clBlack;
end;
end;
end.
Результати роботи програми:
Рис. 1. Розкладання в растр відрізків прямих
Висновок: На даній лабораторній роботі я освоїла найпростіший метод креслення відрізків.