ФЭНДОМ


Главная | Описание языка | 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
        }
    }
}

Обнаружено использование расширения AdBlock.


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

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

Также на ФЭНДОМЕ

Случайная вики