Я сам придумал алгоритм.
Для каждой точки, которую я хочу получить, я добавляю все точки, необходимые для создания квадрата вокруг этой точки. Я добавляю эти точки и исходную точку к временному набору и добавляю новую точку, следя за тем, чтобы ее не было во временном наборе. Тогда я просто повторяю цикл столько раз, сколько мне нужно.
Это не самый быстрый способ сделать это, но он работает.
def makeTiles():
"""
Creates and returns a set of points.
Preconditions:
There is enough space within the area defined by xBounds and yBounds.
Algorithm:
1 Create a random point.
2 Add the point to tileSet and distanceSet.
3 Add all points within minDistance to distanceSet.
4 Create another random point.
5 while this point is in distanceSet.
6 Change the location of the point.
7 Add the point to tileSet and distanceSet.
8 Add all points within minDistance to distanceSet.
9 Continue looping from line 4 for num amount of times.
:return: set of tuples
The set of points that will be created.
"""
tileSet = set()
distanceSet = set()
x = r.randint(KEEP_X[0], KEEP_X[1])
y = r.randint(KEEP_Y[0], KEEP_Y[1])
tileSet.add((x, y))
for t in tileSet:
distanceSet.add((t[0], t[1]))
for m1 in range(1, KEEP_DIST):
for m2 in range(1, KEEP_DIST):
distanceSet.add((x + m2, y + m1))
distanceSet.add((x - m2, y - m1))
distanceSet.add((x + m2, y - m1))
distanceSet.add((x - m2, y + m1))
distanceSet.add((x, y + m1))
distanceSet.add((x, y - m1))
distanceSet.add((x - m2, y))
distanceSet.add((x + m2, y))
for n in range(KEEP_NUM):
x = r.randint(KEEP_X[0], KEEP_X[1])
y = r.randint(KEEP_Y[0], KEEP_Y[1])
while (x, y) in distanceSet:
x = r.randint(KEEP_X[0], KEEP_X[1])
y = r.randint(KEEP_Y[0], KEEP_Y[1])
print("(x, y)", (x, y))
tileSet.add((x, y))
distanceSet.add((x, y))
for m1 in range(1, KEEP_DIST):
for m2 in range(1, KEEP_DIST):
distanceSet.add((x + m2, y + m1))
distanceSet.add((x - m2, y - m1))
distanceSet.add((x + m2, y - m1))
distanceSet.add((x - m2, y + m1))
distanceSet.add((x, y + m1))
distanceSet.add((x, y - m1))
distanceSet.add((x - m2, y))
distanceSet.add((x + m2, y))