植物的算法美:如何敲出一个漂亮的 Sunflower

“Beauty is bound up with symmetry.”
——(加)普鲁辛凯维奇、(加)林德梅叶《The Algorithmic Beauty of Plants》( CSDN下载,译为《植物的算法美》)

植物的魅力吸引了数学家们几个世纪的关注,诸如叶片的双侧对称,花朵的旋转对称以及松果中的鳞片的螺旋排列等明显的几何特征已被广泛地研究。
这里写图片描述
《The Algorithmic Beauty of Plants》探讨了植物结构美的另外两个因素——首先是简单而优雅的生成算法,即描述植物发育的规则;其次是其自相似性。
这里写图片描述
Erickson 和 Jean 尝试以纯粹的几何描述合成逼真图像的模型,借此呈现螺旋叶状图案的花和果实。
这里写图片描述

Phyllotaxis,在螺旋叶状图中,可见的螺旋,通常是斐波那契数列的两个连续元素:

                       1,1,2,3,5,8,13,21,34,55 ......

其中每个数字是前两项的总和。发生这种情况时,连续的叶子或植物元素之间的角度是接近黄金角:137.5°。这是不是很神奇。
这里写图片描述
长时间的观察,他们得出了以下公式:
这里写图片描述
这看起来是非常简便的数学公式。Mike Bostock 使用 HTML 实现了它
这里写图片描述

现在,我们试着在 Processing 中来实现 sunflower 的生长,代码非常简单:

/*
 * Phyllotaxis
 * By Hewes
 * Further reading: Hewes 的编程艺术(https://zhuanlan.zhihu.com/c_123529691)
 *
 */

float n = 0;
float c = 6;
ArrayList<PVector> points = new ArrayList<PVector>();
float start = 0;

void setup() {
  size(500, 500);
  colorMode(HSB, 360, 255, 255);
}

void draw() {
  background(0);
  translate(width / 2, height / 2);
  rotate(n * 0.3);

  for (int i = 0; i < n; i++) {
    float a = i * radians(137.5);
    float r = c * sqrt(i);
    float x = r * cos(a);
    float y = r * sin(a);
    float hu = i+start;
    hu = i/3.0 % 360;
    fill(hu, 255, 255);
    noStroke();
    ellipse(x, y, 4, 4);
  }
  n += 5;
  start += 5;

  if (keyPressed) {   // 保存图片
    saveFrame("Phyllotaxis.jpg");
  }
}

示例效果:
这里写图片描述
当137.5°变成137.3° 或者 137.6°后……
这里写图片描述
这里写图片描述
如果你在学习过程中,创造出令人惊艳的效果,欢迎@ Hewes。

posted @ 2020-01-12 10:00  升卿  阅读(686)  评论(0)    收藏  举报