二维噪声

这里实现一个二维噪声,画面像一个电视没有信号,要想获取彩色图像,可以把color()函数的参数增加,如color(bright,10,10,100)。



void setup(){
size(400,300);


  }

void draw(){

 loadPixels();


for (int i = 0;

i < width;

i++){
 
for (int j = 0;

j < height;

j++){
 float bright = random(255);

  pixels[i+j*width] = color(bright);

 
  }

  }
  updatePixels();


  }

Capture

二维Perlin噪声

这里是一个二维Perlin噪声的例子,画面自行想象。利用这个例子可以生产诸如大理石纹路,迷雾,蓝天白云等等的效果。改变color(bright,10,10,100)的参数可以获取不同的色彩效果。

float increment = 0.02;



void setup(){
size(400,300);

noLoop();


  }

void draw(){
 background(0);


 loadPixels();


float xoff = 0.0;



for (int i = 0;

i < width;

i++){
   xoff += increment;

 float yoff = 0.0;



for (int j = 0;

j < height;

j++){
    yoff += increment;

    //float bright = map(noise(xoff,yoff),0,1,0,255);


float bright = noise(xoff,yoff)*255;

    pixels[i+j*width] = color(bright,10,10,100);

 
 }

  }
 updatePixels();


  }

Capture
 

Capture1

四处碰壁的小球

碰到墙壁就弹开的程序,定义两个速度,分别为x轴和y轴的速度。

float x = 100;


float y = 100;


float xspeed = 1;


float yspeed = 3.3;

int diameter = 20;


void setup(){
size(400,400);

smooth();

background(255);


  }

void draw(){
background(255);


 x = x+xspeed;


 y = y+yspeed;


 if((x >width - diameter/2)||(x <diameter/2)){ xspeed = xspeed * -1;


  } if((y >height - diameter / 2)||(y <diameter / 2)){
  yspeed = yspeed * -1;

 
 }
stroke(0);

 fill(175);

 ellipse(x,y,diameter,diameter);


  }

Capture

碰撞的小球-类文件实现

这里用一个类文件来定义小球的位置和速度。其中的add函数用来实现位置和速度的变化

class PVector{
float x;


float y;


 PVector(float x_,float y_){
 x = x_;

 y = y_;



  }


void add(PVector v){
 y = y + v.y;

 x = x + v.x;

 
   }
  }

引用这个类文件,实现代码的简化。但是如果仅仅是实现这个功能,这个代码起始并没有被简化,但是可以在上面的类文件里实现更多的类似add的函数,比如减法,乘法等等。

PVector location;

PVector speed;

int diameter = 20;


void setup(){
size(400,400);

smooth();

background(255);


 location = new PVector(100,100);

speed = new PVector(3.3,5);


  }

void draw(){
background(255);


 location.add(speed);



 if((location.x > width - diameter/2)||(location.x < diameter/2)){
  speed.x = speed.x * -1;

 
 }


 if((location.y > height - diameter / 2)||(location.y < diameter / 2)){
  speed.y = speed.y * -1;

 
 }
stroke(0);

 fill(175);

 ellipse(location.x,location.y,diameter,diameter);


  }

Capture

向量的减法

在上一篇的类文件中增加一个减法函数——sub

class PVector{
float x;


float y;


 PVector(float x_,float y_){
 x = x_;

 y = y_;



  }


void add(PVector v){
 y = y + v.y;

 x = x + v.x;

  }


void sub(PVector v){
  x = x - v.x;

  y = y - v.y;

 
   }
  }

利用减法函数计算屏幕鼠标位置和中心点的距离并实时显示鼠标位置到中心点的线条。

PVector mouse;

PVector center;



void setup(){
size(400,400);

smooth();


  }

void draw(){
  background(255);

   mouse = new PVector(mouseX,mouseY);

  center = new PVector(width/2,height/2);

  mouse.sub(center);

  translate(width/2, height/2);

  line(0,0, mouse.x,mouse.y);

 
  }

Capture

向量的乘法

在向量的类文件中增加一个乘法函数mult(),利用该函数对向量进行乘法运算。

class PVector{
float x;


float y;


 PVector(float x_,float y_){
 x = x_;

 y = y_;



  }


void add(PVector v){
 y = y + v.y;

 x = x + v.x;

  }


void sub(PVector v){
  x = x - v.x;

  y = y - v.y;

  }


void mult(float n){
  x = x * n;

  y = y * n;

 
   }
  }

注意,起始这里也可以做除法,把”*”换成”/”即可,或者乘以一个小于1 的数,


void div(float n){
x = x / n;

y = y / n;

  }

下面的例子请分别用1.5和0.5演示

PVector mouse;

PVector center;



void setup(){
size(400,400);

smooth();


  }

void draw(){
  background(255);

   mouse = new PVector(mouseX,mouseY);

  center = new PVector(width/2,height/2);

  mouse.sub(center);

  mouse.mult(1.5);

 //mouse.mult(0.5);

translate(width/2, height/2);

  line(0,0, mouse.x,mouse.y);

 
  }

得到的效果是线段比原先长了一半或者短了一半。
Capture