【互动媒体技术】互动编程习作1——表现随机行为及牛顿运动学

第0章:引言

这一章里我参考了示例0-5和示例0-6,把0-5中Perlin噪声的游走模型用在了0-6的颜色显示代码上,画出了颜色随着时间改变的烟雾效果。主要用到的函数有:
noise()函数
noise()函数返回指定坐标处的Perlin噪声值。Perlin噪声算法能生成符合自然排序(“平滑”)的伪随机数序列。noise()函数有3个参数,分别代表x轴,y轴,z轴的随机数,所以可以生成1维到3维的Perlin噪声。

完整代码:

float increment = 0.02;
float zoff=0.0;
void setup() {
   
  size(720,480);
}
void draw() {
   
  background(0);
  loadPixels();
  float xoff = 0.0; 
  for (int x = 0; x < width; x++) {
   
    	xoff += increment;  
  	float yoff = 0.0;   
  	for (int y = 0; y < height; y++) {
   
	   yoff += increment; 
	   float bright = noise(xoff,yoff,zoff)*255;
	   pixels[x+y*width] = color(bright*0.5*abs(sin(zoff)),bright*0.3*abs(sin(zoff)),bright*(1-0.8*abs(sin(zoff))));	
	}
 }
  updatePixels();
  zoff += increment;  
}

运行效果:
在这里插入图片描述

第1章:向量

这一章我参考了示例1-10和1-11,制作了一个弹力绳拉拽小球的效果,可以通过修改数组大小来改变小球数量(演示GIF中使用了3个小球)。鼠标与小球之间有一根直线连接,小球被连接时会获得一个朝着鼠标方向的加速度,模拟小球被弹力绳拉拽的效果,当鼠标和小球之间的距离过大的时候,直线会消失,模拟绳子被绷断的效果,同时小球失去加速度,以拉断瞬间的速度继续移动,当距离回到正常范围,则会重新生成直线拉拽小球。

实现过程:
Mover类:我在Mover类里更改了实例化对象时候的函数,可以自定义初始化小球的位置,在update函数里面添加了距离限制,只有小球和鼠标距离在规定范围内时加速度才起作用,在display函数里面添加了鼠标和小球之间的连线显示,在规定距离以内会显示鼠标和小球的连线。

class Mover {
   
  PVector position;
  PVector velocity;
  PVector acceleration;
  // The Mover's maximum speed
  float topspeed;
  
  Mover(float x,float y) {
   
    // Start in the center
    position = new PVector(x,y);
    velocity = new PVector(0,0);
    topspeed = 5;
  }
  
  void update() {
   
    PVector mouse = new PVector(mouseX,mouseY);
    PVector acceleration = PVector.sub(mouse,position);
    acceleration.setMag(0.2);
    if (sq(position.x-mouseX)+sq(position.y-mouseY)<=100000)//当距离在规定范围内时加速度才生效
        velocity.add(acceleration);
    velocity.limit(topspeed);
    position.add(velocity);
  }
  
  void display(float c) {
   
    if (sq(position.x-mouseX)+sq(position.y-mouseY)<=100000)//当距离在规定范围内时才显示连线
        line(position.x,position.y,mouseX,mouseY);
    stroke(0);
    strokeWeight(2);
    fill(c);
    ellipse(position.x,position.y,48,48);
  }
  void checkEdges() {
   
    if (position.x > width) {
   
        position.x = 0;
    } 
    else if (position.x < 0) {
   
        position.x = width;
    }
    if (position.y > height) {
   
        position.y = 0;
    } 
    else if (position.y < 0) {
   
        position.y = height;
    }
  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值