使用for循环计算最小距离

0 投票
2 回答
1315 浏览
提问于 2025-04-17 22:03

我有很多个点,我想计算这些点到一个参考点(坐标是 (x, y))的距离。请问我该怎么找到这些距离中最小的一个呢?以下是我写的代码:

for k in range(0, 10):
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2)

2 个回答

1

类是你的好帮手。这可能需要多花点功夫,但这样做更好,而且更容易扩展。

class point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __str__(self):
        return '{0}, {1}'.format(self.x, self.y)

    def distanceto(self, other):
        return math.sqrt( (self.x - other.x)**2 + (self.y - other.y)**2)

    def closestpoint(self, pointlist):
        pointinfo = [{'point':x, 'dist':self.distanceto(x)} for x in pointlist]
        pointinfo.sort(key=lambda p: p.dist)
        return pointinfo[0]

与其从文件中读取点并分别保存 XY 的值,不如把它们作为一个点的列表来保存呢?

# all points read from the file.
listofpoints = []
for i in range(0, 10):
    listofpoints.append(point(data.X[i], data.Y[i]))

# the point you'd like to test against.
mytestpoint = point(0,0)

现在你可以直接使用点的成员方法来测试所有点之间的差异了。

closest = mytestpoint.closestpoint(listofpoints)
print 'Closest point is at {0} and is a distance of {1} from {2}'.format(
    closest,
    mytestpoint.distanceto(closest),
    mytestpoint)
1

你是说像这样吗?

min=math.sqrt((x - data.X[0])**2 + (y - data.Y[0])**2)
for k in range(0, 10):
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2)
    if dist<min:
        min=dist

或者:

for k in range(0, 10):
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2)
    try:
        if dist<min:
            min=dist
    except NameError:
        min=dist

撰写回答