Программа вращающегося октаэдра — Pascal(Паскаль)

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. { конец программы }

Leave a Comment

8 + 1 =