【问题标题】:How to make Golden Fractal Trees如何制作金色分形树
【发布时间】:2016-03-16 04:46:26
【问题描述】:

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

【问题讨论】:

    标签: java fractals


    【解决方案1】:

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

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

    您可以控制的另一个参数是角度,您已将其设置为 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();
    }
    

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

    【讨论】:

    • 谢谢你!知道了这一点,我就能做出非常有趣的模式!
    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-09
    • 2021-05-29
    • 1970-01-01
    • 1970-01-01
    • 2015-06-06
    相关资源
    最近更新 更多