- 生成艺术:Processing视觉创意入门
- 华好
- 1788字
- 2025-02-24 23:16:05
1.3 颜色
1.2节用%运算符使椭圆在画布内循环往复地运动。现在我们来认识一下四个常见的运算符,即加、减、乘、除。在一个空白的程序内写出以下代码:

单击工具栏内的播放键,底部的控制台(console)会打印出“4”,即1+3的计算结果等于4。实际上这行代码做了三件事:①做1+3等于4的数学计算;②把答案“4”作为参数传递给print()方法;③print()方法将答案在控制台中打印出来。注意:这行代码要以分号结束。我们再试试减法、乘法和除法:

控制台会打印出-22122.3333333。print()打印时不会带空格。为了更清楚地看到结果,可以将第一行程序改写为“print(1-3+",");”,控制台会打印出“-2,”,即在数字后面加了一个逗号。我们还可以使用println()方法,这样每次打印时都会换行:

控制台会分四行打印出四个结果,但为什么7/3=2?实际上,当除号“/”两侧的数字都是整数时,Processing会做整数除法,即“7除以3等于2余1”。【7/3=2*3+1】
如果不想做整数除法,需要把数字写成小数,如7.0/3、7.0/3.0、7/3.0皆可。对于Processing来说,小数(float)与整数(int)截然不同。我们将在2.1节深入介绍float和int这两种数据类型。对于数学家来说,3.0与3是截然不同的。德国数学家利奥波德·克罗内克(Leopold Kronecker)曾说:自然数是上天给的,小数则是人造出来的。

算术中括号可以控制运算的优先级,这对程序而言同样适用。譬如,(4+5)×2与4+5×2的结果不同,但4+5×2与4+(5×2)是一回事。
如何用数学方法和代码来表示五彩斑斓的颜色呢?这要从彩虹说起。日光透过水汽呈现出连续变化的颜色。牛顿在实验室里用三棱镜把白光分解成连续的光谱,后来人们将光谱中的七种颜色(按光的波长排序)命名为:红(red)、橙(orange)、黄(yellow)、绿(green)、青(cyan)、蓝(blue)、紫(violet)。每个人对颜色的感受与理解会略有偏差,幸好计算机程序可以用数字来精确表示颜色。譬如:

上面这个程序运行后,将产生一种有点偏紫的蓝色。这段代码首先把程序的颜色模式设为HSB模式,即Hue(色相)、Saturation(饱和度)、Brightness(亮度)。其中,色相正好对应彩虹从红到紫的光谱,用0~255中的一个数字来指定色相。我们可以移动鼠标来产生0~255中的任意一个数字,并产生对应的色相:

显示窗口颜色的色相(Hue)与鼠标y坐标相关联,底部的控制台随时打印出mouseY值,即色相的值。
frameCount(当前帧的序号)与%运算符的组合可以动态地展示七彩颜色:

红色和黄色给人温暖的感觉,绿色和蓝色则是“冷色”。德国文豪歌德曾经专门研究人对颜色感知,反对牛顿单纯用数学和物理方法对颜色进行分析。计算机领域则采用了牛顿的思想,把所有颜色解释为三原色(红、绿、蓝)之间特定比例的混合。这就是RGB模式:

鼠标在左上角时显示黑色(红色、绿色成分都为0),在右上角时显示红色,在左下角时显示绿色,在右下角时显示黄色(红色、绿色成分都为255)。由于RGB模式是Processing的默认模式,因此“colorMode(RGB);”这行代码可以省略。

我们可以采用不同的颜色来绘制不同的物体,譬如:

矩形为青色(R:0, G:255, B:255),圆形为黄色(R:255, G:255, B:0)。在调用colorMode(RGB)之后,fill(0, 255, 255)括号内的三个数值就代表红色、绿色、蓝色三种颜色的成分。fill()方法用来指定画形状时填充的颜色。rect(x, y, w, h)是画矩形的方法:

我们不但可以指定形状的填充颜色,还可以改变形状边缘的颜色:

上述代码设置矩形的边缘为黑色,椭圆的边缘为红色,如图1-4所示。该程序中矩形的左上角总是与鼠标对齐,因为程序默认的模式是rectMode(CORNER)。在任意一个程序块内部,代码是一行一行依次执行的,因此第五、六行的stroke()和fill()影响了第七行ellipse()所绘椭圆的颜色,而第八、九行的stroke()与fill()只能影响第十行rect()所绘矩形的颜色。

图1-4 黑色边缘的矩形,红色边缘的椭圆
在编程时,经常需要暂时删掉一段代码,我们一般用一对/* */来把一段代码“注释掉”,如下面的程序段把矩形暂时去掉了:

当我们再次需要这段代码时,把/* */符号删除即可。
水彩画中的颜色可以呈现半透明的状态。Processing中的颜色也可以,我们只要把fill()、stroke()等方法内的三个参数变成四个即可,其中第四个参数表示透明度(取值范围同样是0~255,0为完全透明,255为不透明)。譬如:

运行结果如图1-5所示。

图1-5 半透明的绿色圆形和半透明的橙色正方形
其中,圆形的填充颜色设置为RGB模式下的fill(0, 255, 0, 100),纯绿色结合了100的透明度之后变成了浅绿色。正方形的填充颜色设置为HSB模式下的fill(25, 255, 255, 50),橙色结合了50的透明度之后显得非常通透。
你也许已经发现,background()、stroke()、fill()这几个方法的括号内可以有一个、三个或四个参数,如fill(255)、fill(0, 255, 0)、fill(0, 255, 0, 100)。在Processing内部,其实已经定义好了三个不同的版本,它们名称相同但参数不同,这称为方法的重载(overload)。
