这是一个简单的方形代码,例如:
def generateSquare(min, max, size):
data = []
for i in range(size):
x = randint(min, max)
y = randint(min, max)
data += [[x, y]]
return data
答案 0 :(得分:2)
首先,不要将坐标存储在矢量中,最好使用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}));
请注意,这会生成随机点,因此您无法保证最终得到方形,三角形等。如果您想生成一个can,您可以使用非均匀分布(如果您知道什么分配您的坐标跟随)生成您的数字,或使用拒绝抽样来丢弃不在您想要的区域内的点。
生成一个三角形归结为绘制三个随机点。
要生成正方形,您可以绘制两个点,对应于正方形的两个对角。
依此类推......我不认为有一种适用于任何形状的“通用”解决方案。
答案 1 :(得分:1)
作为Luc Touraille的帖子的补充。
对于一个正方形找到两个随机点,让这两个点成为正方形的两个最远角。
对于一个三角形,找到三个随机点,让这三个点为三角形。
对于圆圈,找一个随机点作为圆心和另一个随机点,并让两者之间的距离为圆的半径。
更通用的方法可以是找到图的中心点,并通过进一步随机生成的数字来找到参数(比例,旋转等)。 (我想有点像鲁克建议的那样)。
答案 2 :(得分:0)
你的问题没有明确说明。
没有“圆形分布”或“三角分布”这样的东西。
你可能意味着:一个圆形,矩形,三角形的均匀分布。 甚至没有唯一指定的三角形......
关键点是制服。
E.g。 2D中的标准正态分布可能看起来有些圆形,但它并不完全是圆形。
没有随机发生器直接产生密度均匀的圆;至少不是我所知道的。最常见的方法是生成一个正方形,并拒绝那些您不想拥有的点。
E.g。在[0:1] x [0:1]上生成(x,y)对,并拒绝距离为.5,.5大于.5的那些 - 然后你得到圆圈。
如果您 - 正如其他用户建议的那样 - 生成半径和距离,则生成的点将不会均匀分布在圆上。