Вы - -й посетитель этой странички
Полярные цветы
О.В. Титова,
г. Волгоград
Изучение тем “Графические
операторы” и “Построение графиков функций”
весьма удачно иллюстрируется программой,
рисующей цветки. Достаточно предложить
учащимся ее самый простой вариант, объяснив
назначение параметров. Изменяя их,
школьники с удовольствием создают свои
рисунки.
В основе программы лежит
построение графика функции, заданной
уравнением в полярных координатах:
r = a•(sin(b•a) — cos(b•a))
Переход к декартовым координатам производится по формулам:
x = r
cos a
y = r
sin a
На рис. 1 и рис. 2 представлены примеры подобных графиков.
Рис. 1.
График функции r
= 6•(sin(2•a) —
cos(2•a))
Рис. 2.
График функции r
= 6•(sin(4•a) — cos(4•a))
Видно, что количество лепестков цветка зависит от коэффициента b, а длина лепестка определяется коэффициентом a. В программе № 1 эти параметры задаются с помощью датчика случайных чисел:
Рис. 3.
Результат работы программы № 1 на экране
монитора
Программа № 1.
Язык программирования Паскаль
program zvetki;
{рисует контурные цветки }
uses crt,graph;
var i,m,k,x1,y1,gm,cd,1,c,xo,yo,ll : integer;
h,x,y,a,b,z,f : real;
begin
{инициализация графики}
cd:=detect; gm:=1;
initgraph(cd,gm,’’);
{инициализация генератора случайных
чисел}
randomize;
m:=10; {масштаб на экране}
a:=0;
{начальное значение угла в полярных
координатах}
b:=2*pi;
{конечное значение угла в полярных
координатах}
repeat
l:=trunc(random(5)+2);
{количество лепестков цветка}
ll:=trunc(random(3)+3);
{длина лепестка цветка}
{координаты центра цветка}
xo:=trunc(random(640));
yo:=trunc(random(480));
{задание цвета цветка}
c:=trunc(random(6)+9);
{шаг }
h:=(b-a)/1000;
for i:=1 to 1000 do
begin
f:=a+i*h;
z:=ll*(sin(l*f)-cos(l*f));
{переход к декартовым координатам}
x:=z*cos(f);y:=z*sin(f);
{переход к экранным координатам}
x1:=trunc(xo+x*m);
y1:=trunc(yo-y*m);
setcolor(c);
circle(x1,y1,1)
end
{ выход из цикла по нажатию любой клавиши }
until keypressed;
closegraph
end.
Программа № 1.
Язык программирования QBasic
'рисование контурных цветков
CLS
SCREEN 12
'масштаб на экране
m = 10
RANDOMIZE TIMER
DO
'координаты центра цветка
x0 = RND * 640: y0 = RND * 480
'цвет цветка
c = RND * 6 + 9
'количество лепестков
b = 2 + CINT(RND * 4)
'длина лепестка
l = RND * 10
'цикл построения одного цветка
FOR f = 0 TO b * 6.28 STEP .001
z = l * (SIN(b * f) - COS(b * f))
'переход к декартовым координатам
x = z * COS(f)
y = z * SIN(f)
'переход к экранным координатам
x1 = x0 + x * m
y1 = y0 - y * m
CIRCLE (x1, y1), 1, c
NEXT f
'задержка на экране
FOR k = 1 TO 5000: NEXT k
'выход из цикла по нажатию любой клавиши
LOOP WHILE INKEY$ = ""
END
Несложно модернизировать эту программу так, чтобы она рисовала закрашенные цветки. Для этого достаточно цикл построения одного цветка поместить в другой цикл и вычерчивать несколько контурных цветков разного размера одного цвета с одинаковым центром и количеством лепестков. В этом внешнем цикле будет меняться длина лепестка от, скажем, 0,1 до некоего числа, полученного с помощью датчика случайных чисел с шагом 0,1. Например, вот таким образом:
Фрагмент программы на языке Паскаль
h:=(b-a)/(600);
for k:=1 to ll*10 do
begin
l1:=k*0.1;
for i:=1 to 600 do
Фрагмент программы на языке QBasic
l = RND * 10
FOR ll = 0 TO l STEP .1
'цикл построения одного цветка
FOR f = 0 TO b * 6.28 STEP .01
z = ll * (SIN(b * f) - COS(b * f))
Рис. 4.
Закрашенные цветки (снимок экрана)
Изменяя параметры, можно получать различные формы цветков. На рис. 5—7 представлены различные варианты цветов.
Рис. 5.
Результат работы программы № 1 для
уравнений
r
= a•(sin(b•a2) — cos(b•a))
или r
= a•(sin(b•a) — cos(b•a2))
Рис. 6.
Результат работы программы № 1 для
уравнения
r
= a•(sin(b•a 2 ) — cos(b•a2))
Очень красиво смотрятся узоры из цветков, расположенных по спирали, с постепенным увеличением длины лепестка (см. рис. 7). Для достижения такого эффекта необходимо внести в программу № 1 небольшие изменения.
Рис. 7. Цветки, расположенные по спирали
Программа № 2.
Язык программирования Паскаль
program zvetki;
{рисует контурные цветки по спирали с увеличением длины лепестка}
uses crt,graph;
var
i,m,k,x1,y1,gm,cd,l,c,xo,yo,x0,y0,ii:integer;
h,x,y,a,b,z,f,r,hp,ll,p:real;
begin
{инициализация графики}
cd:=detect; gm:=1;
initgraph(cd,gm,’’);
{инициализация генератора случайных
чисел}
randomize;
m:=10; {масштаб на экране}
a:=0;
{начальное значение угла в полярных
координатах}
b:=2*pi;
{конечное значение угла в полярных
координатах}
r:=5; {начальный радиус окружности}
x0:=320;y0:=240;
{координаты центра окружности }
hp:=2*pi/15; {шаг угла}
ll:=2; {начальное значение длины лепестка }
repeat
for ii:=0 to 15 do {цикл окружности}
begin
p:=ii*hp;{расчет текущего угла}
l:=trunc(random(5)+2);
{количество лепестков цветка}
{координаты центра цветка}
xo:=x0+trunc(m*r*cos(p));
yo:=y0-trunc(m*r*sin(p));
{задание цвета цветка}
c:=trunc(random(6)+9);
{шаг }
h:=(b-a)/1000;
for i:=1 to 1000 do
begin
f:=a+i*h;
z:=ll*(sin(l*f)-cos(l*f));
{переход к декартовым координатам}
x:=z*cos(f);y:=z*sin(f);
{переход к экранным координатам}
x1:=trunc(xo+x*m);
y1:=trunc(yo-y*m);
setcolor(c);
circle(x1,y1,1)
end;
r:=r+0.5; {увеличиваем радиус окружности}
ll:=ll+0.03 {увеличиваем длину лепестка}
end;
{ выход из цикла по нажатию любой клавиши }
until keypressed=true;
closegraph
end.
Программа № 2.
Язык программирования QBasic
'рисование контурных цветков по спирали
CLS
SCREEN 12
'масштаб на экране
m = 10
PAINT (10, 10), 1
RANDOMIZE TIMER
'координаты центра экрана
xo = 320: yo = 240
'начальное значение длины лепестка
l = 1
'начальное значение радиуса окружности,
на которой рисуются цветы
r = 3
DO
FOR p = 0 TO 6.28 STEP .5
'координаты центра цветка
x0 = xo + m * r * COS(p)
y0 = yo - m * r * SIN(p)
'цвет цветка
c = RND * 6 + 9
'количество лепестков
b = 2 + CINT(RND * 8)
'длина лепестка
l = l + .05
'цикл построения одного цветка
FOR f = 0 TO b * 6.28 STEP .001
z = l * (SIN(b * f) - COS(b * f))
'переход к декартовым координатам
x = z * COS(f)
y = z * SIN(f)
'переход к экранным координатам
x1 = x0 + x * m
y1 = y0 - y * m
CIRCLE (x1, y1), 1, c
NEXT f
'задержка на экране
FOR k = 1 TO 5000: NEXT k
'увеличение радиуса окружности
r = r + .5
NEXT p
'выход из цикла по нажатию любой клавиши
LOOP WHILE INKEY$ = ""
END