Автор: Пользователь скрыл имя, 18 Декабря 2011 в 15:30, курсовая работа
Рассмотрим трехмерную декартовую систему координат, являющуюся правосторонней. Примем соглашение, в соответствии с которым, будем считать положительными такие повороты, при которых (если смотреть с конца полуоси в направлении начала координат) поворот на 90 против часовой стрелки будет переводить одну полуось в другую.
ПОСТАНОВКА ЗАДАЧИ 3
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 3
Трехмерные преобразования 3
Проекции 6
Математическое описание плоских геометрических проекций 11
АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ 14
ОПИСАНИЕ ПРОГРАММЫ 17
Системные требования 17
Руководство пользователя 17
Листинг программы 19
ЛИТЕРАТУРА 25
const
{Задаем координаты ребер куба}
cube:array[1..12,1..2] of point3D =
(((x: 50; y: 50; z: 50),(x:-50; y: 50; z: 50)),
((x:-50; y: 50; z: 50),(x:-50; y:-50; z: 50)),
((x:-50; y:-50; z: 50),(x: 50; y:-50; z: 50)),
((x: 50; y:-50; z: 50),(x: 50; y: 50; z: 50)),
((x: 50; y: 50; z:-50),(x:-50; y: 50; z:-50)),
((x:-50; y: 50; z:-50),(x:-50; y:-50; z:-50)),
((x:-50; y:-50; z:-50),(x: 50; y:-50; z:-50)),
((x: 50; y:-50; z:-50),(x: 50; y: 50; z:-50)),
((x: 50; y: 50; z: 50),(x: 50; y: 50; z:-50)),
((x:-50; y: 50; z: 50),(x:-50; y: 50; z:-50)),
((x:-50; y:-50; z: 50),(x:-50; y:-50; z:-50)),
((x: 50; y:-50; z: 50),(x: 50; y:-50; z:-50)));
{Задаем координаты ребер пирамиды}
pyramid:array[1..12,1..2] of point3D =
(((x: 50; y: 0; z:-50),(x: 25; y: 43; z:-50)),
((x: 25; y: 43; z:-50),(x:-25; y: 43; z:-50)),
((x:-25; y: 43; z:-50),(x:-50; y: 0; z:-50)),
((x:-50; y: 0; z:-50),(x:-25; y:-43; z:-50)),
((x:-25; y:-43; z:-50),(x: 25; y:-43; z:-50)),
((x: 25; y:-43; z:-50),(x: 50; y: 0; z:-50)),
((x: 50; y: 0; z:-50),(x: 0; y: 0; z: 50)),
((x: 25; y: 43; z:-50),(x: 0; y: 0; z: 50)),
((x:-25; y: 43; z:-50),(x: 0; y: 0; z: 50)),
((x:-50; y: 0; z:-50),(x: 0; y: 0; z: 50)),
((x:-25; y:-43; z:-50),(x: 0; y: 0; z: 50)),
((x: 25; y:-43; z:-50),(x: 0; y: 0; z: 50)));
{Задаем координаты ребер призмы}
prism:array[1..18,1..2] of point3D =
(((x: 50; y: 0; z:-50),(x: 25; y: 43; z:-50)),
((x: 25; y: 43; z:-50),(x:-25; y: 43; z:-50)),
((x:-25; y: 43; z:-50),(x:-50; y: 0; z:-50)),
((x:-50; y: 0; z:-50),(x:-25; y:-43; z:-50)),
((x:-25; y:-43; z:-50),(x: 25; y:-43; z:-50)),
((x: 25; y:-43; z:-50),(x: 50; y: 0; z:-50)),
((x: 50; y: 0; z: 50),(x: 25; y: 43; z: 50)),
((x: 25; y: 43; z: 50),(x:-25; y: 43; z: 50)),
((x:-25; y: 43; z: 50),(x:-50; y: 0; z: 50)),
((x:-50; y: 0; z: 50),(x:-25; y:-43; z: 50)),
((x:-25; y:-43; z: 50),(x: 25; y:-43; z: 50)),
((x: 25; y:-43; z: 50),(x: 50; y: 0; z: 50)),
((x: 50; y: 0; z:-50),(x: 50; y: 0; z: 50)),
((x: 25; y: 43; z:-50),(x: 25; y: 43; z: 50)),
((x:-25; y: 43; z:-50),(x:-25; y: 43; z: 50)),
((x:-50; y: 0; z:-50),(x:-50; y: 0; z: 50)),
((x:-25; y:-43; z:-50),(x:-25; y:-43; z: 50)),
((x: 25; y:-43; z:-50),(x: 25; y:-43; z: 50)));
var
Form1: TForm1;
point,tpoint1,tpoint2:point3D;
x1,y1,x2,y2: real;
i,fig:byte;
flagclick: boolean;
implementation
{$R *.dfm}
{сдвиг фигуры
на центр экрана по
function TForm1.sx(x:real):integer;
begin
sx:=159+round(x); {320/2-1}
end;
{сдвиг фигуры на центр экрана по вертикали}
function TForm1.sy(y:real):integer;
begin
sy:=119-round(y); {240/2-1}
end;
{преобразование координат ребра относительно точки обзора}
procedure TForm1.trans_coord(wcoord, vcoord:point3D; var scoord:point3D);
{ wcoord - точка ребра фигуры, vcoord - точка обзора, scoord - результат преобразования}
var
len,projXOY:real;
begin
if (vcoord.x=0) and (vcoord.y=0) then
begin
scoord.x:=-wcoord.x;
scoord.y:=-wcoord.y;
scoord.z:=-wcoord.z;
end
else
begin
len:=sqrt(sqr(vcoord.x)+sqr(
projXOY:=sqrt(sqr(vcoord.x)+
scoord.x:=(-wcoord.x*vcoord.y+
scoord.y:=-(vcoord.z*(wcoord.
scoord.z:=-(wcoord.x*vcoord.x+
end;
end;
{параллельная проекция фигуры - преобразование координат}
procedure TForm1.parallel_projection(
{point - точка ребра фигуры, point_sight - точка обзора, x,y - точка на экране}
var
tpoint:point3D;
begin
trans_coord(point,point_sight,
x:=tpoint.x+1/(2*sqrt(2))*
y:=tpoint.y+1/(2*sqrt(2))*
end;
{центральная проекция фигуры - преобразование координат}
procedure TForm1.central_projection(
{point - точка ребра фигуры, point_sight - точка обзора, x,y - точка на экране}
var
tpoint:point3D;
dist: real;
begin
trans_coord(point,point_sight,
dist:=sqrt(sqr(point_sight.x)+
x:=tpoint.x/(tpoint.z/dist+1);
y:=tpoint.y/(tpoint.z/dist+1);
end;
{построение центральной проекции}
procedure TForm1.Show_central_
begin
if Fig_Kub.Checked then
begin
for i:=1 to 12 do
begin
central_projection(cube[i,1],
central_projection(cube[i,2],
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
if Fig_Pir.Checked then
begin
for i:=1 to 12 do
begin
central_projection(pyramid[i,
central_projection(pyramid[i,
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
if Fig_Pri.Checked then
begin
for i:=1 to 18 do
begin
central_projection(prism[i,1],
central_projection(prism[i,2],
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
end;
{построение параллельной проекции}
procedure TForm1.Show_parallel_
begin
if Fig_Kub.Checked then
begin
for i:=1 to 12 do
begin
parallel_projection(cube[i,1],
parallel_projection(cube[i,2],
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
if Fig_Pir.Checked then
begin
for i:=1 to 12 do
begin
parallel_projection(pyramid[i,
parallel_projection(pyramid[i,
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
if Fig_Pri.Checked then
begin
for i:=1 to 18 do
begin
parallel_projection(prism[i,1]
parallel_projection(prism[i,2]
display.Canvas.MoveTo(sx(x1),
display.Canvas.LineTo(sx(x2),
end;
end;
end;
procedure TForm1.Show_ButtonClick(
begin
display.Picture:= nil;
//координаты точки обзора
point.X:=StrToInt(X_Edit.Text)
point.Y:=StrToInt(Y_Edit.Text)
point.Z:=StrToInt(Z_Edit.Text)
//определение проекции
if Par_pro.Checked then Show_parallel_projection;
if Cen_pro.Checked then Show_central_projection ;
end;
procedure TForm1.DisplayMouseDown(
Shift: TShiftState; X, Y: Integer);
begin
Show_ButtonClick(nil);
flagclick :=true;
end;
procedure TForm1.DisplayMouseMove(
Y: Integer);
begin
if flagclick then
begin
X_Edit.Text:=(IntToStr(Round(
Z_Edit.Text:=(IntToStr(Round(
Show_ButtonClick(nil);
end;
end;
procedure TForm1.DisplayMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
flagclick :=false;
end;
end.
1. П. В. Вельтмандер. Учебное пособие «Основные алгоритмы компьютерной графики».
2. А. В. Казанцев. Тексты специального курса лекций «Основы компьютерной графики»
3. А. Ю. Дёмин, А.В. Кудинов. Учебное пособие «Компьютерная графика».
4. Ньюмен. У., Спрулл Р. «Основы интерактивной машинной графики»
5. Котов И. И. «Алгоритмы машинной графики»