JavaFX
Advertisement

Главная | Описание языка | FXD | API | Примеры | Инструменты Разработки | Новости | Ресурсы | Форум


Fractal snowflakes


НЕМНОГО О ФРАКТАЛАХ

Фрактал[]

Для отрисовки фракталов понадобятся 2 класса.

  • Fractal - умеет отрисовывать себя и создавать части из которых состоит фрактал
  • FractalView - умеет отрисовывать весь фрактал до некоторой заданной глубины


 public abstract class Fractal {

    public abstract function shape(): Node;

    public abstract function childs(): Fractal[];

}


  
public class FractalView extends CustomNode {

    public var fractal: Fractal;
    public var depth: Integer;

    override function create() {
        create(depth, fractal);
    }

    function create(depth: Integer, fractal: Fractal): Node {
        if (depth == 1) {
                fractal.shape()
        } else {
            Group {
                content: for (f in fractal.childs()) create(depth - 1, f)
            }
        }
    }

}

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

Вот как можно описать сторону снежинки Коха в виде фрактала:

Fractal snowflake side

 
class Side extends Fractal {

    public var x1: Number;
    public var y1: Number;
    public var x2: Number;
    public var y2: Number;

    override public function childs(): Fractal[] {
        var dx = x2 - x1;
        var dy = y2 - y1;
        var x3 = x1 + dx / 3;
        var y3 = y1 + dy / 3;
        def sqrt = Math.sqrt(3.0);
        var x4 = x1 + dx / 2 - sqrt * dy / 6;
        var y4 = y1 + dy / 2 + sqrt * dx / 6;
        var x5 = x1 + 2 * dx / 3;
        var y5 = y1 + 2 * dy / 3;
        [
            Side { x1: x1 y1: y1 x2: x3 y2: y3 }
            Side { x1: x3 y1: y3 x2: x4 y2: y4 }
            Side { x1: x4 y1: y4 x2: x5 y2: y5 }
            Side { x1: x5 y1: y5 x2: x2 y2: y2 }
        ]
    }

    override public function shape(): Node {
        Line {
            startX: x1 startY: y1 endX: x2 endY: y2
            stroke: Color.BLUE
        }
    }

}


Снежинка Коха состоит из 3х сторон:

 
class SnowFlake extends CustomNode {

    public var centerX: Number;
    public var centerY: Number;
    public var radius: Number;
    public var depth: Integer;

    override function create() {
        def angle = 2 * Math.PI / 3;
        def PI2 = Math.PI / 2;
        var x = for (i in [1..3]) centerX + radius * Math.cos(i * angle + PI2);
        var y = for (i in [1..3]) centerY - radius * Math.sin(i * angle + PI2);
        Group {
            content: [
                FractalView {
                    depth: depth
                    fractal: Side { x1: x[0] y1: y[0] x2: x[1] y2: y[1] }
                }
                FractalView {
                    depth: depth
                    fractal: Side { x1: x[1] y1: y[1] x2: x[2] y2: y[2] }
                }
                FractalView {
                    depth: depth
                    fractal: Side { x1: x[2] y1: y[2] x2: x[0] y2: y[0] }
                }
            ]
        }
    }

}


Fractal snowflake


Main.fx файл:

 
Stage {
    title: "Snowflake"
    scene: Scene {
        width: 400
        height: 400
        content: SnowFlake {
            depth: 6
            centerX: 200
            centerY: 200
            radius: 150
        }
    }
}
Advertisement