Московский
Государственный университет приборостроения и информатики
Сергиево-Посадский Филиал
Отчёт по лабораторной работе №1
по дисциплине «Компьютерная графика»
|
Выполнил студент
|
|
III курса 230101 (2)
|
|
|
|
|
|
Проверил
|
|
Преподаватель
|
|
|
2009г
Введение
Данная программа производит по пиксельную прорисовку точки, линии, и
закрашенного треугольника, аппроксимируя реальные положения точек на плоскости,
к ячейкам монитора. Программа была создана в среде разработки приложений «Delphi 7», вывод графической информации на экран осуществлялся при помощи
свойства, стандартного класса TCanvas, Pixels.
На форме программы содержатся 3 вкладки: «Пиксель», «Линия»,
«Треугольник».
Для прорисовки пикселя, необходимо зайти на вкладку «Пиксель», ввести
координаты, где будет отображен этот пиксель, в однострочные поля
редактирования «Х» и «У», и нажать на кнопку «Нарисовать пиксель», после чего
будет предоставлено диалоговое окно, в котором нужно указать цвет рисуемого
пикселя.
Для прорисовки линии, необходимо зайти на вкладку «Линия», ввести
координаты начала линии, в однострочные поля редактирования «Х1» и «У1», ввести
координаты конца линии, в однострочные поля редактирования «Х2» и «У2», и
нажать на кнопку «Нарисовать линию», после чего будет предоставлено диалоговое
окно, в котором нужно указать цвет рисуемой линии. При прорисовки линии
используется математический расчет, для определения точек, находящихся на
линии, и прорисовка именно этих точек.
Для прорисовки закрашенного треугольника, необходимо зайти на вкладку
«Треугольник», ввести координаты вершин треугольника, в однострочные поля
редактирования «Х1», «У1», «Х2», «У2», «Х3», «У3»и нажать на кнопку
«Треугольник», после чего будет предоставлено диалоговое окно, в котором нужно
указать цвет рисуемого закрашенного треугольника. При прорисовки треугольника
используется математический расчет, для определения точек, находящихся внутри
треугольника, либо на его ребрах, и прорисовка именно этих точек.
Программный код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,
Controls, Forms,
Dialogs, StdCtrls, ComCtrls, TabNotBk, ExtCtrls;
type
TForm1 = class(TForm)
ColorDialog1: TColorDialog;
ColorDialog2: TColorDialog;
TB: TTabbedNotebook;
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
PaintBox1: TPaintBox;
PaintBox2: TPaintBox;
Edit3: TEdit;
Edit4: TEdit;
Edit5: TEdit;
Edit6: TEdit;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit7: TEdit;
Edit8: TEdit;
Edit9: TEdit;
Edit10: TEdit;
Edit11: TEdit;
Edit12: TEdit;
Button3: TButton;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
ColorDialog3: TColorDialog;
PaintBox3: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function square(x1, y1, x2, y2, x3, y3: integer): real;
var //функция нахождения площади треугольника
p,
a, b, c: real;
begin
y1:=-y1;
y2:=-y2;
y3:=-y3;
a := sqrt(sqr(x2 - x1) + sqr(y2 - y1));
b := sqrt(sqr(x3 - x1) + sqr(y3 - y1));
c := sqrt(sqr(x3 - x2) + sqr(y3 - y2));
p := (a + b + c) * 0.5;
square := sqrt(p * (p - a) * (p - b) * (p - c));
end;
Procedure Drawline(x1,y1,x2,y2:integer; c:Tcolor;
ppbb:TPaintBox);
var //процедура по пиксельной прорисовки линии
x,y,x3,y3,x4,y4:integer;
xr,yr:real;
begin
y3:=y2-y1;
x3:=x2-x1;
x4:=x3*y1;
y4:=y3*x1;
xr:=0;
repeat
if x3=0 then yr:=0 else
yr:=(y3*xr - y4 + x4) / x3;
x:=round(xr);
y:=round(yr);
if x1>x2 then
if (xr<x1) and (xr>x2) then
ppbb.Canvas.Pixels[x,y]:=c else
else
if (xr>x1) and (xr<x2) then
ppbb.Canvas.Pixels[x,y]:=c;
xr:=xr+0.01;
until x>10000;
if x1=x2 then
begin
yr:=0;
repeat
if y3=0 then xr:=0 else
xr:=(x3*yr+y4-x4) / y3;
x:=round(xr);
y:=round(yr);
if y1>y2 then
if (yr<y1) and (yr>y2) then
ppbb.Canvas.Pixels[x,y]:=c else
else
if (yr>y1) and (yr<y2) then
ppbb.Canvas.Pixels[x,y]:=c;
yr:=yr+0.01;
until y>10000;
end;
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin //рисование пикселя
if form1.colordialog1.Execute then
paintbox1.Canvas.Pixels[strtoint(edit1.Text),strtoint(edit2.Text)]:=colordialog1.Color;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin //по пиксельное рисование прямой
if
form1.colordialog2.Execute then
drawline(strtoint(edit3.Text),strtoint(edit4.Text),strtoint(edit5.Text),strtoint(edit6.Text),colordialog2.color,
form1.paintbox2);
end;
procedure TForm1.Button3Click(Sender: TObject);
var //по пиксельное рисование закрашенного треугольника
i,j:integer;
sqmax,sq1,sq2,sq3:real;
maxx, minx, maxy, miny:integer;
begin
if form1.colordialog3.Execute then
begin
sqmax:=square(strtoint(edit7.Text),strtoint(edit8.Text),strtoint(edit9.Text),strtoint(edit10.Text),strtoint(edit11.Text),strtoint(edit12.Text));
if strtoint(edit7.Text)<=strtoint(edit9.Text) then
minx:=strtoint(edit7.Text) else minx:=strtoint(edit9.Text);
if minx>strtoint(edit11.Text) then
minx:=strtoint(edit11.Text);
if strtoint(edit8.Text)<=strtoint(edit10.Text) then
miny:=strtoint(edit8.Text) else miny:=strtoint(edit10.Text);
if miny>strtoint(edit12.Text) then
miny:=strtoint(edit12.Text);
if strtoint(edit7.Text)>=strtoint(edit9.Text) then
maxx:=strtoint(edit7.Text) else maxx:=strtoint(edit9.Text);
if maxx<strtoint(edit11.Text) then
maxx:=strtoint(edit11.Text);
if strtoint(edit8.Text)>=strtoint(edit10.Text) then
maxy:=strtoint(edit8.Text) else maxy:=strtoint(edit10.Text);
if maxy<strtoint(edit12.Text) then
maxy:=strtoint(edit12.Text);
For i:=minx to maxx do
for j:=miny to maxy do
begin
sq1:=square(i,j,strtoint(edit9.Text),strtoint(edit10.Text),strtoint(edit11.Text),strtoint(edit12.Text));
sq2:=square(i,j,strtoint(edit11.Text),strtoint(edit12.Text),strtoint(edit7.Text),strtoint(edit8.Text));
sq3:=square(i,j,strtoint(edit7.Text),strtoint(edit8.Text),strtoint(edit9.Text),strtoint(edit10.Text));
if ROUND(sqmax)=ROUND(sq1+sq2+sq3) then
paintbox3.Canvas.Pixels[i,j]:=colordialog3.Color;
end;
end;
end;
end.
Результат работы