diff options
Diffstat (limited to 'voronoi.cc')
-rw-r--r-- | voronoi.cc | 43 |
1 files changed, 19 insertions, 24 deletions
@@ -5,33 +5,24 @@ #include <vector> #include <algorithm> -std::ptrdiff_t minkowski_metric( - const double p, - const std::ptrdiff_t refX, const std::ptrdiff_t refY, - const std::ptrdiff_t x, const std::ptrdiff_t y +double minkowski_metric( + const double p, + const imgen::vector& a, + const imgen::vector& b ) { - return static_cast<std::ptrdiff_t>( - std::nearbyint( - std::pow( - std::pow(std::abs(refX - x), p) + std::pow(std::abs(refY - y), p), - 1.0 / p - ) - ) + return std::pow( + std::pow(std::abs(std::get<0>(a) - std::get<0>(b)), p) + + std::pow(std::abs(std::get<1>(a) - std::get<1>(b)), p), + 1.0 / p ); } -std::ptrdiff_t manhattan_metric( - const std::ptrdiff_t refX, const std::ptrdiff_t refY, - const std::ptrdiff_t x, const std::ptrdiff_t y -) { - return minkowski_metric(1, refX, refY, x, y); +double manhattan_metric(const imgen::vector& a, const imgen::vector& b) { + return minkowski_metric(1, a, b); } -std::ptrdiff_t euclidean_metric( - const std::ptrdiff_t refX, const std::ptrdiff_t refY, - const std::ptrdiff_t x, const std::ptrdiff_t y -) { - return minkowski_metric(2, refX, refY, x, y); +double euclidean_metric(const imgen::vector& a, const imgen::vector& b) { + return minkowski_metric(2, a, b); } void generate_minkowski_voronoi(const double p) { @@ -52,14 +43,18 @@ void generate_minkowski_voronoi(const double p) { 512, 512, [&ref, p](std::ptrdiff_t x, std::ptrdiff_t y) -> imgen::color { - std::array<std::ptrdiff_t, 9> distances; + std::array<double, 9> distances; std::transform( ref.begin(), ref.end(), distances.begin(), [x, y, p](const imgen::colored_vector& pos) { - return minkowski_metric(p, std::get<0>(pos), std::get<1>(pos), x, y); + return minkowski_metric( + p, + imgen::vector{std::get<0>(pos), std::get<1>(pos)}, + imgen::vector{x, y} + ); }); const auto& minimal_distance = std::min_element( @@ -70,7 +65,7 @@ void generate_minkowski_voronoi(const double p) { std::distance(distances.begin(), minimal_distance) ]; - if ( *minimal_distance <= 5 ) { + if ( *minimal_distance <= 5.0 ) { return imgen::black(); } else { return std::get<2>(nearest); |