Python:最近坐标?

时间:2014-12-09 22:50:15

标签: python

我需要一个函数的帮助,该函数从坐标列表返回坐标,这些坐标最接近某个点。例如:closest((9, 2), {(0, 0), (10, 0), (10, 10)}) returns (10, 0)

2 个答案:

答案 0 :(得分:3)

class Point:
    def __init__(self,x,y):
        self.x = x
        self.y = y
    def closest(self,*points):           
        return min(points,key=lambda x:abs(x-self))
    def __sub__(self,other):
        return Point((self.x-other.x) , (self.y - other.y))
    def __pow__(self,powTo):
        return Point(self.x**powTo,self.y**powTo) 
    def __iter__(self):
        yield self.x
        yield self.y
    def __abs__(self):
        return sum(self**2)**0.5
    def __str__(self):
        return "(%s,%s)"%(self.x,self.y)

pt0 = Point(9,2)
print pt0.closest(Point(0,0),Point(10,0),Point(10,10))

是你可以做到的一种方式;)

一种稍微简单的方法(假设你已经编写了你的​​dist方法)

def closest(p0,otherPoints):
    def distTo(p):
        def _inner(other):
            return dist(p,other)
        return inner
    return min(otherPoints,key=distTo(p0))

甚至更简单

def closest(p0,otherPoints):
    return min(otherPoints,key=lambda x:dist(p0,x))

答案 1 :(得分:0)

from math import sqrt

def euqli_dist(p, q, squared=False):
    # Calculates the euclidean distance, the "ordinary" distance between two
    # points
    # 
    # The standard Euclidean distance can be squared in order to place
    # progressively greater weight on objects that are farther apart. This
    # frequently used in optimization problems in which distances only have
    # to be compared.
    if squared:
        return ((p[0] - q[0]) ** 2) + ((p[1] - q[1]) ** 2)
    else:
        return sqrt(((p[0] - q[0]) ** 2) + ((p[1] - q[1]) ** 2))

def closest(cur_pos, positions):
    low_dist = float('inf')
    closest_pos = None
    for pos in positions:
        dist = euqli_dist(cur_pos,pos)
        if dist < low_dist:
            low_dist = dist
            closest_pos = pos
    return closest_pos

print closest((9, 2), {(0, 0), (10, 0), (10, 10)})

输出:

(10, 0)

如果我的数学没有错。 ;)

我正在使用this formula