Нарисовать звезду - Pascal
Формулировка задачи:
Program Rotation and Reflection; uses Crt, Graph; var gd, gm: Integer; par: array[1..8, 1..3] of real; ribs: array[1..12, 1..2] of integer; i: integer; ch: char; corner : real; procedure draw; var x1, x2, y1, y2: integer; ver1, ver2: integer; begin for i := 1 to 12 do begin ver1 := ribs[i,1]; ver2 := ribs[i,2]; x1 := round(par[ver1,1])+320; y1 := 240-round(par[ver1,2]); x2 := round(par[ver2,1])+320; y2 := 240-round(par[ver2,2]); line(x1,y1,x2,y2); end; end; procedure reflection_XOZ_YOZ; begin for i:=1 to 8 do begin par[i,2]:=-par[i,2]; par[i,1]:=-par[i,1]; end; end; procedure reflection_XOZ_XOY; begin for i:=1 to 8 do begin par[i,2]:=-par[i,2]; par[i,3]:=-par[i,3]; end; end; procedure reflection_XOY_YOZ; begin for i:=1 to 8 do begin par[i,3]:=-par[i,3]; par[i,1]:=-par[i,1]; end; end; procedure turnOX(corner: real); var y,z: real; begin for i:=1 to 8 do Begin y:=par[i,2]; z:=par[i,3]; par[i,2]:=y*cos(corner)-z*sin(corner); par[i,3]:=y*sin(corner)+z*cos(corner); end; end; procedure turnOY(corner: real); var x,z: real; begin for i:=1 to 8 do begin x:=par[i,1]; z:=par[i,3]; par[i,1]:=x*cos(corner)+z*sin(corner); par[i,3]:=-x*sin(corner)+z*cos(corner); end; end; procedure turnOZ(corner: real); var x,y: real; begin for i:=1 to 8 do begin x:=par[i,1]; y:=par[i,2]; par[i,1]:=x*cos(corner)-y*sin(corner); par[i,2]:=x*sin(corner)+y*cos(corner); end; end; begin par[1,1]:=0; par[1,2]:=0; par[1,3]:=0; par[2,1]:=0; par[2,2]:=110; par[2,3]:=0; par[3,1]:=175; par[3,2]:=110; par[3,3]:=0; par[4,1]:=175; par[4,2]:=0; par[4,3]:=0; par[5,1]:=0; par[5,2]:=0; par[5,3]:=150; par[6,1]:=0; par[6,2]:=110; par[6,3]:=150; par[7,1]:=175; par[7,2]:=110; par[7,3]:=150; par[8,1]:=175; par[8,2]:=0; par[8,3]:=150; ribs[1,1]:=1; ribs[1,2]:=2; ribs[2,1]:=2; ribs[2,2]:=3; ribs[3,1]:=3; ribs[3,2]:=4; ribs[4,1]:=4; ribs[4,2]:=1; ribs[5,1]:=5; ribs[5,2]:=6; ribs[6,1]:=6; ribs[6,2]:=7; ribs[7,1]:=7; ribs[7,2]:=8; ribs[8,1]:=8; ribs[8,2]:=5; ribs[9,1]:=1; ribs[9,2]:=5; ribs[10,1]:=2; ribs[10,2]:=6; ribs[11,1]:=3; ribs[11,2]:=7; ribs[12,1]:=4; ribs[12,2]:=8; gd := VGA; gm := VGAHi; InitGraph(gd, gm, '../bgi'); If GraphResult <> grOk then Halt(1); turnOX(pi/12); turnOY(pi/12); turnOZ(pi/12); While ch<>#27 do begin ClearDevice; Draw; OuttextXY(10,450,'Press <1>-<6> for rotation, <7>-<9> for reflection'); OuttextXY(10,465,'Press <Esc> to Exit'); ch:=readkey; Case ch Of '1': turnOX(pi/15); '4': turnOX(-pi/15); '2': turnOY(pi/15); '5': turnOY(-pi/15); '3': turnOZ(pi/15); '6': turnOZ(-pi/15); '7': reflection_XOZ_YOZ; '8': reflection_XOZ_XOY; '9': reflection_XOY_YOZ; end; end; closegraph; end.
Решение задачи: «Нарисовать звезду»
textual
Листинг программы
uses graph; procedure Figura(x1,y1,d,m,u,c:integer); var a,i,d1:integer; p:array[1..9] of pointtype; begin d1:=d div m; a:=u; for i:=1 to 8 do begin if i mod 2=0 then begin p[i].x:=x1+round(d*cos(a*pi/180)); p[i].y:=y1-round(d*sin(a*pi/180)); end else begin p[i].x:=x1+round(d1*cos(a*pi/180)); p[i].y:=y1-round(d1*sin(a*pi/180)); end; a:=a+45; end; p[9]:=p[1]; SetColor(c); Setfillstyle(1,c); Fillpoly(9,p) end; var gd,gm,xc,yc:integer; begin gd:=0; initgraph(gd,gm,''); xc:=getmaxX div 2; yc:=getmaxY div 2; Figura(xc,yc,80,2,0,1); Figura(xc,yc,100,4,-45,9); readln end.
Объяснение кода листинга программы
- В начале кода подключается библиотека graph, которая, вероятно, содержит функции для работы с графиками.
- Создается процедура Figura, которая принимает 6 аргументов: x1, y1, d, m, u и c. Эти переменные, скорее всего, представляют собой координаты точки, радиус и угол поворота звезды, а также цвет заливки.
- Внутри процедуры объявлены 2 переменные: a и i.
- Создается массив p типа pointtype, который будет использоваться для хранения координат точек звезды.
- Вычисляется значение переменной d1, которая, вероятно, представляет собой радиус звезды, деленный на m.
- Значение переменной a устанавливается равным u.
- Запускается цикл for, который выполняется 8 раз.
- Внутри цикла проверяется, является ли текущий индекс элемента i четным числом. Если это так, то выполняется блок кода внутри if.
- Внутри блока if вычисляются координаты точки p[i] с помощью формулы, которая использует d и a.
- После вычисления координат точки p[i] устанавливаются значения x и y.
- Значение переменной a увеличивается на 45.
- После завершения цикла for устанавливается значение p[9] равным p[1], что, вероятно, восстанавливает начальные координаты первой точки звезды.
- Вызывается функция SetColor(c), которая, вероятно, устанавливает цвет заливки для графика.
- Вызывается функция Setfillstyle(1,c), которая, вероятно, устанавливает стиль заполнения для графика.
- Вызывается функция Fillpoly(9,p), которая, вероятно, рисование звезды на графике.
- Конец программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д