我目前有一个制作分形树的程序。但是,我想在我的分形树中使用黄金比例来获得更有趣的设计。我不知道如何使用坐标来实现它,特别是对于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);
}
}
答案 0 :(得分:2)
将黄金比率集成到代码中的一种方法是在分支长度的计算中使用它。在这里,虽然你有一个length
参数,但它没有使用。相反,长度计算为order * 10
,使得主干长度为100,并且当时间顺序达到2时,叶子长度为20。
如果你使用长度参数,并递归使得每个连续的分支顺序是祖先1的长度为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();
}
这是一个有趣的,稍微不平衡的树,由上面的代码生成: