2016-05-22 14 views
-2

私は約40点の2D点(xとy)のリストを持っています。リストから最初のポイント(たとえば180,0)から始まり、その最初のポイント(180、0)までリストから最も近いポイントを見つけるスクリプトが必要です。一番近い点が見つかると、すでに使用されている点(180、0)を使用せずに、同じことを再度実行する必要があります(最も近い点が最初の点になります)。そして、すべての点が使用されるまでこれを行います。このように、私のランダムなリストは、流暢なラインパスになる点のリストに順序づけられるべきです。特定の2D点から2D点のリストまでの最も近い点Python

enter image description here

そして、これは、それがどのように見えるかです::

enter image description here

def arrange_points(points): 
    # arranges all 2D points in a fluent and consistent linepath order 
    size = len(points) #number of elements in list 
    di = [] #list containing all distances from start point 
    start_point = points[0] 

    for i in range (size): 
     next_points = points[i] 

     dist = math.sqrt((next_points[0] - start_point[0])**2 + (next_points[1] - start_point[1])**2) #distance of start point to all other points 
     di.append(dist) 

     ln = min(filter(None, di)) # smallest distance from start point, except 0 
     f = di.index(ln) # finds place of ln in list di 
     next_point = points[f] # retrieves corresponding point from points, that corresponds to ln 
    return di 
    return next_point 

di = arrange_points(points) 

# 0 and previous points cannot be taken 

これは私linepathが今のように見えるものです:私のコードは、これまでのところ、このようになります。

プロットされた点は次のようになります:(間違った順序)基本的に180,0で始まり、コードを取り戻すには)正しい順序でリストを作成する必要があります。 enter image description here

私のコードで私を助けることができる人は誰ですか?

+0

のための円弧は何ですか?あなたは "最も近い点"を求めているが、通常はそれに続く弧では見つからないと言っている。そして、残りのリストの中の最も近いポイント*を現在のポイントにしたいと思いますか? –

+0

@RoryDaultonはい、リストの残りの部分で、現在の点(開始点)に最も近い点です。円弧および線分は、基本的に2dポイント(例えば、円弧または線分あたり10ポイント)に分割されるので、ポイントを接続すると、下の画像の表現がより鮮明ではなくなります。私が持っている問題は、順序が正しくないということです。私が180,0で始まり、最も近い点に従うとうまくいくはずです。リスト内のすべてのポイントについて投稿した画像を参照してください。 – Henry

答えて

1

IIUC、あなたが何かを行うことができます:

def get_nearest(points, coord): 
    """Return closest point to coord from points""" 
    dists = [(pow(point[0] - coord[0], 2) + pow(point[1] - coord[1], 2), point) 
       for point in points]    # list of (dist, point) tuples 
    nearest = min(dists) 
    return nearest[1] # return point only 

next_point = points.pop(0) # get first point 
line_path = [] 
line_path.append(next_point) 

while len(points) > 1: 
    next_point = get_nearest(points, next_point) 
    line_path.append(next_point) 
    points.remove(next_point) 

line_path.extend(points) # add last point 
関連する問題