Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Компьютерная графика

Автор: Ирина 24.05.2006 19:34

Здравствуйте все! Подскажите пожалуйста.
Имеется фигура, заданная трёхмерными координатами. Для изменения фигуры или масштабирования её нужно использовать матрицы. Ну с матрицами я вроде бы разобралась. С помощью операций с матрицами я высчитываю новые координаты фигуры. Затем с помощью процедуры Pict_3(5) хочу прорисовать этот объект на экране. Но вот как перевести трёхмерные координаты в координаты на экране не понятно. Может кто-нибудь подскажет...

У меня сейчас пока вот такой код:

Код

uses crt, graph; {используемые модули}
  var
    n,i,j,k: integer;
    xa,ya,za: array [1..50] of real;             {координаты фигуры}
    x,y,z,xp,yp: array [1..50] of real;    {расчётные координаты фигуры}
    ErrCode, grMode, grDriver : Integer;         {переменные для работы с графическим драйвером}
    a,b,r: array [1..4, 1..4] of real;
       h: array [1..50] of integer;


{________ процедура присвоения матрице R значения единичной____________________}
   procedure R_1;
     begin
       for i:=1 to 4 do
          begin                           {единичная матрица}
            for j:=1 to 4 do                      {  1 0 0 0}
               r[i,j]:=0;                         {  0 1 0 0}
               r[i,i]:=1;                         {  0 0 1 0}
         end;                                     {  0 0 0 1}
    end;

  {________процедура умножения матриц___________________________}

   procedure Mult_3;
    var
     z:real;
      begin
        for i:=1 to 4 do
        for j:=1 to 4 do
          begin
            z:=0;
            for k:=1 to 4 do
            z:=z+a[i,k]*r[k,j];
            b[i,j]:=z;
         end;
       for i:=1 to 4 do
       for j:=1 to 4 do
       r[i,j]:=b[i,j];       { результат умножения матриц - матрица В записывается в R }
    end;
  {_________процедура вычисления новых координат фигуры по базовым координатам_}
  {_________xa, ya, za с использованием матрицы R______________________________}
   procedure New_XYZ;
    begin
     for i:=1 to i do
     begin
       x[i]:=round(xa[i]*r[1,1]+ya[i]*r[1,2]+za[i]*r[1,3]+r[1,4]);
       y[i]:=round(xa[i]*r[2,1]+ya[i]*r[2,2]+za[i]*r[2,3]+r[2,4]);
       z[i]:=round(xa[i]*r[3,1]+ya[i]*r[3,2]+za[i]*r[3,3]+r[3,4]);
     end;
    end;
  {______расчёт матриц а в для масштабирования трёхмерного объекта_________}
   procedure Scale_3(sx,sy,sz:real);
    begin
     for i:=1 to 4 do                 {матрица для масштабирования}
     for j:=1 to 4 do                    { sx 0 0 0 }
     a[i,j]:=0; a[1,1]:=sx;           { 0 sy 0 0 }
     a[2,2]:=sy; a[3,3]:=sz;        { 0 0 sz 0 }
     a[4,4]:=1;                           { 0 0  0 1 }
     Mult_3;
   end;
  {____процедура рисования фигуры по координатам X Y_______________}
   procedure pict_3(color:word);
    var
       i,j:integer;
      SetBkColor(13);
      SetColor(15);

         for i:=1 to 5 do
           begin
            { Считаем что ось Y - вертикально, X - горизонтально }
            { Вычисляем координаты на экране }
          


          end;
           line(xp[1],yp[1],xp[2],xp[2]);
           line(xp[2],yp[2],xp[3],xp[3]);
           line(xp[1],yp[1],xp[4],xp[4]);




       end;

{______основная программа______________________________________}
begin
  clrscr; {очистить экран}
  grDriver := Detect; {попытка инициализировать графический режим}
  InitGraph(grDriver, grMode,'C:\BP\BGI');
  ErrCode := GraphResult;
  SetColor(10);
if ErrCode = grOk then
        begin
                        
          xa[1]:=0; ya[1]:=0; za[1]:=10;
          xa[2]:=50; ya[2]:=0; za[2]:=10;
          xa[3]:=50; ya[3]:=20; za[3]:=10;
          xa[4]:=0; ya[4]:=20; za[4]:=10;
          xa[5]:=50; ya[5]:=50; za[5]:=100;
          pict_3(10);



         end;

end.

Автор: volvo 24.05.2006 19:57

Цитата
Но вот как перевести трёхмерные координаты в координаты на экране не понятно.
Если я тебя правильно понял - XP и YP будут содержать преобразованные координаты для отрисовки на 2-мерном экране? Тогда, например, так:

...
XP[i] := X[i] + (GetMaxX div 2) - Trunc(Z[i] / Sqrt(2));
YP[i] := (GetMaxY div 2) - Y[i] + Trunc(Z[i] / Sqrt(2));
...
Началом 2D координат является центр экрана (выдрал из программы, которую, по-моему, выкладывал где-то на форуме...)

Автор: Ирина 25.05.2006 18:43

Привет!!! Я именно это и хотела узнать. Volvo, спасибо за помощь!!! give_rose.gif