简体   繁体   English

在打印分形树时需要帮助

[英]Need help in printing fractal tree

I need some help in printing fractal tree using JavaScript. 我需要一些使用JavaScript打印分形树的帮助。

I have written code which prints tree sequence according to the rules defined for the tree, but having some trouble to print the tree. 我已经编写了代码,该代码根据为树定义的规则来打印树序列,但是在打印树时遇到了一些麻烦。 Thanks for all the help. 感谢您的所有帮助。

Here is the code: 这是代码:

var sentence = "F";
var rules = [];
rules[0] = {
    a: "F",
    b: "F[+F]F[-F]F"
}

setup();
function setup() {
    turtle();
    for (i = 0; i < 2; i++){
        generate();
    }
}

function turtle(){
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext('2d');
    for (var i = 0; i < sentence.length; i++){
        context.beginPath();
        var current = sentence.charAt(i);
        if (current == "F"){
            context.stroke();
            context.lineTo(50,50);
        }else if (current == "+"){
            context.rotate(20*Math.PI/180);
        }else if (current == "-"){
            context.rotate(-20*Math.PI/180);
        }else if (current == "["){
            context.save();
        }else if (current == "]"){
            context.restore();
        }
    }
}

function generate(){
    var nextSentence = "";
    for (var i = 0; i < sentence.length; i++){
        var current = sentence.charAt(i);
        var found = false;
        for (var j = 0; j < rules.length; j++ ){
            if (current == rules[j].a){
                found = true;
                nextSentence += rules[j].b;
                console.log(nextSentence);
                break;
            }
        }
        if (!found){
            nextSentence += current;
        }
    }
    sentence = nextSentence;
    turtle();
}

I am able to print a tree sequence, but need some help in converting that tree sequence to be able to print a tree on the canvas. 我能够打印树序列,但是在转换该树序列以在画布上打印树时需要一些帮助。 The output should look something like this: 输出应如下所示:

在此处输入图片说明

There are some issue with your drawing logic. 您的绘图逻辑存在一些问题。 You code seems to be assuming that save() and restore() also save the coordinates and restore them -- they don't. 您的代码似乎假设save()restore()也保存了坐标并还原了它们,但事实并非如此。 You aren't using rotate() correctly (it rotates relative to the origin so you need to also translate() ). 您没有正确使用rotate() (它会相对于原点旋转,因此您还需要translate() )。 You're doing absolute lineto() when you should be doing it relative to the current position. 您应该对于当前位置执行绝对 lineto() And moving in the wrong direction. 并朝错误的方向前进。 And other issues. 等问题。

Here's my rework of your code to make it run just enough to produce the example tree: 这是我对您的代码的重做,以使其足以运行以生成示例树:

var sentence = "F";
var rules = [];

rules[0] = {
    a: "F",
    b: "F[+F]F[-F]F"
}

var x = 150;  // starting x
var y = 400;  // starting y
var y_stack = [];  // save & restore don't handle coordinates

function turtle(sentence, context) {

    for (var i = 0; i < sentence.length; i++) {

        var current = sentence.charAt(i);

        if (current == "F") {
            y -= 35;
            context.lineTo(x, y);
            context.stroke();
        } else if (current == "+") {
            context.translate(x, y);
            context.rotate(20 * Math.PI / 180);
            context.translate(-x, -y);
        } else if (current == "-") {
            context.translate(x, y);
            context.rotate(-20 * Math.PI / 180);
            context.translate(-x, -y);
        } else if (current == "[") {
            context.save();
            y_stack.push(y);
        } else if (current == "]") {
            context.restore();
            y = y_stack.pop();
            context.moveTo(x, y)
        }
    }
}

function generate(sentence) {
    var nextSentence = "";

    for (var i = 0; i < sentence.length; i++) {
        var current = sentence.charAt(i);
        var found = false;

        for (var j = 0; j < rules.length; j++ ) {
            if (current == rules[j].a) {
                found = true;
                nextSentence += rules[j].b;
                break;
            }
        }

        if (!found) {
            nextSentence += current;
        }
    }

    return nextSentence;
}

function draw() {
    var canvas = document.getElementById("myCanvas");
    var context = canvas.getContext('2d');

    context.moveTo(x, y);

    for (i = 0; i < 2; i++) {
        sentence = generate(sentence);
    }

    console.log(sentence);
    turtle(sentence, context);

}

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM