Построение 3D объектов каркасным методом, с возможностью изменения точек наблюдения

Автор: Пользователь скрыл имя, 18 Декабря 2011 в 15:30, курсовая работа

Описание работы

Рассмотрим трехмерную декартовую систему координат, являющуюся правосторонней. Примем соглашение, в соответствии с которым, будем считать положительными такие повороты, при которых (если смотреть с конца полуоси в направлении начала координат) поворот на 90 против часовой стрелки будет переводить одну полуось в другую.

Содержание

ПОСТАНОВКА ЗАДАЧИ 3
ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 3
Трехмерные преобразования 3
Проекции 6
Математическое описание плоских геометрических проекций 11
АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ 14
ОПИСАНИЕ ПРОГРАММЫ 17
Системные требования 17
Руководство пользователя 17
Листинг программы 19
ЛИТЕРАТУРА 25

Работа содержит 1 файл

Пояснительная записка.doc

— 521.50 Кб (Скачать)
 

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(vcoord.y)+sqr(vcoord.z));

    projXOY:=sqrt(sqr(vcoord.x)+sqr(vcoord.y));

    scoord.x:=(-wcoord.x*vcoord.y+wcoord.y*vcoord.x)/(projXOY);

    scoord.y:=-(vcoord.z*(wcoord.x*vcoord.x+wcoord.y*vcoord.y))/(projXOY*len)+wcoord.z*projXOY/len;

    scoord.z:=-(wcoord.x*vcoord.x+wcoord.y*vcoord.y+wcoord.z*vcoord.z)/len;

  end;

end;

 

{параллельная  проекция фигуры - преобразование  координат}

procedure TForm1.parallel_projection(point, point_sight:point3D; var x,y:real);

{point - точка ребра  фигуры, point_sight - точка обзора, x,y - точка  на экране}

var

  tpoint:point3D;

begin

  trans_coord(point,point_sight,tpoint);

  x:=tpoint.x+1/(2*sqrt(2))*tpoint.z;

  y:=tpoint.y+1/(2*sqrt(2))*tpoint.z;

end;

 

{центральная  проекция фигуры - преобразование  координат}

procedure TForm1.central_projection(point, point_sight:point3D; var x,y:real);

{point - точка ребра фигуры, point_sight - точка обзора, x,y - точка на экране}

var

  tpoint:point3D;

  dist:  real;

begin

  trans_coord(point,point_sight,tpoint);

  dist:=sqrt(sqr(point_sight.x)+sqr(point_sight.y)+sqr(point_sight.z));

  x:=tpoint.x/(tpoint.z/dist+1);

  y:=tpoint.y/(tpoint.z/dist+1);

end;

 

{построение центральной проекции}

procedure TForm1.Show_central_projection;

begin

  if Fig_Kub.Checked then

        begin

          for i:=1 to 12 do

           begin

            central_projection(cube[i,1],point,x1,y1);

            central_projection(cube[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

  if Fig_Pir.Checked then

        begin

          for i:=1 to 12 do

           begin

            central_projection(pyramid[i,1],point,x1,y1);

            central_projection(pyramid[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

  if Fig_Pri.Checked then

        begin

          for i:=1 to 18 do

           begin

            central_projection(prism[i,1],point,x1,y1);

            central_projection(prism[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

end;

 

{построение  параллельной проекции}

procedure TForm1.Show_parallel_projection;

begin

  if Fig_Kub.Checked then

        begin

          for i:=1 to 12 do

           begin

            parallel_projection(cube[i,1],point,x1,y1);

            parallel_projection(cube[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

  if Fig_Pir.Checked then

        begin

          for i:=1 to 12 do

           begin

            parallel_projection(pyramid[i,1],point,x1,y1);

            parallel_projection(pyramid[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

  if Fig_Pri.Checked then

        begin

          for i:=1 to 18 do

           begin

            parallel_projection(prism[i,1],point,x1,y1);

            parallel_projection(prism[i,2],point,x2,y2);

            display.Canvas.MoveTo(sx(x1),sy(y1));

            display.Canvas.LineTo(sx(x2),sy(y2));

           end;

        end;

end;

 

procedure TForm1.Show_ButtonClick(Sender: TObject);

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(Sender: TObject; Button: TMouseButton;

  Shift: TShiftState; X, Y: Integer);

begin

    Show_ButtonClick(nil);

    flagclick :=true;

end;

 

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

  Y: Integer);

begin

  if flagclick then

  begin

    X_Edit.Text:=(IntToStr(Round(x)));

    Z_Edit.Text:=(IntToStr(Round(y)));

    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. Котов И. И. «Алгоритмы машинной графики»

Информация о работе Построение 3D объектов каркасным методом, с возможностью изменения точек наблюдения