这里你不仅可以看到我在写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中的其他元素保持一致。