首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript: Barnsley Fern Fractal

Javascript: Barnsley Fern Fractal
EN

Stack Overflow用户
提问于 2013-03-21 07:39:39
回答 2查看 1.2K关注 0票数 1

谁能看一看这段代码,指出为什么产生的巴恩斯利羊齿分形看起来不正确?

代码语言:javascript
复制
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();
}

它有正确的一般形状,但我一定遗漏了一些东西,我检查了算法等等,但都没有用。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-21 07:59:26

只是在输入数字时出现了一个小错误。(我检查了this source,它看起来和你使用的数字是一样的)。

在此this.two函数中,您需要更改

代码语言:javascript
复制
var zx = 0.85 * xn + 0.4 * yn;

代码语言:javascript
复制
var zx = 0.85 * xn + 0.04 * yn;

你可以看到this fix in action on jsFiddle

票数 4
EN

Stack Overflow用户

发布于 2014-07-11 08:30:33

有数以百万计的方法可以做到这一点,但我认为你可能会喜欢this one

更新/步骤由JS调度器/计时器处理。它是非阻塞的,不会让你的CPU因为一个繁重的for循环而发疯。

分形数据也以不同的方式处理。只要改变参数,你就可以把任何用仿射变换生成的分形放在一个地方。你也不必对概率求和,因为它会为你做这件事。

例如:(StackOverflow不允许我在没有代码示例的情况下发布JSFiddle链接)

代码语言:javascript
复制
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) }
    }
];

玩得开心:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15536849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档