Снежинка коха построение. Снежинка Коха на JS с использованием Canvas

Граница снежинки, придуманной Гельгом фон Кохом в 1904 году (рис. 2.2), описывается кривой, составленной из трех одинаковых фракталов размерности . Каждая треть снежинки строится итеративно, начиная с одной из сторон равностороннего треугольника. Пусть - начальный отрезок. Уберем среднюю треть и добавим два новых отрезка такой же длины, как показано на рис. 2.3. Назовем полученное множество . Повторим данную процедуру многократно, на каждом шаге заменяя среднюю треть двумя новыми отрезками. Обозначим через фигуру, получившуюся после n-го шага.

Рис. 2.2. Снежинка Коха

Интуитивно ясно, что последовательность кривых сходится к некоторой предельной кривой К. Мы проведем строгое математическое исследование сходимости таких последовательностей кривых и других множеств в п. 3.5 и в прил. А.3. Пока что предположим, что кривая К существует, и рассмотрим некоторые ее свойства.

Рис. 2.3. а) , б) , в) , г)

Если взять копию К, уменьшенную в три раза то все множество К можно составить из таких копий. Следовательно, отношение самоподобия (2.1) выполняется при указанных N и , а размерность фрактала будет:

Еще одно важное свойство, которым обладает граница снежинки Коха - ее бесконечная длина (см. теорему 2.1.1). Это может показаться удивительным читателю, привыкшему иметь дело с кривыми из курса математического анализа. Обычно гладкие или хотя бы кусочно-гладкие, они всегда имеют конечную длину (в чем можно убедиться интегрированием). Мандельброт в этой связи опубликовал ряд увлекательных работ, в которых исследуется вопрос об измерения длины береговой линии Великобритании. В качестве модели он использовал фрактальную кривую, напоминающую границу снежинки за тем исключением, что в нее введен элемент случайности, учитывающий случайность в природе. В результате оказалось, что кривая, описывающая береговую линию, имеет бесконечную длину.

В Бостоне была необыкновенно теплая зима, но мы все-таки дождались первого снегопада. Наблюдая за снегопадом в окно, я задумался о снежинках и о том, что их структуру совсем непросто описать математически. Существует однако одна, особого рода снежинка, известная как снежинка Коха, которая может быть описана сравнительно просто. Сегодня мы рассмотрим, как её форма может быть построена с помощью Среды разработки приложений COMSOL Multiphysics.

Создание снежинки Коха

Как мы уже упоминали в нашем блоге, фракталы могут быть использованы в . Снежинка Коха является фракталом, который примечателен тем, что для его построения существует очень простой итерационный процесс:

  1. Начнем с равностороннего треугольника, который фактически является нулевой итерации снежинки Коха.
  2. Найдем центральную точку на каждом ребре текущей снежинки.
  3. В центре каждого ребра, добавим выступающий наружу равносторонний треугольник со стороной равной 1/3 длины текущего ребра.
  4. Определим следующую итерацию снежинки Коха, чтобы оказаться снаружи с внешней стороны предыдущей снежинки и всех добавленных треугольников.
  5. Повторим шаги 2-4 столько раз, сколько потребуется.

Данная процедура иллюстрируется на рисунке ниже для первых четырех итераций отрисовки снежинки.

Первые четыре итерации снежинки Коха. Изображение от Wxs — собственная работа. Лицензия CC BY-SA 3.0 , в Wikimedia Commons .

Построение геометрии снежинки Коха

Поскольку теперь мы знаем, какой алгоритм использовать, то давайте посмотрим, как создать такую структуру с помощью Среды разработки приложений COMSOL Multiphysics. Мы откроем новый файл и создадим двумерный объект геометрическая часть (geometry part) в узле Глобальные определения . Для этого объекта зададим пять входных параметров: длина стороны равностороннего треугольника; х – и y – координаты средней точки основания; и компоненты вектора нормали, направленной от середины основания к противолежащей вершине, как показано на рисунках ниже.


Пять параметров, используемых для задания размера, положения и ориентации равностороннего треугольника.


Задание входных параметров геометрической части.
Полигональный примитив используется для построения равностороннего треугольника.


Объект может поворачиваться вокруг центра нижнего ребра.


Объект можно переместить относительно начала отсчета.

Теперь, когда мы определили геометрическую часть, используем его один раз в разделе Геометрия . Этот одиночный треугольник эквивалентен нулевой итерации снежинки Коха, и теперь давайте используем Среду разработки приложений для создания снежинок более сложной формы.

Разметка пользовательского интерфейса приложения в Среде разработки приложений

Приложение имеет очень простой пользовательский интерфейс. Оно содержит только два компонента, с которыми пользователь может взаимодействовать: Ползунок (Слайдер) (отмеченный как 1 на рисунке ниже), с помощью которого можно задавать число итераций нужных для создания снежинки, и Кнопка (метка 2), по нажатию которой создается и отображается получившаяся геометрия. Имеются также Текстовая надпись (метка 3) и Отображение (Показ) данных (метка 4), которые показывают число заданных итераций, а также окно Графики (метка 5), в котором выводится итоговая геометрия.


Приложение имеет одну единственную форму с пятью компонентами.

В приложении есть два Определения (Declarations) , одно из которых определяет целое значение, называемое Iterations , и, по умолчанию, равное нулю, но которое может быть изменено пользователем. Определяется также 1D-массив чисел двойной точности с именем Center . Единственный элемент в массиве имеет значение 0.5, которое используется для нахождения центральной точки каждого ребра. Это значение никогда не изменяется.


Настройки для двух Определений.

Компонент "Слайдер" в пользовательском интерфейсе контролирует значение целого числа, параметра Iterations . Скриншот ниже показывает настройки "Слайдера" и значений, которые задаются как целые числа в диапазоне между 0 и 5. Тот же источник (как и для слайдера) также выбран для компонента Отображение данных (Data Display) для отображения на экране приложения числа заданных итераций. Мы ограничиваем потенциального пользователя пятью итерациями, поскольку используемый алгоритм неоптимальный и является не очень эффективным, но достаточно простым для реализации и демонстрации.


Настройки для компонента "Слайдер".

Далее, посмотрим на настройки для нашей кнопки, показанные на скриншоте ниже. При нажатии кнопки запускаются на исполнение две команды. Сначала вызывается метод CreateSnowFlake . Затем в графическом окне выводится получившаяся геометрия.


Настройки кнопки.

Мы сейчас посмотрели на пользовательский интерфейс нашего приложения и могли заметить, что создание любой геометрии снежинки должно произойти посредством вызываемого метода. Давайте посмотрим на программный код этого метода, с добавленной слева нумерацией строк и строковыми константами, выделенными красным цветом:

1 model.geom("geom1" ).feature().clear(); 2 model.geom("geom1" ).create("pi1" , "PartInstance" ); 3 model.geom("geom1" ).run("fin" ); 4 for (int iter = 1; iter "geom1" ).getNEdges()+1; 6 UnionList = "pi" + iter; 7 for (int edge = 1; edge "geom1" ).getNEdges(); edge++) { 8 String newPartInstance = "pi" + iter + edge; 9 model.geom("geom1" ).create(newPartInstance, "PartInstance" ).set("part" , "part1" ); 10 with(model.geom("geom1" ).feature(newPartInstance)); 11 setEntry("inputexpr" , "Length" , toString(Math.pow(1.0/3.0, iter))); 12 setEntry("inputexpr" , "px" , model.geom("geom1" ).edgeX(edge, Center)); 13 setEntry("inputexpr" , "py" , model.geom("geom1" ).edgeX(edge, Center)); 14 setEntry("inputexpr" , "nx" , model.geom("geom1" ).edgeNormal(edge, Center)); 15 setEntry("inputexpr" , "ny" , model.geom("geom1" ).edgeNormal(edge, Center)); 16 endwith(); 17 UnionList = newPartInstance; 18 } 19 model.geom("geom1" ).create("pi" +(iter+1), "Union" ).selection("input" ).set(UnionList); 20 model.geom("geom1" ).feature("pi" +(iter+1)).set("intbnd" , "off" ); 21 model.geom("geom1" ).run("fin" ); 22 }

Давайте пройдемся по коду "построчно", чтобы понять, какую функцию выполняет каждая строка:

  1. Очищаем все существующие геометрические последовательности, так чтобы мы смогли начать с нуля.
  2. Создаем один экземпляр объекта — нашего "треугольника", используя размер, ориентацию и расположение по умолчанию. Это наша снежинка нулевого порядка с меткой-идентификатором pi1 .
  3. Финализируем геометрию. Данная операция требуется для обновления всех индексов геометрии.
  4. Начнем процесс перебора всех заданных итераций снежинки, используя определение Iterations , как условие для остановки.
  5. Определяем пустой массив строк, UnionList . Каждый элемент массива содержит метку-идентификатор различных геометрических объектов. Длина этого массива равна числу ребер в последней итерации плюс один.
  6. Определяем первый элемент в массиве UnionList . Он является меткой-идентификатором результата предыдущей итерации. Имейте в виду, что нулевая итерация уже создана в строках 1-3. Целочисленное значение iter автоматически преобразуется в строку и добавится в конец строки "pi" .
  7. Перебираем число ребер в ранее сгененрированной снежинке.
  8. Задаем метку идентификатора для нового экземпляра объекта, обращающегося с геометрической части (part instance) "треугольник", который создается на этом ребре. Заметьте, что целочисленные значения iter и edge последовательно добавляются в конец строки pi , метки-идентификатора экземпляра объекта.
  9. Создаем экземпляр объекта "треугольник" и присваиваем ему метку-идентификатор, которая только что была задана.
  10. Указываем, что строки 11-15 относятся к текущему экземпляру объекта (part instance), используя оператор with()/endwith() .
  11. Определяем длину стороны треугольника. Нулевой порядок имеет длину стороны равную единице, так что n- я итерация имеет длину стороны (1/3) n . Функция toString() требуется для приведения (преобразования) типов данных — числа с плавающей точкой в строку.
  12. Задаем x -координату нового треугольника, как центральную точку стороны последней итерации. Метод edgeX задокументирован в . Напомним, что Center устанавливается равным 0.5.
  13. Задаем y -координату.
  14. Задаем x -компоненту вектора нормали треугольника. Метод edgeNormal также задокументирован в Справочном руководстве по программированию в среде COMSOL (COMSOL Programming Reference Manual) .
  15. Задаем y -компоненту вектора нормали.
  16. Закрываем оператор with()/endwith() .
  17. Добавляем метку-идентификатор текущего треугольника к списку всех объектов.
  18. Закрываем перебор всех ребер.
  19. Создаем Boolean Union (логическое объединение) всех объектов в геометрическую последовательность. Присваиваем метке новое значение piN , где N есть номер следующей итерации. Вокруг (iter+1) требуются круглые скобки, так чтобы увеличенное значение iter преобразовалось в строку.
  20. Указываем, что внутренние границы конечного объекта не сохраняются.
  21. Финализируем геометрию. Последняя операция обновляет все индексы геометрии для следующей итерации снежинки.
  22. Закрываем цикл итераций создания снежинки.

Таким образом, мы охватили все аспекты и элементы нашего приложения. Давайте посмотрим на результаты!


Наше простое приложение для построения снежинки Коха.

Мы могли бы расширить наше приложение для записи геометрии в файл, или даже для выполнения дополнительных анализов напрямую. Например, мы могли бы спроектировать фрактальную антенну . Если вас заинтересовала конструкция антенны, познакомьтесь с нашим примером , или даже сделайте ее макет с нуля .

Попробуйте Самостоятельно

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

  • Скачайте руководство Введение в Среду разработки приложений на английском языке
  • Просмотрите эти видеоролики и узнайте, как использовать
  • Прочитайте эти топики, чтобы познакомиться с тем, как приложения моделирования используются в

После того как вы преодолели этот материал, вы увидите, как функционал приложения может быть расширен для изменения размера снежинки, экспорта созданной геометрии, оценки площади и периметра и многого другого.

Какое приложение вы бы хотели создать в среде COMSOL Multiphysics? за помощью.

Фрактальная снежинка - один из самых известных и загадочных геометрических объектов - описана Хельгой фон Кох еще в начале нашего века. По традиции ее называют у нас в литературе снежинкой Коха. Это очень "колючая" геометрическая фигура, которую метафорически можно рассматривать как результат многократного "умножения" звезды Давида на саму себя. Шесть ее основных лучей покрыты бесконечным количеством больших и малых вершин-"иголочек". Всякий микроскопический фрагмент контура снежинки как две капли воды похож на весь большой луч, а большой луч в свою очередь содержит в себе бесконечное количество таких же микроскопических фрагментов.

На международном симпозиуме по методологии математического моделирования в Варне еще в 1994 году мне на глаза попалась работа болгарских авторов, которые описывали свой опыт использования снежинки Коха и других подобных объектов на уроках в старших классах для иллюстрации проблемы делимости пространства и философских апорий Зенона. Помимо этого, с образовательной точки зрения весьма интересен, на мой взгляд, сам принцип построения регулярных фрактальных геометрических структур - принцип рекурсивного умножения базового элемента. Природа недаром "любит" фрактальные формы. Это объясняется именно тем, что они получаются путем простого размножения и изменения размеров некого одного элементарного строительного блока. Как известно, природа не излишествует разнообразием причин и, где возможно, обходится наиболее простыми алгоритмическими решениями. Присмотритесь внимательно к контурам листьев, и во многих случаях вы обнаружите явное их родство с формой контура снежинки Коха.

Визуализация фрактальных геометрических структур возможна лишь при помощи компьютера. Построить снежинку Коха выше третьего порядка вручную уже очень сложно, а заглянуть в бесконечность так хочется! Поэтому, почему бы ни попытаться разработать соответствующую компьютерную программу. В РуНете можно отыскать рекомендации строить снежинку Коха из треугольников. Результат работы этого алгоритма выглядит как нагромождение пересекающихся линий. Интереснее скомбинировать эту фигуру из "кусочков". Контур снежинки Коха состоит из отрезков одинаковой длины, наклоненных под углом 0°, 60° и 120° по отношению к горизонтальной оси x. Если обозначить их соответственно 1, 2 и 3, то снежинка любого порядка будет состоять из следующих друг за другом троек - 1, 2, 3, 1, 2, 3, 1, 2, 3… и т. д. Каждый из этих трех типов отрезков может прикрепляться к предыдущему одним либо другим концом. С учетом этого обстоятельства можно считать, что контур снежинки состоит из отрезков шести типов. Обозначим их 0, 1, 2, 3, 4, 5. Таким образом, мы получаем возможность кодировать контур любого порядка при помощи 6 цифр (см. рисунок).

Снежинка более высокого порядка получается из предшественницы более низкого порядка путем замены каждого ребра на четыре, соединенных подобно сложенным ладошкам (_/\_). Ребро типа 0 заменяется на четыре ребра 0, 5, 1, 0 и так далее в соответствии с таблицей:

0 0 1 5 0
1 1 2 0 1
2 2 3 1 2
3 3 4 2 3
4 4 5 3 4
5 5 0 4 5

Простой равносторонний треугольник можно рассматривать как снежинку Коха нулевого порядка. В описанной системе кодировки ему соответствует запись 0, 4, 2. Все остальное можно получить путем описанных замен. Я не буду приводить здесь код процедуры и тем самым лишать вас удовольствия разработать свою программу самостоятельно. При ее написании вовсе необязательно использовать явный рекурсивный вызов. Его можно заменить обычным циклом. В процессе работы у вас будет лишний повод поразмыслить о рекурсии и ее роли в образовании квазифрактальных форм окружающего нас мира, а в конце пути (если, конечно, не поленитесь пройти его до конца) вы сможете полюбоваться сложным узором контуров фрактальной снежинки, а также заглянуть, наконец, в лицо бесконечности.

Кривая Коха - фрактальная кривая, описанная в 1904 году шведским математиком Хельге фон Кохом. Три копии кривой Коха, построенные (остриями наружу) на сторонах правильного треугольника, образуют замкнутую кривую, называемую снежинкой Коха.

У меня порой бывают заскоки, когда хочется какую-то мат. задачку запрограммировать. На этот раз решил с фракталами повозиться. А именно со снежинкой Коха.

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

Этот фрактал - один из первых исследованных учёными. Он получается из трёх копий кривой Коха, которая впервые появилась в статье шведского математика Хельге фон Коха в 1904 году. Эта кривая была придумана как пример непрерывной линии, к которой нельзя провести касательную ни в одной точке.

Основные свойства кривой Коха:

  1. Она непрерывна, но нигде не дифференцируема.
  2. Имеет бесконечную длину. Пусть длина исходного отрезка равна 1. На каждом шаге построения мы заменяем каждый из составляющих линию отрезков на ломаную, которая в 4/3 раза длиннее. Значит, и длина всей ломаной на каждом шаге умножается на 4/3: длина линии с номером n равна (4/3)n–1. Поэтому предельной линии ничего не остается, кроме как быть бесконечно длинной.
  3. Снежинка Коха ограничивает конечную площадь. И это при том, что ее периметр бесконечен. Это свойство может показаться парадоксальным, но оно очевидно - снежинка полностью помещается в круг, поэтому ее площадь заведомо ограничена.

Немного математики

Довольно интересно иногда вспомнить простейшие мат. преобразования (: В данном случае необходимо было освежить знания о векторах и трансформации точек в плоскости.

В частности, как повернуть точку относительно другой точки:

Ну и необходимо знать, как найти точку на отрезке, отдалённую на какое-то расстояние от точки, зная это расстояние и координаты точек. Методов так-то много. Можно найти координаты прямой, содержащую точки эти, а потом подставлять в уравнение. Можно вычислить координаты, используя вектора.

Выглядит как-то так.

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

В начале ХХ века математики искали такие кривые, которые ни в одной точке не имеют касательной. Это означало, что кривая резко меняет свое направление, и притом с колоссально большой скоростью (производная равна бесконечности). Поиски данных кривых были вызваны не просто праздным интересом математиков. Дело в том, что в начале ХХ века очень бурно развивалась квантовая механика. Исследователь М.Броун зарисовал траекторию движения взвешенных частиц в воде и объяснил это явление так: беспорядочно движущиеся атомы жидкости ударяются о взвешенные частицы и тем самым приводят их в движение. После такого объяснения броуновского движения перед учеными встала задача найти такую кривую, которая бы наилучшим образом аппроксимировала движение броуновских частиц. Для этого кривая должна была отвечать следующим свойствам: не иметь касательной ни в одной точке. Математик Кох предложил одну такую кривую. Мы не будем вдаваться в объяснения правила ее построения, а просто приведем ее изображение, из которого все станет ясно (рис.1.1.1).

Рис 1.1.1. Снежинка Коха.

Одно важное свойство, которым обладает граница снежинки Коха --- ее бесконечная длина. Это может показаться удивительным, потому что мы привыкли иметь дело с кривыми из курса математического анализа. Обычно гладкие или хотя бы кусочно-гладкие кривые всегда имеют конечную длину (в чем можно убедиться интегрированием). Мандельброт в этой связи опубликовал ряд увлекательных работ, в которых исследуется вопрос об измерении длины береговой линии Великобритании. В качестве модели он

Рис. 1.1.2. Построение снежинки Коха.


использовал фрактальную кривую, напоминающую границу снежинки за тем исключением, что в нее введен элемент случайности, учитывающий случайность в природе. В результате оказалось, что кривая, описывающая береговую линию, имеет бесконечную длину.

Салфетка и ковёр Серпинского

Еще один пример простого самоподобного фрактала --- салфетка Серпинского (рис. 1.2.1), придуманный польским математиком Вацлавом Серпинским в 1915 году. Сам термин салфетка принадлежит Мандельброту. В способе построения, следующем ниже, мы начинаем с некоторой области и последовательно выбрасываем внутренние подобласти. Позднее мы рассмотрим и другие способы, в частности с использованием L-систем, а также на основе итерированных функций.

Рис 1.2.1. Салфетка Серпинского

Пусть начальное множество S 0 --- равносторонний треугольник вместе с областью, которую он замыкает. Разобьем S 0 на четыре меньшие треугольные области, соединив отрезками середины сторон исходного треугольника. Удалим внутренность маленькой центральной треугольной области. Назовем оставшееся множество S 1 (рис. 1.2.2). Затем повторим процесс для каждого из трех оставшихся маленьких треугольников и получим следующее приближение S 2 . Продолжая таким образом, получим последовательность вложенных множеств S n , чье пересечение образует салфетка S.

Рис. 1.2.2. Построение салфетки Серпинского


Очевидно, что суммарная площадь частей, выкинутых при построении, в точности равна площади исходного треугольника. На первом шаге мы выбросили ј часть площади. На следующем шаге мы выбросили три треугольника, причем площадь каждого равна ј 2 площади исходного. Рассуждая таким образом, мы убеждаемся, что полная доля выкинутой площади составила:

1/4 + 3 * (1/4 2) + 3 2 * (1/4 3) + … + 3 n-1 * (1/4 n) + … .

Эта сумма равна. Следовательно, мы можем утверждать, что оставшееся множество S, то есть салфетка, имеет площадь меры нуль. Это выделяет множество S в разряд «совершенного», в том смысле, что оно разбивает свое дополнение на бесконечное число треугольных областей, обладая при этом нулевой толщиной.

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