互动媒体技术-代码本色-第0章

随机游走

1. 随机游走

简介:随机游走是一个最简单的运动模拟模型,是由一系列随机步骤构成的运动轨迹。
processing如何实现一个随机游走模型:
(1)建立一个随机游走类
随机游走类对象有以下特点:维持自身数据,比如位置;执行某些行为:绘制自身或者随机移动。
(2)定义随机游动行为
对象随机移动的可能情况:上、下、左、右
随机数产生:random()函数产生随机数,根据随机数的大小随机决定运动大小。
在这里插入图片描述
(3)一个简单的随机游走
通过以下三个步骤,则可以产生一个起点在屏幕中心的随机游走。
定义随机游走类,声明随机游走对象。

class Walker {
  int x,y;
  Walker() {
    x = width/2;
    y = height/2;
  }
}

随机游走行为

    int choice = int(random(4));
    if (choice == 0) {
      x++;
    } else if (choice == 1) {
      x--;
    } else if (choice == 2) {
      y++;
    } else {
      y--;
    }
    x = constrain(x,0,width-1);
    y = constrain(y,0,height-1);

显示

  void render() {
    stroke(0);
    point(x,y);
  }

2. 概率和非均匀分布

(1)利用随机数判断概率的两种方式:
在数组中存放一组存好的数字,然后从数组中随机选择数值,数组中数值的分布决定了概率。
产生一个0-1的浮点随机数,判断随机数落在那个区间决定概率。
(2)随机游走和概率分布结合
例如:如下所示的随机游走有40%可能向右移动,这是采用了上述第二个方法,落在0-0.4区间的随机数将导致随机游走对象向右移动。

    float r = random(1);
    if (r < 0.4) {    
      x++;
    } else if (r < 0.6) {
      x--;
    } else if (r < 0.8) {
      y++;
    } else {
      y--;
    }

(3)正态分布
正态分布特征:所有观察值都聚集在平均值附近。
在这里插入图片描述
产生正态分布:nextGaussian()函数默认以下面两个参数生成符合正态分布的随机数:平均值等于0,标准差等于1。如果我们需要一个平均值为320(宽度为640的窗口的正中位置),标准差为60像素的正态分布,可以简单地处理参数:将它乘以标准差并加上平均值。

3. 拓展与应用

(1)正态分布生成草坪上花朵分布的位置,随机数决定花朵的形态,使得花朵集中在中间位置。

  NormaldistributionFlower(){ 
    //产生正太分布数据
    for(int i=0;i<mark.length;i++)
    {
       float xloc = randomGaussian();
       float sd = 200;               // 标准差
       float mean = width/2;         // 均值
       xloc = ( xloc * sd ) + mean;  // 用标准差和平均值调整高斯随机数
       mark[i]=int(xloc);   
    }
    getFlower();
    //生成随机数
    for(int i=0;i<mark.length;i++)
    {
      int j=int(random(flower.length));
      type[i]=j;
    }
  }

(2)随机游走的使用:趋势朝向鼠标位置的随机游走,将此应用于蜜蜂。判断鼠标位置与蜜蜂位置x,y的差距,将大概率趋势作为朝向鼠标垫运动。

 // 趋势朝向鼠标的随机游走
 void step() {
    int deltax=mouseX-int(position.x);
    int deltay=mouseY-int(position.y);
    float r = random(1);
    // A 40% of moving to the mouse
    if (r < 0.4)
    {   
      if(deltax>0)
        position.x+=steplength;
      else
        position.x-=steplength;       
    } 
    else if (r < 0.5) 
    {
      if(deltax>0)
        position.x-=steplength;
      else
        position.x+=steplength;   
    }
    else if (r < 0.9)
    {
      
      if(deltay>0)
        position.y+=steplength;
      else
        position.y-=steplength;    
    } 
    else
    {
      if(deltay>0)
        position.y-=steplength;
      else
        position.y+=steplength;  
    }
  
    position.x = constrain(position.x,0,width-1);
    position.y = constrain(position.y,0,height-1);
  }

4. 效果

实现在分布花朵的草坪上随机游走的蜜蜂,蜜蜂趋势朝向鼠标位置。可以看到花朵的位置分布主要集中在设置的平均值附近,蜜蜂在做随机游走运动,但趋势朝向鼠标。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值