Строится она на основе равностороннего треугольника. Каждая линия которого ___ заменяется на 4 линии каждая длинной в 1/3 исходной _/\_. Таким образом, с каждой итерацией длинна кривой увеличивается на треть. И если мы сделаем бесконечное число итераций - получим фрактал - снежинку Коха бесконечной длинны. Получается, что наша бесконечная кривая покрывает ограниченную площадь. Попробуйте сделать то же самое методами и фигурами из евклидовой геометрии. Для построения геометрических фракталов хорошо приспособлены так называемые L-Systems. Суть этих систем состоит в том, что имеется определенных набор символов системы, каждый из которых обозначает определенное действие и набор правил преобразования символов. Этот способ построения изображений будет рассмотрен более подробно далее.
Построение кривой Коха
Процесс построения кривой Коха выглядит следующим образом: берём единичный отрезок, разделяем на три равные части и заменяем средний интервал равносторонним треугольником без этого сегмента. В результате образуется ломанная, состоящая из четырёх звеньев длины . На следующем шаге повторяем операцию для каждого из четырёх получившихся звеньев. Предельная кривая и есть кривой Коха.
Кривую Коха можно также построить с помощью двух СИФ-преобразований:
В формате FRACTINT эти преобразования запишутся следующим образом:
Кривая Коха имеет бесконечную длину. Кроме того, кривая Кох состоит из четырёх равных частей, каждая из которых подобна всей кривой с коэффициентом подобия 1/3. Отсюда следует, что каждая часть кривой имеет бесконечную длину. Также эта кривая нигде себя не пересекает, так как достраиваемые треугольники каждый раз достаточно малы и никогда не "сталкиваются" друг с другом.
Вариации на тему кривой Коха
Три копии кривой Коха, расположенные на сторонах правильного треугольника, образуют замкнутую кривую, называемую снежинкой Коха.
Построение можно производить на сторонах квадрата.
Снежинка Коха представляет собой линию бесконечной длины, ограничивающую конечную площадь.
program Koch1; uses CRT, Graph; var gd, gm: Integer; procedure Draw(x, y, l, u : Real; t : Integer); procedure Draw2(Var x, y: Real; l, u : Real; t : Integer); begin Draw(x, y, l, u, t); x := x + l*cos(u); y := y - l*sin(u);end; begin if t > 0 then begin l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1); Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1); end else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l))end; begin gd := Detect; InitGraph(gd, gm, 'c:\bp\bgi'); Draw(410, 10, 400, -pi, 4); Draw(10, 410, 400, 0, 4); Draw(10, 10, 400, -pi/2, 4); Draw(410, 410, 400, pi/2, 4); ReadKey; CloseGraphend.program Koch2; uses CRT, Graph; var gd, gm: Integer; procedure Draw(x, y, l, u : Real; t : Integer); procedure Draw2(Var x, y: Real; l, u : Real; t : Integer); begin Draw(x, y, l, u, t); x := x + l*cos(u); y := y - l*sin(u);end; begin if t > 0 then begin l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1); Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1); end else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l))end; begin gd := Detect; InitGraph(gd, gm, 'c:\bp\bgi'); Draw(210, 8, 400, -2*pi/3, 4); Draw(10, 354, 400, 0, 4); Draw(410, 354, 400, 2*pi/3, 4); ReadKey; CloseGraphend.program Koch3; uses CRT, Graph; var gd, gm: Integer; procedure Draw(x, y, l, u : Real; t : Integer); procedure Draw2(Var x, y: Real; l, u : Real; t : Integer); begin Draw(x, y, l, u, t); x := x + l*cos(u); y := y - l*sin(u);end; begin if t > 0 then begin l := l/3; Draw2(x, y, l, u, t-1); Draw2(x, y, l, u+pi/3, t-1); Draw2(x, y, l, u-pi/3, t-1); Draw2(x, y, l, u, t-1); end else Line(Round(x), Round(y), Round(x+cos(u)*l), Round(y-sin(u)*l))end; begin gd := Detect; InitGraph(gd, gm, 'c:\bp\bgi'); Draw(10, 354, 400, pi/3, 4); Draw(410, 354, 400, pi, 4); Draw(210, 8, 400, -pi/3, 4); ReadKey; CloseGraphend.
Снежинку Коха Можно получить используя следующие СИФ (формат FRACTINT):