PROGRAM Gegsaedr;
Uses Crt, Graph; { загрузка необходымых модулей }
Var
gd, gm: integer; { gеременные необходимые для работы в графическом режиме }
hex: array [1 .. 8, 1 .. 3] of real; { массив с координатами вершин }
hex2: array [1 .. 8, 1 .. 2] of integer;
{ массив с координатами вершин в проекции }
verges: array [1 .. 6, 1 .. 4] of integer; { массив граней гексаэдра }
i, j: integer; { переменные цикла }
ch: char; { Значение нажатой клавиши }
Procedure projection; { расчет координат проекции }
Const
CornerX = 35.26 * Pi / 180; { угол вращения вокруг оси X }
CornerY = 45 * Pi / 180; { угол вращения вокруг оси Y }
begin
For i := 1 To 8 do
begin
hex2[i, 1] := round(hex[i, 1] * cos(CornerY) + hex[i, 3] *
sin(CornerY)) + 320;
hex2[i, 2] := 290 - round(hex[i, 1] * sin(CornerY) * sin(CornerX) + hex[i,
2] * cos(CornerX) - hex[i, 3] * cos(CornerY) * sin(CornerX));
End;
END;
Function Visibleverge(i: integer): boolean; { определение видимости i-й грани }
Var
V1, V2, N: array [1 .. 3] of real;
scalar: real;
Begin
{ расчет значений 2-х векторов, лежащих в плоскости грани }
for j := 1 to 3 do
begin
V1[j] := hex[verges[i, 2], j] - hex[verges[i, 1], j];
V2[j] := hex[verges[i, 3], j] - hex[verges[i, 1], j];
End;
{ вычисление вектора нормали грани }
N[1] := V1[2] * V2[3] - V2[2] * V1[3];
N[2] := V1[3] * V2[1] - V2[3] * V1[1];
N[3] := V1[1] * V2[2] - V2[1] * V1[2];
{ определение видимости грани }
scalar := N[1] - N[2] - N[3];
If scalar > 0 then
Visibleverge := true
else
Visibleverge := false;
END;
Procedure Draw; { вывод на экран }
Var
gran: array [1 .. 4] of PointType;
begin
projection;
For i := 1 To 6 do
begin
If Visibleverge(i) then
begin { если грань видима, то программа выводит ее на экран }
for j := 1 to 4 do
begin
gran[j].x := hex2[verges[i, j], 1];
gran[j].y := hex2[verges[i, j], 2];
end;
SetFillStyle(1, i + 8); { установка цвет и стиль }
FillPoly(4, gran);
end;
End;
END;
Procedure turnOY(Corner: real); { поворот вокруг оси OY }
Var
x, z: real;
Begin
For i := 1 To 8 do
begin
x := hex[i, 1];
z := hex[i, 3];
hex[i, 1] := x * cos(Corner) + z * sin(Corner);
hex[i, 3] := -x * sin(Corner) + z * cos(Corner);
end;
END;
Begin
{ описание фигуры }
hex[1, 1] := 30;
hex[1, 2] := 0;
hex[1, 3] := 0;
hex[2, 1] := 30;
hex[2, 2] := 150;
hex[2, 3] := 0;
hex[3, 1] := 180;
hex[3, 2] := 150;
hex[3, 3] := 0;
hex[4, 1] := 180;
hex[4, 2] := 0;
hex[4, 3] := 0;
hex[5, 1] := 30;
hex[5, 2] := 0;
hex[5, 3] := 150;
hex[6, 1] := 30;
hex[6, 2] := 150;
hex[6, 3] := 150;
hex[7, 1] := 180;
hex[7, 2] := 150;
hex[7, 3] := 150;
hex[8, 1] := 180;
hex[8, 2] := 0;
hex[8, 3] := 150;
{ граний }
verges[1, 1] := 1;
verges[1, 2] := 2;
verges[1, 3] := 3;
verges[1, 4] := 4;
verges[2, 1] := 5;
verges[2, 2] := 6;
verges[2, 3] := 2;
verges[2, 4] := 1;
verges[3, 1] := 2;
verges[3, 2] := 6;
verges[3, 3] := 7;
verges[3, 4] := 3;
verges[4, 1] := 4;
verges[4, 2] := 3;
verges[4, 3] := 7;
verges[4, 4] := 8;
verges[5, 1] := 1;
verges[5, 2] := 4;
verges[5, 3] := 8;
verges[5, 4] := 5;
verges[6, 1] := 5;
verges[6, 2] := 8;
verges[6, 3] := 7;
verges[6, 4] := 6;
gd := detect;
InitGraph(gd, gm, 'c:\tp7\bgi\'); { инициализация графического режима }
If GraphResult <> grOk Then
Halt(1);
{ SetBkColor(Magenta); } { устанавливает цвет фона }
ClearDevice; { очистка экрана }
Draw; { вывод }
while ch <> #27 do
begin { пока не нажата клавиша "Esc", вращает }
If keypressed then
ch := readkey; { считывает значение нажатой клавиши }
turnOY(Pi / 180); { поворот вокруг оси OY }
ClearDevice; { очистка экран }
Draw; { вывод }
OuttextXY(10, 465, 'Press <Esc> to Exit');
Delay(8000);
End;
CloseGraph; { завершение работы прогрммы в графическом режиме }
END. { конец программы }