Вы - -й посетитель этой странички 

Полярные цветы

О.В. Титова,
г. Волгоград

    Изучение тем “Графические операторы” и “Построение графиков функций” весьма удачно иллюстрируется программой, рисующей цветки. Достаточно предложить учащимся ее самый простой вариант, объяснив назначение параметров. Изменяя их, школьники с удовольствием создают свои рисунки.
    В основе программы лежит построение графика функции, заданной уравнением в полярных координатах:

r = a•(sin(ba) — cos(ba))

    Переход к декартовым координатам производится по формулам:

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(ba2) — cos(ba))
или r = a•(sin(ba) — cos(ba2))


Рис. 6.
Результат работы программы № 1 для уравнения
r = a•(sin(ba 2 ) — cos(ba2))

    Очень красиво смотрятся узоры из цветков, расположенных по спирали, с постепенным увеличением длины лепестка (см. рис. 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