コード例 #1
0
bool SimpleDynamics::evolve(SECONDS dt) {
  if(!is_mobile) return false;
  for(int i=0;i<bodies.max_id();i++) {
    Body* b = (Body*)bodies.get(i);
    if(b) { 
      // device moves itself
      Vek dp(b->velocity());
      flo len = vek_dot(&dp,&dp);
      if(act_err) {
        dp.x += len*act_err*urnd(-0.5,0.5); 
        dp.y += len*act_err*urnd(-0.5,0.5); 
        dp.z += len*act_err*urnd(-0.5,0.5);
      }
      if (len > speed_lim*speed_lim) vek_mul(&dp,speed_lim/sqrt(len)); // limit velocity
      vek_mul(&dp,dt);
      // device is moved by walls
      ((SimpleBody*)b)->wall_touch = false;
      if (is_walls) {
	for (int j=0; j<N_WALLS; j++) {
	  Vek vec(b->position());
	  vek_sub(&vec, &walls[j]);
	  flo d = vek_dot(&vec, wall_normals[j]);
	  if (d < 0.0) {
	    vek_cpy(&vec, wall_normals[j]);
	    vek_mul(&vec, -d * K_BOUND * dt);
	    vek_add(&dp, &vec);
            ((SimpleBody*)b)->wall_touch = true;
	  }
	}
      }
      // adjust the position
      Vek pos(b->position());
      b->moved = (dp.x||dp.y||dp.z);
      vek_add(&pos,&dp);
      if(parent->volume->dimensions()==2) { pos.z=0; }
      // Hard floor at z=0: if the calculated pos has z < 0, reset to 0
      else if(is_hard_floor && pos.z<0) { pos.z=0; b->moved=true; }
      b->set_position(pos.x,pos.y,pos.z);
    }
  }
  return true;
}
コード例 #2
0
ファイル: radio.cpp プロジェクト: chazmatazz/proto-mirror
bool RadioSim::try_rx() {
  return rx_error==0 || urnd(0,1) > rx_error;
}
コード例 #3
0
ファイル: mem_fuzz.c プロジェクト: AmesianX/unicorn
uint64_t get_len(){
  uint64_t len = (urnd() % (4096*5))+1;
  return len;
}
コード例 #4
0
ファイル: radio.cpp プロジェクト: chazmatazz/proto-mirror
bool RadioSim::try_tx() {
  return tx_error==0 || urnd(0,1) > tx_error;
}
コード例 #5
0
ファイル: mem_fuzz.c プロジェクト: AmesianX/unicorn
uint64_t get_addr(){
  uint64_t base = ((uint64_t)urnd())%4;
  uint64_t addr= baseranges[base] + urnd()%(4096*10);
  return addr;
}