《春·蜂》processing下的动画技术交互应用
《春·蜂》
春回大地,万物复苏,一切开始恢复生机。《春·蜂》动画交互系统设计从春天主题出发,参考《代码本色》中某些章节的理论,利用细胞自动机、向量、基本作用力(主要是重力)、分形、数组行列式等,创作出模拟蜜蜂群体飞舞、树枝随风摇曳、蜜蜂蜂巢生长变化、花朵绽放、蜂蜜下降速度随高度改变等特效,并加入了交互操作,使系统变化更加多样,体验更加丰富有趣。
代码绘制蜂巢
绘制简单六边形,选择蜂巢时,鼠标位置颜色加深。因此可以设置两层蜂巢,设置不同的颜色以及透明度。代码如下:
int radius = 20;
float angle = TWO_PI / 6;
void setup() {
size(640, 640);
background(255);
noCursor();
}
void draw() {
stroke(#ffcc00);
// vary the width - start just off the screen so we don't have black edges
for (float centy = -50+6*radius/4; centy < width+100; centy += radius*3) {
// offset three times to skip a row
for (float centx = 0; centx < width+100; centx += sqrt(3)/2 * 2*radius) {
beginShape();
if (mouseX > centx - radius && mouseX < centx + radius &&
mouseY < centy + radius && mouseY > centy - radius) {
fill( #ff9900);
} else {
fill( #ffff66, 30);
}
for (float a = PI/6; a < TWO_PI; a += angle) {
float vx = centx + cos(a) * radius;
float vy = centy + sin(a) * radius;
vertex(vx, vy);
};
endShape(CLOSE);
};
}
for (float centy = -50; centy < height+100; centy+= radius*3) {
for (float centx = sqrt(3)/2 * radius; centx < width+100; centx += sqrt(3)/2 * 2*radius) {
beginShape();
if (mouseX > centx - radius && mouseX < centx + radius &&
mouseY < centy + radius && mouseY > centy - radius) {
fill( #ff9900);
} else {
fill( #ffff66, 30);
}
for (float a = PI/6; a < TWO_PI; a += angle) {
float vx = centx + cos(a) * radius;
float vy = centy + sin(a) * radius;
vertex(vx, vy);
};
endShape(CLOSE);
}
}
}
绽放的分形花
“分形艺术"不同于普通的"电脑绘画”,普通的"电脑绘画"概念是用电脑为工具从事美术创作,创作者要有很深的美术功底,且作品的创作几乎完全依赖于作者的个人意愿。而"分形艺术"则是利用分形几何学原理,借助计算机强大的运算能力,将数学公式反复迭代运算,再结合作者的审美及艺术性的塑造,从而将抽象神秘的数学公式变成一幅幅精美绝伦的艺术画作。
线性分形又称为自相似分形。自相似原则和迭代生成原则是分形理论的重要原则。它表征分形在通常的几何变换下具有不变性,即标度无关性。由自相似性是从不同尺度的对称出发,也就意味着递归。分形形体中的自相似性可以是完全相同,也可以是统计意义上的相似。标准的自相似分形是数学上的抽象,迭代生成无限精细的结构,如科赫曲线(Koch snowflake)、谢尔宾斯基地毯(Sierpinski carpet)等。这种有规分形只是少数,绝大部分分形是统计意义上的无规分形。根据自相似性的程度,分形可以分为有规分形和无规分形,有规分形是指具体有严格的自相似性,即可以通过简单的数学模型来描述其相似性的分形,比如三分康托集、Koch曲线等;无规分形是指具有统计学意义上的自相似性的分形,比如曲折连绵的海岸线,漂浮的云朵等。
《春·蜂》中的分形花利用更新像素点的方法,实现了一步一步绘制分形花的动画效果,代码如下:
int widt, heigh;
int[][] p, v;
int[][] unicoord;
//
void setup() {
size(640,640);
//fullScreen();
colorMode(RGB, 2);
background(2, 1, 0);
widt = width-1;
heigh = height-1;
p = new int[width][height];
v = new int[width][height];
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
p[x][y] = 1;
v[x][y] = 1;
}
}
unicoord = new int[width][height];
int pixel = 0;
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
unicoord[x][y] = pixel++;
}
}
loadPixels();
}
///
void draw() {
for (int x = 1; x < widt; x++) {
for (int y = 1; y < heigh; y+=2) {
v[x][y] *= p[x][y] * p[x-1][y] * p[x+1][y] * p[x][y-1] * p[x][y+1] * p[x+1][y-1] * p[x+1][y+1];
}
for (int y = 2; y < heigh; y+=2) {
v[x][y] *= p[x][y] * p[x-1][y] * p[x+1][