PROGRAM oktaedr;
Uses Crt, Graph; { загрузка необходымых модулей }
const
a = 100;
Var
gd, gm: integer; { переменные необходимые для работы в графическом режиме }
hex: array [1 .. 6, 1 .. 3] of real; { массив с координатами вершин }
hex2: array [1 .. 6, 1 .. 2] of integer;
{ массив с координатами вершин в проекции }
verges: array [1 .. 8, 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 6 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
c: real;
k: integer;
Begin
c := 0;
{ определение видимости грани }
for k := 1 to 3 do
begin
if k = 3 then
j := 1
else
j := k + 1;
c := c + (hex[verges[i, k], 1] - hex[verges[i, j], 1]) *
(hex[verges[i, k], 2] + hex[verges[i, j], 2]);
end;
If c <= 0 then
Visibleverge := true
else
Visibleverge := false;
END;
Procedure Draw; { вывод на экран }
Var
gran: array [1 .. 3] of PointType;
begin
projection;
For i := 1 To 8 do
begin
If Visibleverge(i) then
begin { если грань видима, то программа выводит ее на экран }
for j := 1 to 3 do
begin
gran[j].x := hex2[verges[i, j], 1];
gran[j].y := hex2[verges[i, j], 2];
end;
SetFillStyle(1, i + 1); { установка цвет и стиль }
FillPoly(3, gran);
end;
End;
END;
Procedure turnOY(Corner: real); { поворот вокруг оси OY }
Var
x, z: real;
Begin
For i := 1 To 6 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] := 0;
hex[1, 2] := 0;
hex[1, 3] := 0;
hex[2, 1] := a;
hex[2, 2] := 0;
hex[2, 3] := 0;
hex[3, 1] := a;
hex[3, 2] := a;
hex[3, 3] := 0;
hex[4, 1] := 0;
hex[4, 2] := a;
hex[4, 3] := 0;
hex[5, 1] := a / 2;
hex[5, 2] := a / 2;
hex[5, 3] := a * sqrt(2) / 2;
hex[6, 1] := a / 2;
hex[6, 2] := a / 2;
hex[6, 3] := -a * sqrt(2) / 2;
{ граний }
verges[1, 1] := 1;
verges[1, 2] := 2;
verges[1, 3] := 5;
verges[2, 1] := 1;
verges[2, 2] := 2;
verges[2, 3] := 6;
verges[3, 1] := 1;
verges[3, 2] := 4;
verges[3, 3] := 5;
verges[4, 1] := 1;
verges[4, 2] := 4;
verges[4, 3] := 6;
verges[5, 1] := 2;
verges[5, 2] := 3;
verges[5, 3] := 5;
verges[6, 1] := 2;
verges[6, 2] := 3;
verges[6, 3] := 6;
verges[7, 1] := 3;
verges[7, 2] := 4;
verges[7, 3] := 5;
verges[8, 1] := 3;
verges[8, 2] := 4;
verges[8, 3] := 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. { конец программы }