Add voronoi map generator
This commit is contained in:
parent
39765c9d26
commit
519adcae3a
2 changed files with 75 additions and 0 deletions
29
libs/pcg/include/psemek/pcg/voronoi.hpp
Normal file
29
libs/pcg/include/psemek/pcg/voronoi.hpp
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#pragma once
|
||||
|
||||
#include <psemek/geom/point.hpp>
|
||||
#include <psemek/pcg/seamless.hpp>
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace psemek::pcg
|
||||
{
|
||||
|
||||
struct voronoi
|
||||
{
|
||||
voronoi(std::vector<geom::point<float, 2>> points);
|
||||
voronoi(std::vector<geom::point<float, 2>> points, seamless_tag);
|
||||
|
||||
struct result_type
|
||||
{
|
||||
std::size_t index;
|
||||
float distance;
|
||||
};
|
||||
|
||||
result_type operator()(float x, float y) const;
|
||||
|
||||
private:
|
||||
std::vector<geom::point<float, 2>> points_;
|
||||
bool seamless_ = false;
|
||||
};
|
||||
|
||||
}
|
||||
46
libs/pcg/source/voronoi.cpp
Normal file
46
libs/pcg/source/voronoi.cpp
Normal file
|
|
@ -0,0 +1,46 @@
|
|||
#include <psemek/pcg/voronoi.hpp>
|
||||
|
||||
namespace psemek::pcg
|
||||
{
|
||||
|
||||
voronoi::voronoi(std::vector<geom::point<float, 2>> points)
|
||||
: points_(std::move(points))
|
||||
, seamless_{false}
|
||||
{}
|
||||
|
||||
voronoi::voronoi(std::vector<geom::point<float, 2>> points, seamless_tag)
|
||||
: points_(std::move(points))
|
||||
, seamless_{true}
|
||||
{}
|
||||
|
||||
voronoi::result_type voronoi::operator()(float x, float y) const
|
||||
{
|
||||
float v = std::numeric_limits<float>::infinity();
|
||||
std::size_t index = 0;
|
||||
|
||||
for (std::size_t i = 0; i < points_.size(); ++i)
|
||||
{
|
||||
auto const & p = points_[i];
|
||||
|
||||
float dx = std::abs(p[0] - x);
|
||||
float dy = std::abs(p[1] - y);
|
||||
|
||||
if (seamless_)
|
||||
{
|
||||
dx = std::min(dx, 1.f - dx);
|
||||
dy = std::min(dy, 1.f - dy);
|
||||
}
|
||||
|
||||
float const d = std::sqrt(dx * dx + dy * dy);
|
||||
|
||||
if (d < v)
|
||||
{
|
||||
v = d;
|
||||
index = i;
|
||||
}
|
||||
}
|
||||
|
||||
return {index, v};
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue