Python: closest coordinate?

前端 未结 2 870
遇见更好的自我
遇见更好的自我 2020-12-07 04:27

I need help with a function that returns coordinate from a list of coordinates, that\'s closest to some point. For example: closest((9, 2), {(0, 0), (10, 0), (10, 10)}

相关标签:
2条回答
  • 2020-12-07 04:30
    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))
    

    is one way you could do it ;)

    a slightly simpler way(given that you have written your dist method)

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

    or even simpler

    def closest(p0,otherPoints):
        return min(otherPoints,key=lambda x:dist(p0,x))
    
    0 讨论(0)
  • 2020-12-07 04:53
    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)})
    

    Output:

    (10, 0)
    

    If my math is not wrong. ;)

    I'm using this formula

    0 讨论(0)
提交回复
热议问题