如何检查2D图形中的所有点的距离,并确保没有一点距离过近?

2024-10-01 02:33:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建并返回一组随机的2元素元组,这些元组表示二维图上的点。我的问题是,我希望每个点之间至少有一定的距离。这应该根据下面函数中minDistance参数的值

我想不出一种方法来穿过一个集合,检查每个点的距离,同时替换距离不够远的点。我怎样才能做到呢

注:图长90点,宽160点

到目前为止,我的职责是:

def makeTiles(num, xBounds, yBounds, minDistance):
"""
Creates and returns a set of points.

:param num: int
    The number of points to be returned.
:param xBounds: tuple of 2 ints
    The first element is the minimum an x-value should be.
    The second element is the maximum an x-value should be.
:param yBounds: tuple of 2 ints
    The first element is the minimum an y-value should be.
    The second element is the maximum an y-value should be.
:param minDistance: int
    The minimum distance that should occur between points.
:return: set of tuples
    The set of points that will be created.
"""
tileSet = set()

for n in range(num):
    x = r.randint(xBounds[0], xBounds[1])
    y = r.randint(yBounds[0], yBounds[1])
    tileSet.add((x, y))

tempSet = tileSet.copy()
distances = set()
for t1 in tempSet:
    for t2 in tileSet:
        distances.add(m.sqrt((t1[0] - t2[0]) ** 2 + (t1[1] - t2[1]) ** 2))
        for d in distances:
            if d < minDistance:

Tags: oftheanparamisvalueelementbe
2条回答

您应该查看Quadtrees,它们允许在这种检查中获得更好的性能。 除此之外,除了检查图形中从每个点到每个其他点的距离之外,没有其他方法

还要确保当你比较点的时候,你不要把一个点和它自己核对

我自己想出了一个算法

对于我想要得到的每一个点,我加上所有必要的点,使一个正方形围绕着这个点。我将这些点和原始点添加到一个临时集,并添加一个新点,同时确保它不在临时集中。然后我只要循环多少次就行了

这不是最快的方法,但它是有效的

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))

相关问题 更多 >