如何制作金色的分形树

How to make Golden Fractal Trees

我目前有一个制作分形树的程序。但是,我想在我的分形树中使用黄金比例来获得更有趣的设计。我不知道如何用坐标来实现它,尤其是 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 的情况。

将黄金比例整合到您的代码中的一种方法是在分支长度的计算中使用它。在这里,虽然您有一个 length 参数,但它未被使用。相反,长度计算为 order * 10 使得 t运行k 为 100 长,并且当时间顺序达到 2 时,叶子为 20 长。

如果你使用长度参数,并且递归使得每个连续的分支顺序是祖先顺序的 0.618034 长度,你会创建一个具有更长 t运行k 和核心分支的树,并且收敛到叶子上类似西兰花的细节:

您可以控制的另一个参数是角度,您已将其设置为 30 度。下面,我已将您的代码转换为 Processing (it's basically Java, and easy to use for these kinds of things). You can paste this into 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();
}

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