我目前有一个制作分形树的程序。但是,我想在分形树中使用黄金分割率以获得更多有趣的设计。我不确切地知道如何使用坐标来实现它,尤其是在Java中,因为(0,0)在左上角,这使事情变得更加混乱。您可以忽略参数adder
和length
,因为它们不参与此过程。请原谅我对此事的无知,但我仍在努力围绕黄金分割的工作原理进行总结。我已经做了一些研究,但我真的很想以外行的方式回答。
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
,以使树干为100长,并且当时间顺序达到2时,叶子为20长。
如果使用length参数,然后递归以使每个连续的分支顺序为祖先的长度为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();
}
这是上面的代码生成的一个有趣的,稍微失衡的树: