Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, Unit2, ExtCtrls, ComCtrls;
- type
- matrix = array[0..3, 0..3] of real;
- figure = record
- points: array[0..32] of TPoint3D;
- p_count: 0..32;
- edges: array[byte, 0..1] of ^TPoint3D;
- e_count: byte;
- end;
- TForm1 = class(TForm)
- Image1: TImage;
- Timer1: TTimer;
- procedure FormCreate(Sender: TObject);
- function Transform(point: TPoint3D; trs: matrix): TPoint3D;
- procedure DrawFigure(fig: figure; col: TColor);
- procedure Timer1Timer(Sender: TObject);
- procedure InitHexahedron();
- procedure InitMatrix();
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- var
- Form1: TForm1;
- hexahedron, hexahedron2: figure;
- ticks: longint;
- isometry_mtx, move_mtx,move_mtx2: matrix;
- implementation
- {$R *.dfm}
- procedure TForm1.FormCreate(Sender: TObject);
- var size: integer;
- begin
- ticks := 0;
- InitHexahedron;
- InitMatrix;
- Image1.Canvas.Pen.Width := 4;
- end;
- procedure TForm1.InitHexahedron;
- var a, size, i: integer;
- turn_mtx_X, turn_mtx_Z: matrix;
- c, s, angle: real;
- temp_point: TPoint3D;
- begin
- a := 100;
- with hexahedron do begin
- points[0] := TPoint3D.Point3D(-a, -a, -a); // координаты вершины 0
- points[1] := TPoint3D.Point3D(-a, -a, a); // координаты вершины 1
- points[2] := TPoint3D.Point3D(a, -a, a); // координаты вершины 2
- points[3] := TPoint3D.Point3D(a, -a, -a); // координаты вершины 3
- points[4] := TPoint3D.Point3D(a, a, -a); // координаты вершины 4
- points[5] := TPoint3D.Point3D(a, a, a); // координаты вершины 5
- points[6] := TPoint3D.Point3D(-a, a, a); // координаты вершины 6
- points[7] := TPoint3D.Point3D(-a, a, -a); // координаты вершины 7
- p_count := 7; // количество вершин
- { 5_________6
- /| /|
- /_|_______/7|
- 4| |_______|_|
- | /0 | /1
- |/________|/
- 3 2 }
- edges[0,0] := @points[0]; edges[0,1] := @points[1]; //соединияем 0 c 1 ребро
- edges[1,0] := @points[0]; edges[1,1] := @points[3]; //соединияем 0 c 3 ребро
- edges[2,0] := @points[0]; edges[2,1] := @points[7]; //соединияем 0 c 7 ребро
- edges[3,0] := @points[1]; edges[3,1] := @points[6]; //соединияем 1 c 6 ребро
- edges[4,0] := @points[1]; edges[4,1] := @points[2]; //соединияем 1 c 2 ребро
- edges[5,0] := @points[2]; edges[5,1] := @points[3]; //соединияем 2 c 3 ребро
- edges[6,0] := @points[2]; edges[6,1] := @points[5]; //соединияем 2 c 5 ребро
- edges[7,0] := @points[3]; edges[7,1] := @points[4]; //соединияем 3 c 4 ребро
- edges[8,0] := @points[4]; edges[8,1] := @points[5]; //соединияем 4 c 5 ребро
- edges[9,0] := @points[4]; edges[9,1] := @points[7]; //соединияем 4 c 7 ребро
- edges[10,0] := @points[5]; edges[10,1] := @points[6]; //соединияем 5 c 6 ребро
- edges[11,0] := @points[6]; edges[11,1] := @points[7]; //соединияем 6 c 7 ребро
- e_count := 11; // количество рёбер
- end;
- with hexahedron2 do begin // вторая фигура черный квадрат
- points[0] := TPoint3D.Point3D(-a, -a, -a); // координаты вершины 0
- points[1] := TPoint3D.Point3D(-a, -a, a); // координаты вершины 1
- points[2] := TPoint3D.Point3D(a, -a, a); // координаты вершины 2
- points[3] := TPoint3D.Point3D(a, -a, -a); // координаты вершины 3
- points[4] := TPoint3D.Point3D(a, a, -a); // координаты вершины 4
- points[5] := TPoint3D.Point3D(a, a, a); // координаты вершины 5
- points[6] := TPoint3D.Point3D(-a, a, a); // координаты вершины 6
- points[7] := TPoint3D.Point3D(-a, a, -a); // координаты вершины 7
- {points[0] := TPoint3D.Point3D(10, 50, a); // координаты вершины 0
- points[1] := TPoint3D.Point3D(a, a, 3*a); // координаты вершины 1 4
- points[2] := TPoint3D.Point3D(3*a, a, 3*a); // координаты вершины 2 7
- points[3] := TPoint3D.Point3D(250, 250, 400); // координаты вершины 3 1
- points[4] := TPoint3D.Point3D(300, 250, a); // координаты вершины 4
- points[5] := TPoint3D.Point3D(3*a, 3*a, 3*a); // координаты вершины 5
- points[6] := TPoint3D.Point3D(a, 3*a, 3*a); // координаты вершины 6
- points[7] := TPoint3D.Point3D(250, 50, 10); // координаты вершины 7 }
- p_count := 7; // количество вершин
- { 5_________6
- /| /|
- /_|_______/7|
- 4| |_______|_|
- | /0 | /1
- |/________|/
- 3 2 }
- edges[0,0] := @points[0]; edges[0,1] := @points[1]; //соединияем 0 c 1 ребро
- edges[1,0] := @points[0]; edges[1,1] := @points[3]; //соединияем 0 c 3 ребро
- edges[2,0] := @points[0]; edges[2,1] := @points[7]; //соединияем 0 c 7 ребро
- edges[3,0] := @points[1]; edges[3,1] := @points[6]; //соединияем 1 c 6 ребро
- edges[4,0] := @points[1]; edges[4,1] := @points[2]; //соединияем 1 c 2 ребро
- edges[5,0] := @points[2]; edges[5,1] := @points[3]; //соединияем 2 c 3 ребро
- edges[6,0] := @points[2]; edges[6,1] := @points[5]; //соединияем 2 c 5 ребро
- edges[7,0] := @points[3]; edges[7,1] := @points[4]; //соединияем 3 c 4 ребро
- edges[8,0] := @points[4]; edges[8,1] := @points[5]; //соединияем 4 c 5 ребро
- edges[9,0] := @points[4]; edges[9,1] := @points[7]; //соединияем 4 c 7 ребро
- edges[10,0] := @points[5]; edges[10,1] := @points[6]; //соединияем 5 c 6 ребро
- edges[11,0] := @points[6]; edges[11,1] := @points[7]; //соединияем 6 c 7 ребро
- e_count := 11; // количество рёбер
- end;
- //DrawFigure(hexahedron2, clBlack);
- end;
- procedure TForm1.InitMatrix;
- var
- nx, ny, nz: real;
- begin
- move_mtx[0,0] := 1; // 1
- move_mtx[0,1] := 0;
- move_mtx[0,2] := 0;
- move_mtx[0,3] := 0;
- move_mtx[1,0] := 0; // 2
- move_mtx[1,1] := 1;
- move_mtx[1,2] := 0;
- move_mtx[1,3] := 0;
- move_mtx[2,0] := 0; // 3
- move_mtx[2,1] := 0;
- move_mtx[2,2] := 1;
- move_mtx[2,3] := 0;
- move_mtx[3,0] := Image1.Width/2; // 4
- move_mtx[3,1] := Image1.Height/2;
- move_mtx[3,2] := 0;
- move_mtx[3,3] := 1;
- isometry_mtx[0,0] := cos(45); // 1 матрица преобразования изометрии
- isometry_mtx[0,1] := sin(45)*cos(35.26);
- isometry_mtx[0,2] := 0;
- isometry_mtx[0,3] := 0;
- isometry_mtx[1,0] := 0; // 2 где тета=35.26 градусов и фи = 45 градусов
- isometry_mtx[1,1] := cos(35.26);
- isometry_mtx[1,2] := 0;
- isometry_mtx[1,3] := 0;
- isometry_mtx[2,0] := sin(45); // 3
- isometry_mtx[2,1] := -cos(45)*sin(35.26);
- isometry_mtx[2,2] := 0;
- isometry_mtx[2,3] := 0;
- isometry_mtx[3,0] := 0; // 4
- isometry_mtx[3,1] := 0;
- isometry_mtx[3,2] := 0;
- isometry_mtx[3,3] := 1;
- move_mtx2[0,0] := 1; // 1
- move_mtx2[0,1] := 0;
- move_mtx2[0,2] := 0;
- move_mtx2[0,3] := 0;
- move_mtx2[1,0] := 0; // 2
- move_mtx2[1,1] := 1;
- move_mtx2[1,2] := 0;
- move_mtx2[1,3] := 0;
- move_mtx2[2,0] := 0; // 3
- move_mtx2[2,1] := 0;
- move_mtx2[2,2] := 1;
- move_mtx2[2,3] := 0;
- move_mtx2[3,0] := Image1.Width/2-300; // 4
- move_mtx2[3,1] := Image1.Height/2;
- move_mtx2[3,2] := 0;
- move_mtx2[3,3] := 1;
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- var
- temp_point: TPoint3D;
- turn_mtx_Y: matrix;
- i: Integer;
- angle, s, c: real;
- begin
- Inc(ticks);
- //isometry_mtx[2,3] := 1/1000;
- angle := ticks*1/50;
- s := sin(angle);
- c := cos(angle);
- turn_mtx_Y[0,0] := c; // 1
- turn_mtx_Y[0,1] := 0;
- turn_mtx_Y[0,2] := -s;
- turn_mtx_Y[0,3] := 0;
- turn_mtx_Y[1,0] := 0; // 2
- turn_mtx_Y[1,1] := 1;
- turn_mtx_Y[1,2] := 0;
- turn_mtx_Y[1,3] := 0;
- turn_mtx_Y[2,0] := s; // 3
- turn_mtx_Y[2,1] := 0;
- turn_mtx_Y[2,2] := c;
- turn_mtx_Y[2,3] := 0;
- turn_mtx_Y[3,0] := 0; // 4
- turn_mtx_Y[3,1] := 0;
- turn_mtx_Y[3,2] := 0;
- turn_mtx_Y[3,3] := 1;
- DrawFigure(hexahedron, clWhite);
- DrawFigure(hexahedron2, clWhite);
- InitHexahedron;
- // InitHexahedron;
- with hexahedron do
- for i := 0 to p_count do begin
- temp_point := Transform(points[i], turn_mtx_Y); //этат строчка не будэт
- temp_point := Transform(temp_point, isometry_mtx);
- temp_point := Transform(temp_point, move_mtx);
- points[i].X := temp_point.X;
- points[i].Y := temp_point.Y;
- points[i].Z := temp_point.Z;
- end;
- DrawFigure(hexahedron, RGB(Random(256),Random(256),Random(256)));
- with hexahedron2 do
- for i := 0 to p_count do begin
- temp_point := Transform(points[i], turn_mtx_Y); //этат строчка не будэт
- temp_point := Transform(temp_point, move_mtx2);
- points[i].X := temp_point.X;
- points[i].Y := temp_point.Y;
- points[i].Z := temp_point.Z;
- end;
- DrawFigure(hexahedron2, clBlack);
- end;
- function TForm1.Transform(point: TPoint3D; trs: matrix): TPoint3D;
- var
- i, j: Integer;
- pointX, res: matrix;
- begin
- pointX[0,0] := point.X;
- pointX[0,1] := point.Y;
- pointX[0,2] := point.Z;
- pointX[0,3] := 1;
- for i := 0 to 3 do begin
- res[0, i] := 0;
- for j := 0 to 3 do
- res[0, i] := res[0, i] + pointX[0, j]*trs[j, i];
- end;
- Transform := TPoint3D.Point3D(res[0, 0]/res[0, 3], res[0, 1]/res[0, 3], res[0, 2]/res[0, 3], res[0, 3]);
- end;
- procedure TForm1.DrawFigure(fig: figure; col: TColor);
- var i: integer;
- line: array [0..1] of TPoint;
- begin
- Image1.Canvas.Pen.Color := col;
- for i := 0 to fig.e_count do begin
- line[0] := Point(Round(fig.edges[i,0]^.X), Round(fig.edges[i,0]^.Y));
- line[1] := Point(Round(fig.edges[i,1]^.X), Round(fig.edges[i,1]^.Y));
- Image1.Canvas.Polygon(line);
- end;
- end;
- end.
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement