libcruft-util/tools/poisson.cpp

44 lines
1.5 KiB
C++
Raw Normal View History

#include <cruft/util/cmdopt.hpp>
#include <cruft/util/functor.hpp>
#include <cruft/util/geom/aabb.hpp>
#include <cruft/util/geom/sample/surface.hpp>
#include <cruft/util/rand/generic.hpp>
2018-04-19 13:49:55 +10:00
#include <cstdlib>
#include <iostream>
#include <random>
2018-04-19 13:49:55 +10:00
///////////////////////////////////////////////////////////////////////////////
int
main (int argc, char **argv)
{
cruft::extent2f area {256, 256};
2018-04-19 13:49:55 +10:00
float distance = 5.f;
int samples = 15;
cruft::cmdopt::parser opts;
opts.add<cruft::cmdopt::option::value<float>> ('w', "width", "width of the space to fill", area.w);
opts.add<cruft::cmdopt::option::value<float>> ('h', "height", "height of the space to fill", area.h);
opts.add<cruft::cmdopt::option::value<float>> ('d', "distance", "minimum distance between samples", distance);
opts.add<cruft::cmdopt::option::value<int>> ('s', "samples", "number of samples per iteration", samples);
2018-04-19 13:49:55 +10:00
opts.scan (argc, argv);
2020-08-18 07:20:26 +10:00
auto gen = cruft::random::initialise<cruft::rand::general_generator> ();
2018-04-19 13:49:55 +10:00
std::cout << "<svg height='" << area.h << "' width='" << area.h << "'>";
namespace sample = cruft::geom::sample;
for (auto const &p: sample::poisson (sample::surface {area},
2020-08-18 07:20:26 +10:00
gen,
cruft::functor::constant (distance),
samples))
{
2018-04-19 13:49:55 +10:00
std::cout << "<circle cx='" << p.x << "' cy='" << p.y << "' r='1' />";
}
std::cout << "</svg>\n";
2018-04-19 13:49:55 +10:00
return EXIT_SUCCESS;
}