如何制作金色分形树

时间:2016-03-16 04:46:27

标签: java fractals

我目前有一个制作分形树的程序。但是,我想在我的分形树中使用黄金比例来获得更有趣的设计。我不知道如何使用坐标来实现它,特别是对于java,因为(0,0)位于左上方,这使得事情更加混乱。您可以忽略参数adderlength,它们不参与此过程。请原谅我对此事的无知,我仍然试图了解黄金比率究竟是如何运作的。我已经做了一些研究,但我真的希望得到外行人的答案。

public void paintComponent(Graphics g)
    {

        g.setColor(Color.RED);

        draw(g, order, topX, topY,90,20, 200.00);
    }


public void draw(Graphics g, int order, int x1, int y1, double angle, int adder, double length) 
{
    int x2, y2, x3, y3; 
    double newAngle = Math.toRadians(angle); 

    if (order == 1)
    {
        return;
    }
    else
    {
        x2 = (x1 - (int)Math.round(Math.cos(newAngle) * order * 10));

        y2 = (y1 - (int)Math.round(Math.sin(newAngle) * order * 10));

        g.drawLine(x1, y1, x2, y2);

        draw(g, order-1, x2, y2, angle+30, adder+2, length+20);
        draw(g, order-1, x2, y2, angle-30, adder+2, length+20);
    }
} 

这是当前输出的数量级为10。 enter image description here

1 个答案:

答案 0 :(得分:2)

将黄金比率集成到代码中的一种方法是在分支长度的计算中使用它。在这里,虽然你有一个length参数,但它没有使用。相反,长度计算为order * 10,使得主干长度为100,并且当时间顺序达到2时,叶子长度为20。

如果你使用长度参数,并递归使得每个连续的分支顺序是祖先1的长度为0.618034,你可以制作一个树干具有较长的树干和核心分支,并收敛到一种类似西兰花的细节在树叶:

Tree with 30 degree branching and each successive branch length is 0.618 times the ancestor's length.

您可以控制的另一个参数是角度,您将其设置为30度。下面,我已将您的代码转换为Processing(它基本上是Java,并且易于用于这些类型的东西)。您可以将其粘贴到http://www.openprocessing.org/sketch/create并在浏览器中运行以进行播放。看看如何用20到40之间的均匀随机数替换30的角度会改变树。继续单击运行以查看不同的树。

void setup()
{
    size(1000,1000);
    smooth();
    stroke(0);
    frameRate(30);
}

void go(int order, int x1, int y1, float angle, int adder, int length) 
{
    int x2, y2, x3, y3; 
    double newAngle = angle * PI / 180; 

    if (order == 1)
    {
        return;
    }
    else
    {
        x2 = (x1 - round(cos(newAngle) * length));

        y2 = (y1 - round(sin(newAngle) * length));

        line(x1, y1, x2, y2);

        go(order-1, x2, y2, angle+random(20,40), adder+2, 0.618034 * length);
        go(order-1, x2, y2, angle-random(20,40), adder+2, 0.618034 * length);
    }
} 

void draw()
{
    stroke(255, 0, 0);
    strokeWeight(1);

    go(10, 500, 999, 90, 20, 100);
    exit();
}

这是一个有趣的,稍微不平衡的树,由上面的代码生成:

Off balance tree