void Map::generate(const unsigned int city_count, const unsigned int width, const unsigned int height, const unsigned int seed) { cities.resize(city_count); std::default_random_engine generator(seed); std::uniform_int_distribution<unsigned int> width_distribution(0, width); std::uniform_int_distribution<unsigned int> height_distribution(0, height); std::uniform_int_distribution<unsigned int> city_distribution(0, city_count - 1); for (size_t c = 0; c < city_count; c++) { cities[c].x = width_distribution(generator); cities[c].y = height_distribution(generator); } start = city_distribution(generator); end = city_distribution(generator); m_adaptor = MapAdaptor(cities); city_tree_t city_tree(2, m_adaptor, nanoflann::KDTreeSingleIndexAdaptorParams(10)); city_tree.buildIndex(); for (size_t c = 0; c < cities.size(); c++) { // Set index of city and generate connections cities[c].index = c; // Do we need this? // Consider 5 closest std::vector<size_t> ret_index(CITY_SEARCH + 1); std::vector<unsigned int>dist_sqr(CITY_SEARCH + 1); city_tree.knnSearch( &cities[c].x, CITY_SEARCH + 1, &ret_index[0], &dist_sqr[0]); for (size_t i = 1; i < ret_index.size(); i++) { // Do we include you or not? // Bernoulli, do your job buddy! std::bernoulli_distribution city_test_distribution(CITY_RATIO); if (city_test_distribution(generator)) { // Update our information cities[c].neighbors.insert( std::make_pair(ret_index[i], std::sqrt(dist_sqr[i]))); cities[ret_index[i]].neighbors.insert( std::make_pair(c, std::sqrt(dist_sqr[i]))); } } } }
sf::Vector2f World::validMovement(const sf::Vector2f& translation, const sf::CircleShape& obstacle) const { auto beginPlayerPos{center(player)}; auto obstaclePos{center(obstacle)}; auto endPlayerPos{center(player) + translation}; auto r = player.getRadius(); auto R = obstacle.getRadius(); auto rR = r + R; auto dist_s = dist_sqr(endPlayerPos, obstaclePos); auto scaling_factor = 1.f; if (dist_s < rR * rR) { scaling_factor = compute_scaling_factor( translation, obstaclePos - beginPlayerPos, r + R); } return translation * scaling_factor; }