В данном тексте описан алгоритм работы программы по построению фрактала Коха, которая выложена в разделе программы. Фрактал Коха - это ломаная с бесконечным числом звеньев. Понятно, что такую ломаную мы не в состоянии построить за конечное время, поэтому мы будем строить только некоторое приближение к этой ломаной за конечное число этапов. На первом этапе мы задаем координаты двух точек на плоскости - начало и конец. Эти точки соединяются отрезком, отрезок делится на три равные части, примерно так: _ _ _ Из отрезка выбрасывается середина и вместо нее достраивается некая "галочка", примерно так: _/\_ При этом все четыре получившихся отрезка имеют одинаковую длину. Для каждого из четырех получившихся отрезков мы проделываем ту же самую процедуру что и для первого этапа - вырезаем середину и достраиваем "галочку". И так далее до бесконечности. В реальной программе это происходит не до бесконечности, а до некоторого числа этапов, который определяется пользователем, программистом. Программно это все организовано с помощью "главной" рекурсивной функции 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. Это условие приводит к тому, что номер этапа постоянно уменьшается и рано или поздно станет равным единице и функция нарисует линию, соединяющую начальную и конечную точку и выйдет из рекурсии. На главную >>> |