首先,与其将坐标存储在向量中,不如使用std::pair
自定义类:
struct Point
{
int x;
int y;
};
那么你只需要有一种生成随机点的方法,比如
Point randomPoint(Point const & min, Point const & max)
{
static std::mt19937 gen;
std::uniform_int_distribution<> distribX(min.x, max.x);
std::uniform_int_distribution<> distribY(min.y, max.y);
return Point{distribX(gen), distribY(gen)};
}
然后你可以使用这个生成函数来填充你的向量,例如generate_n
:
unsigned int const nbPoints = 100;
std::vector<Point> points;
std::generate_n(back_inserter(points), nbPoints,
std::bind(randomPoint, Point{0, 0}, Point{1000, 1000}));
请注意,这将生成随机点,因此不能保证最终得到正方形、三角形等。如果您想生成一个罐头,您可以使用非均匀分布(如果您知道坐标的分布跟随)生成您的数字,或使用拒绝抽样来丢弃不在您想要的区域内的点。
生成一个三角形归结为绘制三个随机点。
要生成一个正方形,您可以绘制两个点,对应于正方形的两个对角。
等等......我认为没有适用于任何形状的“通用”解决方案。