Построение алгоритма
Автор: Olga Kazmina • Апрель 20, 2018 • Контрольная работа • 3,006 Слов (13 Страниц) • 512 Просмотры
Рекурсия
[pic 1][pic 2]
Рис.1 рис. 2
Алгоритм построения данного изображения следующий:
- описать процедуру изображения одной окружности с четырьмя окружностями поменьше;
- для изображения каждой окружности следующего уровня использовать эту же процедуру, только с другими значениями параметров – координат центра, величин радиусов и т.д.
Известно:
R – радиус окружности с центром (х,у);
(x,y) – координаты центра окружности R;
r1 – радиус орбиты – расстояние от точки (х,у) до центров окружности окружения (спутников);
r* - радиус окружности окружения (спутника).
k1 = r*/R; k2 = r1/R.
Процедура построения:
Procedure pic(x,y,r,r1: Integer);
Begin
{Изобразить окружность с центром (х,у) и радиусом r}
For i:=1 To 4 Do
Begin
{вичислить координаты центра (х1,у1) i-ой окружности}
Pic(x1,y1,< новое значение r >,r1);
End;
End;
Координаты х1,у1 выражаем через х,у: x1 = x + dx, y1 = y + dy
Для нахождения приращений dx, dy воспользуемся определением тригонометрических функций SIN, COS:
dx = r1 * COS(L);
dy = r1 * SIN(L), где L = pi/2, pi, 3pi/2, 2pi (90°, 180°, 270°, 360°)
Для того, чтобы программа «незацикливала» вводится величина n, которая уменьшается на 1 и выполняет роль специальной «заглушки», ограничивающей количество вызовов процедуры. Центр самой большой окружности располагается в центре экрана.
Program Ex_61; {р е к у р с и я рис. 1}
Uses Crt, Graph;
Const pi=3.14;
Var x,y,n,r,r1,cd,gm: Integer;
k1, k2: real;
Procedure Pic2(x,y,r,r1,n: Integer);
Var x1,y1,i: Integer;
Begin
If n > 0 Then {заглушка}
Begin
Circle(x,y,r); r1:= trunc(r*k2); {радиус орбиты}
For i:=1 To 4 Do
Begin
x1:= Trunc(x+r1*Cos(pi/2*i));{координаты центра i–ой окружности}
y1:= Trunc(y+r1*Sin(pi/2*i));
Pic2(x1,y1,Trunc(r*k1),r1,n-1);
End;
End;
End;
Begin {программа}
ClrScr;
Write('n => '); ReadLn (n); Write('r => '); ReadLn (r);
k1:=0.3; k2:=2;
cd:=detect; Gm:=1; Initgraph(cd,Gm,'..\Bgi');
x:=GetMaxX Div 2; y:=GetMaxY Div 2;{координаты центра большой окружности}
Pic2(x,y,r,r1,n);
Readln;
CloseGraph;
End.
Program Ex_61a; {K237 р е к у р с и я рис. 2}
Uses Crt, Graph;
Const pi=3.14;
Var r,n,x,y,cd,gm: Integer;
Procedure Pic2(x,y,r,n: Integer);
Begin
If n > 0 Then
Begin
Circle(x,y,r);
Pic2(x+r,y,Round(r/2),n-1); Pic2(x,y-r,Round(r/2),n-1);
Pic2(x-r,y,Round(r/2),n-1); Pic2(x,y+r,Round(r/2),n-1);
End;
End;
Begin
ClrScr;
Write('n => '); ReadLn (n); Write('r => '); ReadLn (r);
cd:=detect; Gm:=1; Initgraph(cd,Gm,'..\Bgi');
x:=GetMaxX Div 2; y:=GetMaxY Div 2; Pic2(x,y,r,n);
Readln;
CloseGraph;
End.
Снежинка. Разработать программу, которая обеспечивает рисование снежинки, число звеньев и количество ветвей задаёт пользователь. На рисунке 3 изображена снежинка, состоящая из 3-х звеньев и 8-ми ветвей.
Длину каждого звена рассчитываем по известному значению n – количеству звеньев и величины экрана. Считаем, что снежинка строится в квадрате 400 х 400 точек. Центр снежинки совпадает с центром квадрата, а длина отрезка каждого очередного звена в 4 раза меньше предыдущего. Если L длина 1-ого звена, то справедливо следующее равенство:
L +L/4 + L / 42 + … = 200 или L * (1 –1/4n) / (1- ¼) =200 (Сумма членов геометрической прогрессии), то есть L = 200 * 3 * 4n-1 / (4n – 1).
Если снежинка состоит из 1-го звена и р ветвей, то фрагмент программы выглядит следующим образом:
For i:=1 To р DO
Begin
x1:=Trunc(x + L * (COS(2 * PI * (i – 1)/p)); {координаты конца очередного звена}
y1:=Trunc(y + L * (SIN(2 * PI * (i – 1)/p));
Line(x,y,x1,y1); {рисование звена}
End;
Здесь х,у – координаты точи центра окружности. Снежинка рисуется как бы много раз, приэтом длины звеньев изменяются, поэтому их надо просчитать один раз и запомнить в массиве L из n звеньев. Длина каждого звена уменьшается в 4 раз по отношению к предыдущему. Длина 1-го звена определяется из того, что в квадрате из 400х400 точек необходимо построить снежинку из n звеньев. Схематично это можно изобразить следующим образом:[pic 3]
...