<p>我自己想出了一个算法</p>
<p>对于我想要得到的每一个点,我加上所有必要的点,使一个正方形围绕着这个点。我将这些点和原始点添加到一个临时集,并添加一个新点,同时确保它不在临时集中。然后我只要循环多少次就行了</p>
<p>这不是最快的方法,但它是有效的</p>
<pre><code>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))
</code></pre>