GoLWorld random_setup(size_t max_x, size_t max_y, size_t GoLWorld_x, size_t GoLWorld_y, size_t number, bool wrap) { if(GoLWorld_x< max_x) throw std::invalid_argument("GoLWorld width too small"); if(GoLWorld_y< max_y) throw std::invalid_argument("GoLWorld height too small"); GoLWorld GoLWorld(GoLWorld_x, GoLWorld_y, wrap); std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis_x(1, max_x-1); std::uniform_int_distribution<> dis_y(1, max_y-1); //TODO - surely there's a quicker way? //Like std::shuffle on a vector and send it in for (size_t n=0; n<number; ++n) { try { GoLWorld.Spark(dis_x(gen), dis_y(gen)); } catch(...)//TODO Please! { } } return GoLWorld; }
void HemisphereSampling::getRandom( //in int kernelSize, bool allPointsOnEmishphereSurface, bool distanceFalloff, //out std::vector<glm::vec3>& kernel ) { std::random_device rd; std::mt19937 gen(rd()); std::uniform_real_distribution<> dis_y(0, 1); std::uniform_real_distribution<> dis_xz(-1, 1); for (int i = 0; i < kernelSize; ++i) { //kernel[i] = glm::vec3( dis_xy(gen), dis_xy(gen), dis_z(gen) ); kernel.push_back( glm::vec3( dis_xz(gen), dis_y(gen), dis_xz(gen) )); kernel[i] = glm::normalize(kernel[i]); if (!allPointsOnEmishphereSurface) { if (distanceFalloff) { float scale = static_cast<float>(i) / static_cast<float>(kernelSize); // return v0+(v1-v0)*t; scale = 0.1f + (1.0f - 0.1) * (scale*scale); //sml::lerp(0.1f, 1.0f, scale * scale); kernel[i] *= scale; } else { kernel[i] *= dis_y(gen); } } printf( "%03.3f %03.3f %03.3f \n", kernel[i].x, kernel[i].y, kernel[i].z); } }