L. Fregimus Vacerro (fregimus) wrote,
L. Fregimus Vacerro
fregimus

Снежинка Коха

Фрактальная снежинка Коха — в комментариях попросили нарисовать в Математике.

Берем правильный треугольник, каждую сторону делим на 3 части. Средний отрезок выбрасываем, а вместо него вставляем два таких же, соединенных «уголком». На первом шаге получается «звезда Давида». Повторяем процедуру с ней. С получившейся кривой — опять повторяем. Если повторять до бесконечности, то длина кривой будет расти до бесконечности, хотя площадь внутри кривой ограничена сверху.

На рисунке первые 5 шагов. Чтобы было понятно, как она строится, каждый раз снежинка «вырастает» в полтора раза и перекрашивается.



Исходный код, Mathematica 6.0. Сделан на основе R. Maeder. Generating the Koch Snowflake with Mathematica, 1992..
KochFlake[order_, size_] :=
  Nest[ (#1 /. Line[{start_, finish_}] :>
       Block[{normal, vec},
         vec = finish - start;
         normal = Reverse[vec] * {-1, 1} * Sqrt[3]/6;
         { Line[{start, start + vec/3}],
           Line[{start + vec/3, start + vec/2 + normal}],
           Line[{start + vec/2 + normal, start + 2 vec/3}],
           Line[{start + 2 vec/3, finish}] } ])&,
    Line /@ Partition[size * {{0, 1},{Sqrt[3]/2, -1/2},{-Sqrt[3]/2, -1/2}},
                      2, 1, {1, 1}],
    order];
   
Graphics[{Darker[Hue[#/6]], KochFlake[#, 1.5^#]} & /@ Range[0, 4],
         AspectRatio -> Automatic, ImageSize -> {420, Automatic}]

Хозяйке на заметку: если будете экспериментировать с функцией KochFlake[], замените size в аргументе Partition[] на 1.0 * size, либо всегда передавайте плавающее число для аргумента size, как это делаю я в данном примере. Операции с плавающими числами Mathematica исполняет значительно быстрее, чем с корнями и рациональными — в данном случае примерно в 10 раз.
Tags: chaos, cs, math, techne
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 24 comments