На главную >>>


О фрактале Коха

В данном тексте описан алгоритм работы программы по построению фрактала Коха, которая выложена в разделе программы.

Фрактал Коха - это ломаная с бесконечным числом звеньев. Понятно, что такую ломаную мы не в состоянии построить за конечное время, поэтому мы будем строить только некоторое приближение к этой ломаной за конечное число этапов.

На первом этапе мы задаем координаты двух точек на плоскости - начало и конец. Эти точки соединяются отрезком, отрезок делится на три равные части, примерно так: _ _ _ Из отрезка выбрасывается середина и вместо нее достраивается некая "галочка", примерно так: _/\_ При этом все четыре получившихся отрезка имеют одинаковую длину.

Для каждого из четырех получившихся отрезков мы проделываем ту же самую процедуру что и для первого этапа - вырезаем середину и достраиваем "галочку". И так далее до бесконечности. В реальной программе это происходит не до бесконечности, а до некоторого числа этапов, который определяется пользователем, программистом.

Программно это все организовано с помощью "главной" рекурсивной функции

    void Koch(float startx, float endx, float starty, float endy, int level)

Она берет на вход координаты х и у начала и конца отрезка и номер этапа. Эта программа следит за тем, что если номер этапа (level) равен единице, то дальнейшее "дробление" отрезка не нужно, и нужно просто нарисовать линию из начальной точки в конечную:

    if(level==1){
	line(startx, starty, endx, endy);
    }

Если же дробление нужно продолжать, то программа рассчитывает координаты точки - вершины "галочки", координаты двух точек, которые делят отрезок на три части с помощью элементарной геометрии:

	L = sqrt( (endx-startx) * (endx-startx) + (endy-starty) * (endy-starty) );
	h = L /(2 * sqrt(3));
	sina = (endy - starty)/L;
	cosa = (endx - startx)/L;
	x1 = startx + (endx - startx)/3;
	x2 = (endx + startx)/2 + h * sina;
	x3 = startx + 2 * (endx - startx)/3;
	y1 = starty + (endy - starty)/3;
	y2 = (endy + starty)/2 - h * cosa;
	y3 = starty + 2 * (endy - starty)/3;

Здесь L - длина отрезка, от начальной до конечной точки, h - высота равностороннего треугольника, который образует "галочку" cosa, sina - это косинус и синус угла между нашим отрезком и к горизонтальной осью.

x1, y1 - координаты первой точки, что делит отрезок на три части
x3, y3 - координаты второй точки, что делит отрезок на три части
x2, y2 - координаты вершины "галочки".

Дальше - внимание, очень важная часть алгоритма: Функция Koch вызывает саму себя (это называется рекурсией) еще раз с такими параметрами:

	Koch(startx, x1, starty, y1, level-1);
	Koch(x1, x2, y1, y2, level-1);
	Koch(x2, x3, y2, y3, level-1);
	Koch(x3, endx, y3, endy, level-1);

Это означает команды нарисовать 4 отрезка такого типа: _/\_, о которых я упоминал в начале. При этом программа передает в функцию координаты точек и номер этапа level-1. Это условие приводит к тому, что номер этапа постоянно уменьшается и рано или поздно станет равным единице и функция нарисует линию, соединяющую начальную и конечную точку и выйдет из рекурсии.


На главную >>>


Hosted by uCoz