Что такое снежинка Коха?

Возьмем отрезок единичной длины и назовем его E(1). Если мы удалим среднюю треть, заменив ее двумя другими сторонами равностороннего треугольника на основе удаленного сегмента, мы получим что-то вроде _/\_ и назовем это E(2). Давайте теперь возьмем оставшиеся прямые и повторим процесс с ними. Таким образом, в более математических терминах: E(k) получается путем замены средней трети каждого отрезка прямой линии E(k-1) двумя другими сторонами равностороннего треугольника.

Когда k велико, кривые E(k-1) и E(k) отличаются лишь незначительно, и если мы отправим это k в бесконечность, E(k) приблизится к предельной кривой, которую мы называем кривой Коха.

Теперь, когда у нас есть кривая Коха за поясом, все, что осталось сделать, — это построить три кривые Коха, чьи кривые E(1) образуют равносторонний треугольник.

Ниже приведен код Java для рисования снежинки Коха на панели JPanel. Снежинка динамически изменяет размер, когда вы меняете размер окна.

Алгоритм

Учитывая 2 точки (X1, Y1) и (X5, Y5), мы назначаем следующие переменные:

deltaX = X5 — X1,
deltaY = Y5 — Y1
X2 = x1 + deltaX / 3,
Y2 = Y1 + deltaY / 3

X3 = 0,5 * (X1 + X5) + sqrt(3) * (Y1 — Y5) / 6,
Y3 = 0,5 * (Y1 + Y5) + sqrt(3) * (X5 — X1) / 6
X4 = X1 + 2 * deltaX / 3,
Y4 = Y1 + 2 * дельтаY / 3

Код

Ниже приведен полный фрагмент, используемый для рисования снежинки.

import java.awt.Graphics;
 
public class KochSnowflake extends javax.swing.JPanel {
 
   public KochSnowflake() {
        initComponents();
    }
 
    int height;
    int width;
    int level = 3;
    @Override
    public void paint(Graphics g){
        height = this.getHeight() - this.getHeight()/4;
        width = this.getWidth();
        int xStart = width/2 - height/2;
        drawSnow(g, level, xStart + 20,             height - 20,   xStart + height - 20, height - 20);
        drawSnow(g, level, xStart + height - 20,    height - 20,   xStart + height/2,    20);
        drawSnow(g, level, xStart + height/2,       20,            xStart + 20,          height - 20);
 
    }
 
    private void drawSnow (Graphics g, int lev, int x1, int y1, int x5, int y5){
          int deltaX, deltaY, x2, y2, x3, y3, x4, y4;
 
          if (lev == 0){
              g.drawLine(x1, y1, x5, y5);
          }
          else{
                deltaX = x5 - x1;
                deltaY = y5 - y1;
 
                x2 = x1 + deltaX / 3;
                y2 = y1 + deltaY / 3;
 
                x3 = (int) (0.5 * (x1+x5) + Math.sqrt(3) * (y1-y5)/6);
                y3 = (int) (0.5 * (y1+y5) + Math.sqrt(3) * (x5-x1)/6);
 
                x4 = x1 + 2 * deltaX /3;
                y4 = y1 + 2 * deltaY /3;
 
                drawSnow (g,lev-1, x1, y1, x2, y2);
                drawSnow (g,lev-1, x2, y2, x3, y3);
                drawSnow (g,lev-1, x3, y3, x4, y4);
                drawSnow (g,lev-1, x4, y4, x5, y5);
            }
        }
}

Источники:
1) http://aisha91.hubpages.com/hub/Java-Source-Code-Recursive-Snow-Flakes
2) Falconer: Fractal Geometry