代码本色——雪梨的Processing探索·Chapter 3:振荡

概述

Chapter 3为我们介绍了振荡的相关概念,引入了关于角运动、指向运动的概念,更让我们熟知了物体旋转、周期变化的原理,下面就让我们来好好的了解下这些在振荡章节中的精彩内容,然后再让我们来发挥想象进行这些知识的运用创作。

原理介绍

三角函数

众所周知的三角函数无外乎就是cossintan等,这些函数的创造性使用可以为我们带来与众不同的运动路径(心形线),更有不一样的集合存在形态(波)。

旋转运动及极坐标下的旋转

旋转运动非常简单,改变角度,使用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写的都憔悴了,粒子系统,冲鸭!

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值