概述
Chapter 3为我们介绍了振荡的相关概念,引入了关于角运动、指向运动的概念,更让我们熟知了物体旋转、周期变化的原理,下面就让我们来好好的了解下这些在振荡章节中的精彩内容,然后再让我们来发挥想象进行这些知识的运用创作。
原理介绍
三角函数
众所周知的三角函数无外乎就是cos、sin、tan等,这些函数的创造性使用可以为我们带来与众不同的运动路径(心形线),更有不一样的集合存在形态(波)。
旋转运动及极坐标下的旋转
旋转运动非常简单,改变角度,使用rotate函数,都可以使物体旋转,而极坐标中正好只有半径和角度两个参量,可以完成与直角坐标之间位置的对应转化,如下:
指向运动
这是我在本书当中看到的新概念,我们都知道速度是有方向的,我们希望在现有速度的方向上使得物体发生旋转,那么就可以求出现有角度,再对角度进行改变:
根据上述概念,可以利用正切值tan以及反三角函数arctan求出角度,在Processing中我们推荐使用atan2()反三角函数求角度或是直接使用heading2D()求向量弧度。
突然对最后一个作业的创作有了想法,这样子可以让粒子系统中的粒子们走出我希望的曲线路径了。
动手实践——“奇妙的旋转”
我尝试了多种效果:
第一种 基于极坐标变换的旋转
(每次覆盖)
(不覆盖)
第二种 纯角度旋转(效果满意)
实现的方法非常简单,首先我们先定义一个RotateOne类,里面包含了所有我们绘制的弧形的成员函数:(针对效果一二update函数略有不同,以下为效果二)
class RotateOne{
float r;
float rotatetheta;
float sizethetas;
float sizethetae;
RotateOne(){
sizethetas=random(0,360)/180*PI;
sizethetae=random(0,360)/180*PI;
r=600;
rotatetheta=0;
}
void update(){
//sizethetas=random(0,360)/180*PI;//效果一
//sizethetae=random(0,360)/180*PI;//效果一
//float x=r*cos(rotatetheta);//效果一
//float y=r*sin(rotatetheta);
r=r-0.2;//效果二
arc(0,0,r,r,sizethetas+rotatetheta,sizethetae+rotatetheta,PIE);
rotatetheta+=PI/500;
}
void colorchoice(int count){
int countset=count%3;
switch(countset)
{
case 0:
fill(19,0.4,1,random(0.1,0.5));
break;
case 1:
fill(218,0.4,1,random(0.1,0.5));
break;
case 2:
fill(271,0.4,1,random(0.1,0.5));
break;
}
}
}
接下来就去主函数调用,在这里,我第一次使用了HSB颜色模式,也算是一次尝试,取色要比RGB简单些:
ArrayList<RotateOne> r=new ArrayList();
int count=0;
void setup() {
size(600, 600);
background(255);
noStroke();
colorMode(HSB,360,1,1,1);
for(int i=0;i<1;i++)//效果二只需要一个弧形,效果一需要较多
{
RotateOne rr=new RotateOne();
r.add(rr);
}
}
void draw() {
noStroke();
//fill(0,0,100,1);
//rect(0,0,width,height);//覆盖
translate(width/2, height/2);
ellipseMode(CENTER);
for(RotateOne rr:r)
{
rr.colorchoice(count/10);
rr.update();
}
count++;
}
然后就大功告成啦!
心得
呜呜,终于要结束了,孩子写Processing写的都憔悴了,粒子系统,冲鸭!