几何之美(三)

      这里你不仅可以看到我在写Processing代码是的特点和编程风格,还能看到各种各样的形式和方法。在你编程的同时你会发现你自己的,也可以通过http://openProcessing.org上共享的代码中看到其他人的编程风格。

      画规则的多边形:

     你完全不能想象一个没有设计图的房子会成什么样子,所以你不应该没有规划地写代码。即使Processing是一个简单明了的语言,我仍然需要在敲键盘之前画一个草图先看看结果是什么样子。

      第一步:在纸上规划

      首先,画一幅纯手工的表格来唤起关于多边形的古老回忆。我先画的是六边形。像你看到的那样,我在中心和顶点之间用线段连接上,分成了六块,每块拼在一起就是一个完整的圆,或者说每块的中心角的和是360度。


      我仅仅需要找到问题解决的思路,草图就可以帮助我胜任了。我不需要在写程序的时候生成这个表。

      第二步:一些基本的三角法则

      如果你画了一条长度为r的线段,而且它与底边的夹角是θ,那么x(水平投影)和y(垂直投影)分别等于多少呢?如果你知道一些关于三角规则的知识,答案将立即得出:分别是r cos θ, r sin θ。



      第三步:设计讨论

      从0到n(边的数量)计算每个顶点,并且连接他们彼此是一项工程。在执行的每一步,我们画的角度都会增加360°/n

      画一组线条的最重要的问题是她们只是一些线条——你不需要得到一个可以填充的真实的图形,比如rect()和triangle()方法。幸运的是,Processing允许你通过beginShape()、vertex()、endShape()方法来创建你自己的图形。在beginShape()帮助文档的第一页的实例是可以参考的模型。所以接下来的设计讨论主要围绕将多边形转换为真实的图形。

      既然你可能会想要通过一个程序来画出许多多边形,调用polygon()方法是个好主意。它需要以下四个参数边的数量,中心点x和y坐标,还有半径。下面是代码实现部分。我在setup()方法中使用不同的方式来调用polygon()。既然我通过度数计算角,通过弧度计算正弦,余弦。所以必须使用radians()方法来进行转换。

void setup()
{
  size(300, 300);
  background(255);
  smooth();

  noFill();
  polygon(3, 50, 75, 50);
  polygon(4, 170, 75, 50);

  fill(255, 204, 255);
  stroke(128, 0, 128);
  polygon(5, 50, 180, 50);

  noFill();
  stroke(0);
  polygon(6, 170, 180, 50);
}

void polygon(int n, float cx, float cy, float r)
{
  float angle = 360.0 / n;

  beginShape();
  for (int i = 0; i < n; i++)
  {
    vertex(cx + r * cos(radians(angle * i)),
      cy + r * sin(radians(angle * i)));
  }
  endShape(CLOSE);
}

      走两步,看一步

      程序可以运行了,现在是开始思考该添加或者改动一些什么东西的时候了。第一,三角和五边形可能会有些错误;它们往往画点而不是线。原因是它们是奇数以至于第一个顶点(在0°)连接到右边的点。最好的方案是添加一个为第一个顶点初始化角的参数。但是我设计讨论的结果是使用rotate()方法。这个角到底是应该用角度表示还是用弧度值来表示呢?答案是:弧度,为了和Processing中的其他元素保持一致。

你可能感兴趣的:(processing)