Написать программу, которая рисует восьмиугольник, движущийся по экрану - Turbo Pascal

Узнай цену своей работы

Формулировка задачи:

Написать программу, которая рисует восьмиугольник, движущийся по экрану

Решение задачи: «Написать программу, которая рисует восьмиугольник, движущийся по экрану»

textual
Листинг программы
uses crt, graph;
 
const
  N     = 8;
  side  = 40;
  dFi   = pi / 180;
  FiLim = 2 * pi / N;
  sideColor = 3;
  pause = 20;
 
type
  top = record
    x, y: integer;
  end;
 
var
  tops: array[1..N] of top;
  FiCur: real;
  i, lineY, lineX: integer;
  graph_device, graph_mode: integer;
 
procedure shift;
var
  bufTop: top;
  i: integer;
begin
  bufTop.x := tops[N].x;
  bufTop.y := tops[N].y;
  for i := 1 to N - 1 do
  begin
    tops[i + 1].x := tops[i].x;
    tops[i + 1].y := tops[i].y;
  end;
  tops[1].x := bufTop.x;
  tops[1].y := bufTop.y;
end;
 
procedure paint(color: word);
var
  i: integer;
begin
  setcolor(color);
  if color = sideColor then line(0, lineY, lineX, lineY);
  for i := 1 to N do
    if i <> N then line(tops[i].x, tops[i].y, tops[i + 1].x, tops[i + 1].y)
              else line(tops[N].x, tops[N].y, tops[1].x,     tops[1].y);
end;
 
procedure recount;
var
  i: integer;
begin
  tops[1].x := round(tops[N].x + side * cos(FiCur));
  tops[1].y := round(tops[N].y - side * sin(FiCur));
  for i := 2 to N - 1 do
  begin
    tops[i].x := round(tops[i - 1].x + side * cos(FiCur + (i - 1) * FiLim));
    tops[i].y := round(tops[i - 1].y - side * sin(FiCur + (i - 1) * FiLim));
  end;
end;
 
procedure rotate;
begin
  delay(pause);
  paint(black);
  FiCur := FiCur - dFi;
  recount;
  paint(sideColor);
end;
 
begin
  FiCur := FiLim;
  graph_device := detect;
  InitGraph(graph_device, graph_mode, '');
  lineX := GetMaxX;
  lineY := GetMaxY * 3 div 4;
  tops[N].x := 150;
  tops[N].y := lineY;
  recount;
  for i := 1 to N do
  begin
    repeat rotate until FiCur <= 0;
    paint(black);
    FiCur := FiLim;
    shift;
  end;
  closegraph;
end.

Объяснение кода листинга программы

  1. В программе используется библиотека crt и графический модуль graph.
  2. Константа N определяет количество вершин в восьмиугольнике.
  3. Константа side определяет размер стороны восьмиугольника и вычисляется как 40 радиан.
  4. Константа dFi вычисляется как отношение пи к 180 градусам.
  5. Константа FiLim вычисляется как два пи, деленные на N, что позволяет определить максимально возможное изменение угла FiCur без выхода за пределы графического экрана.
  6. Константа sideColor задает цвет стороны восьмиугольника и равен 3.
  7. Константа pause определяет длительность паузы между обновлениями экрана и равна 20.
  8. Тип top представляет вершину восьмиугольника и содержит поля x и y, которые представляют координаты вершины.
  9. Переменная tops представляет массив из N вершин и содержит поля x и y для каждой вершины.
  10. Переменная FiCur содержит текущий угол поворота восьмиугольника.
  11. Переменная i представляет номер текущей вершины восьмиугольника.
  12. Переменная lineY и lineX представляют координаты верхней и нижней сторон восьмиугольника соответственно.
  13. Переменные graph_device и graph_mode представляют устройства и режимы графики соответственно и определяются функцией detect.
  14. Переменная lineX представляет максимальную горизонтальную координату экрана.
  15. Переменная lineY представляет максимальную вертикальную координату экрана, умноженную на 3 и деленную на 4.
  16. Переменная tops[N].x и tops[N].y представляют координаты вершины восьмиугольника, которая находится в правом нижнем углу.
  17. Переменная bufTop представляет буфер для хранения координат предыдущей вершины.
  18. Переменная FiCur изменяется от 0 до 2*pi, что позволяет описать полный оборот восьмиугольника.
  19. Переменная recount пересчитывает координаты всех вершин восьмиугольника.
  20. Переменная shift перемещает все вершины восьмиугольника на одну позицию вправо.

Оцени полезность:

14   голосов , оценка 4.429 из 5
Похожие ответы