Куб и его вращение

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Куб и его вращение

Сообщение RoyalSecret » 03.12.2016 11:24:00

Доброго времени суток.
Помогите мне, пожалуйста, выполнить задание с 3D моделью куба.
Задание такое, надо сделать так, чтобы каждая грань куба могла "жить" отдельно от самой фигуры.
Вот то, что у меня уже написано:

Код: Выделить всё
public
    { public declarations }
  end;
  type T3DPoint = record
                x,y,z:Double;
                end;

var
  F_3DGraf: TF_3DGraf;
  Points3D:array of T3DPoint;
  XAng,YAng,ZAng:Double;
  M:array [0..2,0..2] of Double;
implementation

{$R *.lfm}

{ TF_3DGraf }

procedure TF_3DGraf.Button1Click(Sender: TObject);
begin
  XAng:=StrToFloat(Edit1.Text)*3.14/180;
YAng:=StrToFloat(Edit2.Text)*3.14/180;
ZAng:=StrToFloat(Edit3.Text)*3.14/180;
SetLength(Points3D,24);
Points3D[0].x:=-50;Points3D[0].y:=-50;Points3D[0].z:=50;
Points3D[1].x:=50;Points3D[1].y:=-50;Points3D[1].z:=50;
Points3D[2].x:=50;Points3D[2].y:=50;Points3D[2].z:=50;
Points3D[3].x:=-50;Points3D[3].y:=50;Points3D[3].z:=50;
Points3D[4].x:=-50;Points3D[4].y:=-50;Points3D[4].z:=-50;
Points3D[5].x:=50;Points3D[5].y:=-50;Points3D[5].z:=-50;
Points3D[6].x:=50;Points3D[6].y:=50;Points3D[6].z:=-50;
Points3D[7].x:=-50;Points3D[7].y:=50;Points3D[7].z:=-50;
Points3D[8].x:=50;Points3D[8].y:=-50;Points3D[8].z:=50;
Points3D[9].x:=50;Points3D[9].y:=-50;Points3D[9].z:=-50;
Points3D[10].x:=50;Points3D[10].y:=50;Points3D[10].z:=-50;
Points3D[11].x:=50;Points3D[11].y:=50;Points3D[11].z:=50;
Points3D[12].x:=-50;Points3D[12].y:=-50;Points3D[12].z:=50;
Points3D[13].x:=-50;Points3D[13].y:=-50;Points3D[13].z:=-50;
Points3D[14].x:=-50;Points3D[14].y:=50;Points3D[14].z:=-50;
Points3D[15].x:=-50;Points3D[15].y:=50;Points3D[15].z:=50;
Points3D[16].x:=-50;Points3D[16].y:=-50;Points3D[16].z:=50;
Points3D[17].x:=-50;Points3D[17].y:=-50;Points3D[17].z:=-50;
Points3D[18].x:=50;Points3D[18].y:=-50;Points3D[18].z:=-50;
Points3D[19].x:=50;Points3D[19].y:=-50;Points3D[19].z:=50;
Points3D[20].x:=-50;Points3D[20].y:=50;Points3D[20].z:=50;
Points3D[21].x:=-50;Points3D[21].y:=50;Points3D[21].z:=-50;
Points3D[22].x:=50;Points3D[22].y:=50;Points3D[22].z:=-50;
Points3D[23].x:=50;Points3D[23].y:=50;Points3D[23].z:=50;

Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=RGBToColor(0,0,0);
Canvas.Pen.Width:=4;
Canvas.Brush.Color := clGreen;
Canvas.Polygon([Point(trunc(Points3D[4].x)+200, trunc(Points3D[4].y)+200),Point(trunc(Points3D[5].x)+200,trunc(Points3D[5].y)+200),
                Point(trunc(Points3D[6].x)+200, trunc(Points3D[6].y)+200), Point(trunc(Points3D[7].x)+200, trunc(Points3D[7].y)+200)]);
Canvas.Brush.Color := clRed;
Canvas.Polygon([Point(trunc(Points3D[0].x)+200, trunc(Points3D[0].y)+200),Point(trunc(Points3D[1].x)+200,trunc(Points3D[1].y)+200),
                Point(trunc(Points3D[2].x)+200, trunc(Points3D[2].y)+200), Point(trunc(Points3D[3].x)+200, trunc(Points3D[3].y)+200)]);
Canvas.Brush.Color := clBlue;
Canvas.Polygon([Point(trunc(Points3D[8].x)+200, trunc(Points3D[8].y)+200),Point(trunc(Points3D[9].x)+200,trunc(Points3D[9].y)+200),
                Point(trunc(Points3D[10].x)+200, trunc(Points3D[10].y)+200), Point(trunc(Points3D[11].x)+200, trunc(Points3D[11].y)+200)]);
Canvas.Brush.Color := clLtGray;
Canvas.Polygon([Point(trunc(Points3D[12].x)+200, trunc(Points3D[12].y)+200),Point(trunc(Points3D[13].x)+200,trunc(Points3D[13].y)+200),
                Point(trunc(Points3D[14].x)+200, trunc(Points3D[14].y)+200), Point(trunc(Points3D[15].x)+200, trunc(Points3D[15].y)+200)]);
Canvas.Brush.Color := clPurple;
Canvas.Polygon([Point(trunc(Points3D[16].x)+200, trunc(Points3D[16].y)+200),Point(trunc(Points3D[17].x)+200,trunc(Points3D[17].y)+200),
                Point(trunc(Points3D[18].x)+200, trunc(Points3D[18].y)+200), Point(trunc(Points3D[19].x)+200, trunc(Points3D[19].y)+200)]);
Canvas.Brush.Color := clYellow;
Canvas.Polygon([Point(trunc(Points3D[20].x)+200, trunc(Points3D[20].y)+200),Point(trunc(Points3D[21].x)+200,trunc(Points3D[21].y)+200),
                Point(trunc(Points3D[22].x)+200, trunc(Points3D[22].y)+200), Point(trunc(Points3D[23].x)+200, trunc(Points3D[23].y)+200)]);

Button2.Enabled:=true;
end;

procedure TF_3DGraf.Button2Click(Sender: TObject);
begin
  Timer1.Enabled:=not Timer1.Enabled;
end;

procedure TF_3DGraf.Timer1Timer(Sender: TObject);
var x1,y1,z1:Double;
    i,j:longint;
    ordP:array of longint;
begin
   SetLength(ordP,length(Points3D));

  M[0,0]:=cos(zAng)*cos(yAng);
  M[0,1]:=cos(zAng)*sin(yAng)*sin(xAng)+sin(zAng)*cos(xAng);
  M[0,2]:=-cos(zAng)*sin(yAng)*cos(xAng)+sin(zAng)*sin(xAng);
  M[1,0]:=-sin(zAng)*cos(yAng);
  M[1,1]:=-sin(zAng)*-sin(yAng)*-sin(xAng)+cos(zAng)*cos(xAng);
  M[1,2]:=-sin(zAng)*-sin(yAng)*cos(xAng)+cos(zAng)*sin(xAng);
  M[2,0]:=sin(yAng);
  M[2,1]:=-cos(yAng)*sin(xAng);
  M[2,2]:=cos(yAng)*cos(xAng);

for i:=0 to length(Points3D)-1 do ordP[i]:=0;

for i:=0 to length(Points3D)-1 do
    begin
    x1:=Points3D[i].x*M[0,0]+Points3D[i].y*M[0,1]+Points3D[i].z*M[0,2];
    y1:=Points3D[i].x*M[1,0]+Points3D[i].y*M[1,1]+Points3D[i].z*M[1,2];
    z1:=Points3D[i].x*M[2,0]+Points3D[i].y*M[2,1]+Points3D[i].z*M[2,2];

    Points3D[i].x:=x1;Points3D[i].y:=y1;Points3D[i].z:=z1;
    for j:=0 to i-1 do
        if Points3D[i].z>Points3D[j].z then ordP[i]:=ordP[i]+1
                                       else ordP[j]:=ordP[j]+1;
    end;

Canvas.Brush.Color := clBtnFace;
Canvas.Rectangle(0,0,Width,Height);
Canvas.Pen.Color:=RGBToColor(0,0,0);
Canvas.Pen.Width:=4;

for i:=0 to length(Points3D)-1 do
    for j:=0 to length(Points3D)-1 do
        if i=ordP[j]
           then begin
                if (j=0)or(j=1)or(j=2)or(j=3)
                   then begin
                        Canvas.Brush.Color := clRed;
                        Canvas.Polygon([Point(trunc(Points3D[0].x)+200, trunc(Points3D[0].y)+200),Point(trunc(Points3D[1].x)+200,trunc(Points3D[1].y)+200),
                                        Point(trunc(Points3D[2].x)+200, trunc(Points3D[2].y)+200), Point(trunc(Points3D[3].x)+200, trunc(Points3D[3].y)+200)]);
                        end;
                if (j=4)or(j=5)or(j=6)or(j=7)
                   then begin
                        Canvas.Brush.Color := clGreen;
                        Canvas.Polygon([Point(trunc(Points3D[4].x)+200, trunc(Points3D[4].y)+200),Point(trunc(Points3D[5].x)+200,trunc(Points3D[5].y)+200),
                                        Point(trunc(Points3D[6].x)+200, trunc(Points3D[6].y)+200), Point(trunc(Points3D[7].x)+200, trunc(Points3D[7].y)+200)]);
                        end;
                if (j=8)or(j=9)or(j=10)or(j=11)
                   then begin
                        Canvas.Brush.Color := clBlue;
                        Canvas.Polygon([Point(trunc(Points3D[8].x)+200, trunc(Points3D[8].y)+200),Point(trunc(Points3D[9].x)+200,trunc(Points3D[9].y)+200),
                                        Point(trunc(Points3D[10].x)+200, trunc(Points3D[10].y)+200), Point(trunc(Points3D[11].x)+200, trunc(Points3D[11].y)+200)]);
                        end;
                if (j=12)or(j=13)or(j=14)or(j=15)
                   then begin
                        Canvas.Brush.Color := clLtGray;
                        Canvas.Polygon([Point(trunc(Points3D[12].x)+200, trunc(Points3D[12].y)+200),Point(trunc(Points3D[13].x)+200,trunc(Points3D[13].y)+200),
                                        Point(trunc(Points3D[14].x)+200, trunc(Points3D[14].y)+200), Point(trunc(Points3D[15].x)+200, trunc(Points3D[15].y)+200)]);
                        end;
                if (j=16)or(j=17)or(j=18)or(j=19)
                   then begin
                        Canvas.Brush.Color := clPurple;
                        Canvas.Polygon([Point(trunc(Points3D[16].x)+200, trunc(Points3D[16].y)+200),Point(trunc(Points3D[17].x)+200,trunc(Points3D[17].y)+200),
                                        Point(trunc(Points3D[18].x)+200, trunc(Points3D[18].y)+200), Point(trunc(Points3D[19].x)+200, trunc(Points3D[19].y)+200)]);
                        end;
                if (j=20)or(j=21)or(j=22)or(j=23)
                   then begin
                        Canvas.Brush.Color := clYellow;
                        Canvas.Polygon([Point(trunc(Points3D[20].x)+200, trunc(Points3D[20].y)+200),Point(trunc(Points3D[21].x)+200,trunc(Points3D[21].y)+200),
                                        Point(trunc(Points3D[22].x)+200, trunc(Points3D[22].y)+200), Point(trunc(Points3D[23].x)+200, trunc(Points3D[23].y)+200)]);
                        end;
                end;
end;

end.
RoyalSecret
незнакомец
 
Сообщения: 2
Зарегистрирован: 03.12.2016 11:20:10

Re: Куб и его вращение

Сообщение Little_Roo » 03.12.2016 13:59:06

RoyalSecret писал(а):надо сделать так, чтобы каждая грань куба могла "жить" отдельно от самой фигуры.

????
Аватара пользователя
Little_Roo
энтузиаст
 
Сообщения: 638
Зарегистрирован: 27.02.2009 19:56:36
Откуда: Санкт-Петербург

Re: Куб и его вращение

Сообщение Лекс Айрин » 03.12.2016 14:46:33

Little_Roo, видимо, требуется составить куб из шести квадратов с возможностью дальнейшей манипуляции ими.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Куб и его вращение

Сообщение RoyalSecret » 04.12.2016 12:29:21

Нет, надо, чтобы каждая грань открывалась. Как дверь, ну или как крышка у сундука
RoyalSecret
незнакомец
 
Сообщения: 2
Зарегистрирован: 03.12.2016 11:20:10

Re: Куб и его вращение

Сообщение olegy123 » 04.12.2016 21:23:06

Только через Матричные преобразования: матрица вращения, матрица перемещения..
Одна плоскость может содержать даже более 2х операций: перемещений и вращений.. там одна из матриц будет "открывать" на заданный угол.

вообще 4мя точками(SetLength(Points3D,4);) и матрицами преобразования можно нарисовать все грани у куба с нужными вращениями.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], Yandex [Bot] и гости: 84

Рейтинг@Mail.ru
cron