Написать программу вращающейся пирамиды вокруг любой оси - Turbo Pascal

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

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

Написать программу вращающейся пирамиды вокруг любой оси

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

textual
Листинг программы
  1. uses crt, graph; {подключение графических модулей}
  2. const rad: real=0.01745329; {коэффициент преобразования градусов в радианы}
  3. type {пользовательский тип "трехмерная"}
  4. d3d=record
  5. x,y,z: real;
  6. end;
  7. var
  8. j: integer; {переменная цикла}
  9. figura:integer;
  10. CodeKey:char;
  11. a1,a2,a3:real;
  12. ErrCode, grMode, grDriver: Integer; {переменные графического драйвера}
  13. const tet: array[1..4] of d3d =
  14. ((x:50;y:80;z:50),
  15. (x:50;y:0;z:80),
  16. (x:100;y:0;z:0),
  17. (x:0;y:0;z:0));
  18. {проверка грани на видимость} {a, b, c -координаты грани}
  19. function TestGran(a, b, c: d3d): boolean;
  20. var v1, w2, v2, w1, n: real; {внутренние переменные для построения нормали к грани}
  21. begin
  22. {построение нормали}
  23. v1:=a.x-c.x;
  24. v2:=a.y-c.y;
  25. w1:=b.x-c.x;
  26. w2:=b.y-c.y;
  27. n:=v1*w2-v2*w1; {проверка видимости}
  28. if n>0 then
  29. TestGran:=true {грань видна}
  30. else
  31. TestGran:=false; {грань не видна}
  32. end;
  33. {процедура рисования граней} {p1, p2, p3 - координаты грани}
  34. {col - цвет грани}
  35. procedure DrawGran(p1, p2, p3,p4:d3d; col: byte);
  36. var
  37. zar: array [1..4] of pointtype; {внутренний тип для заливки грани заданным цветом}
  38. begin
  39. if TestGran(p1, p2, p3)=false then exit;
  40. setfillstyle(1, col); {определение типа заполнения }{устанавливает образец штриховки и цвет}
  41. {обработка внутренних переменные для заполнения }
  42. zar[1].x:=round(p1.x+320);
  43. zar[1].y:=round(p1.y+240);
  44. zar[2].x:=round(p2.x+320);
  45. zar[2].y:=round(p2.y+240);
  46. zar[3].x:=round(p3.x+320);
  47. zar[3].y:=round(p3.y+240);
  48. zar[4].x:=round(p4.x+320);
  49. zar[4].y:=round(p4.y+240);
  50. if (zar[1].x=zar[4].x) and (zar[1].y=zar[4].y)
  51. then fillpoly(3, zar) {рисует и штрихует многоугольник}
  52. else fillpoly(4, zar); {заполнить грань заданным цветом}
  53. setfillstyle(1, 0); {определение типа заполнения }
  54. end;
  55. {процедура рисования вектора }
  56. procedure DrawVector;
  57. var i:integer;
  58. begin
  59. if figura =1 then
  60. begin
  61. DrawGran(tet[1],tet[2], tet[3],tet[1], 0);
  62. DrawGran(tet[1],tet[3], tet[4],tet[1], 0);
  63. DrawGran(tet[1],tet[4], tet[2],tet[1], 0);
  64. DrawGran(tet[4],tet[3], tet[2],tet[4], 0);
  65. end;
  66. end;
  67. {процедура поворота точки в трехмерном пространстве}
  68. {xv, yv, zv - углы поворота точки в градусах}
  69. {x, y, z - точка, которую нужно повернуть}
  70. procedure rotate(xv,yv,zv:real; var x,y,z:real);
  71. var Yt,Xt,Zt:real; {временные переменные}
  72. begin
  73. {повернуть по оси y}
  74. Yt:=Y*cos((xv*rad))-Z*sin((xv*rad));
  75. Zt:=Y*sin((xv*rad))+Z*cos((xv*rad));
  76. Y:=Yt; Z:=Zt;
  77. {повернуть по оси x}
  78. Xt:=X*cos((yv*rad))-Z*sin((yv*rad));
  79. Zt:=X*sin((yv*rad))+Z*cos((yv*rad));
  80. X:=Xt; Z:=Zt;
  81. {повернуть по оси z}
  82. Xt:=X*cos((zv*rad))-Y*sin((zv*rad));
  83. Yt:=X*sin((zv*rad))+Y*cos((zv*rad));
  84. X:=Xt; Y:=Yt;
  85. end;
  86. procedure RotateAll;
  87. begin
  88. for j:= 1 to 4 do rotate(a1,a2,a3,tet[j].x,tet[j].y,tet[j].z);
  89. end;
  90. begin
  91. grDriver:= Detect; {инициализация графического режима}
  92. InitGraph(grDriver, grMode,'c:\bp\bgi');
  93. ErrCode:= GraphResult;
  94. figura:=1;
  95. a1:=3;
  96. a2:=4;
  97. a3:=1;
  98. if ErrCode = grOk then
  99. begin {если инициализация успешна, то}
  100. setcolor(15); {установка цвета}
  101. repeat
  102. delay(1);
  103. clearviewport;
  104. DrawVector;
  105. delay(4);
  106. rotateAll;
  107. if keypressed then
  108. begin
  109. a1:=0; {остановка вращения}
  110. CodeKey:=readkey;
  111. end;
  112. {case codekey of
  113. 'w':a1:=10.0;
  114. 'a':a2:=10.0;
  115. 's':a3:=10.0;
  116. 'd':a2:=-10.0;
  117. end;}
  118. until CodeKey=#27; {выход по нажатию клавиши Esc}
  119. end;
  120. end.

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

В данном коде используется язык программирования Turbo Pascal. Он содержит описание типа данных d3d, который представляет собой трехмерную точку и имеет четыре свойства: x, y, z (координаты точки) и CodeKey (код, который представляет собой строку символов). Также в коде используются переменные j, фигура, CodeKey, a1, a2, a3, grMode, grDriver, tet, v1, v2, v3, w1, w2, n, zar, i, xv, yv, zv, X, Y, Z, Yt, Xt, Zt, X, Y, Z, ErrCode. Функция TestGran проверяет, видна ли грань, используя нормаль к грани. Если нормаль положительна, то грань видна. Процедура DrawGran рисует грань, используя заданный цвет. Она определяет тип заполнения и рисует или штрихует грань в зависимости от того, равны ли координаты внутренних точек. Процедура DrawVector рисует вектор, используя заданный цвет. Процедура rotate поворачивает точку в трехмерном пространстве. Она использует три внутренних переменные для временного хранения координат точки до и после поворота. Процедура RotateAll выполняет последовательное вращение точки по осям x, y и z. В конце кода происходит инициализация графического режима, если инициализация успешна, то устанавливается цвет, и выполняется цикл, который включает в себя рисование вектора и поворот точки. При нажатии клавиши Esc выход из программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

6   голосов , оценка 3.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы