1

誰かがこのコードを調べて、結果として得られるバーンズリーのシダのフラクタルが正しく見えない理由を指摘できますか?

function barnsley (ctx) {

ctx.fillStyle = 'green';
ctx.translate(ctx.canvas.width/2,ctx.canvas.height/2);
var self = this;

this.itts = 100000;
this.ittsCount = 0;
this.x = 0;
this.y = 0;

this.main = function () {
    for (var i=0;i<itts;i++) {
        var rand = Math.random()*100;
        if (rand < 1) {
            self.one();
        } else if (rand < 86) {
            self.two();
        } else if (rand < 94) {
            self.three();
        } else {
            self.four();
        }
    }
}

this.one = function () {
    var xn = self.x;
    var yn = self.y;
    var zx = 0;
    var zy = 0.16 * yn;
    self.drawPoint(zx,zy);
}

this.two = function () {
    var xn = self.x;
    var yn = self.y;
    var zx = 0.85 * xn + 0.4 * yn;
    var zy = -0.04 * xn + 0.85 * yn + 1.6;
    self.drawPoint(zx,zy);
}

this.three = function () {
    var xn = self.x;
    var yn = self.y;
    var zx = 0.2 * xn - 0.26 * yn;
    var zy = 0.23 * xn + 0.22 * yn + 1.6;
    self.drawPoint(zx,zy);
}

this.four = function () {
    var xn = self.x;
    var yn = self.y;
    var zx = -0.15 * xn + 0.28 * yn;
    var zy = 0.26 * xn + 0.24 * yn + 0.44;
    self.drawPoint(zx,zy);
}

this.drawPoint = function (xn,yn) {
    self.x = xn;
    self.y = yn;
    ctx.fillRect(xn*20,-yn*20,1,1);
}

this.main();
}

それは正しい一般的な形をしていますが、私は何かが欠けているに違いありません、私はアルゴリズムなどをチェックしましたが、役に立ちませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

4

数字の入力中に小さなエラーが発生しました。(私はこのソースに対してチェックしました、それはあなたが使用しているのと同じ番号を使用しているようです)。

このthis.two関数では、変更する必要があります

var zx = 0.85 * xn + 0.4 * yn;

var zx = 0.85 * xn + 0.04 * yn;

この修正がjsFiddleで実際に動作していることを確認できます。

于 2013-03-20T23:59:26.380 に答える
0

それを行う方法は何百万もありますが、あなたはこれが好きかもしれないと思います。

更新/ステップはJSスケジューラー/タイマーによって処理されます。これは非ブロッキングであり、CPUが重いforループで狂うことはありません。

フラクタルデータも別の方法で処理されます。パラメータを1か所で変更するだけで、アフィン変換で作成されたフラクタルを配置できます。また、確率を合計する必要はありません。

例:(StackOverflowでは、コード例なしでJSFiddleリンクを投稿できません)

var probability_transforms =  [
    {
        "probability": 0.01, 
        "item": function(point){ return affine_transform(point, 0, 0, 0, 0.16, 0, 0) }
    },
    {
        "probability": 0.85, 
        "item": function(point){ return affine_transform(point, 0.85, 0.04, -0.04, 0.85, 0, 1.6) }
    },
    {
        "probability": 0.07,
        "item": function(point){ return affine_transform(point, 0.2, -0.26, 0.23, 0.22, 0, 1.6) }
    },
    {
        "probability": 0.07, 
        "item": function(point){ return affine_transform(point, -0.15, 0.28, 0.26, 0.24, 0, 0.44) }
    }
];

楽しむ :)

于 2014-07-11T00:30:33.000 に答える