Пример #1
0
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])));
			}
		}
	}
}
Пример #2
0
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;
}