顺时针对列表中的2d点进行排序

时间:2014-03-16 09:54:55

标签: c# coordinates

基本上我有一个点列表,每个点都有X,Y,Z(Z总是相同的)。

例如:

pointList.add(Point p = new Point(1, 2, 3));

但是我无法将它们按顺时针顺序排序。

我知道中心,我知道每个列表中大约有600个点。

我以前用Python完成了这项工作,但我在C#中遇到了麻烦。

Python代码:

pointlist.sort(key=lambda c:atan2(c[0], c[1]))

3 个答案:

答案 0 :(得分:5)

不确定这是否能满足您的需求。

points = points.OrderBy(x => Math.Atan2(x.X, x.Y)).ToList();

没有非常优化或任何东西,只是查看你的python代码,并认为这将完成相同的。

注意:您可能需要using System.Linq,除非您已经拥有它。

编辑: Sturm指出,可能需要撤销订单才能让他们按顺时针方向进行。 实现此目的的一种方法是使用OrderByDescending代替OrderBy

答案 1 :(得分:0)

对于那些努力如何在(XX, YY)周围进行排序的人,不仅需要(0,0),还需要对代码进行一些修改。

points.OrderBy(x => Math.Atan2(x.X - XX, x.Y - YY)).ToList();

答案 2 :(得分:0)

如果有人正在寻找用于对2D点进行排序的完整代码,而python中的中心点则是

import numpy as np
import math

def carttopolar(x,y,x0=0,y0=0):
    '''
    cartisian to polar coordinate system with origin shift to x0,y0
    '''
    x1=x-x0
    y1=y-y0
    #print('(x0,y0)sort',x0,y0)
    r = np.sqrt(x1**2+y1**2)
    t = np.arctan2(y1,x1)*180/math.pi
    if y1<0:
        t=360+t
    #print('x,y,r,t',x,y,r,t)
    return r,t

def sort_aniclkwise(xy_list,x0=None,y0=None):
    '''
    Sort points anit clockwise with x0 y0 as origin
    '''
    if x0 is None and y0 is None:
        (x0,y0)=np.mean(xy_list,axis=0).tolist()
    elif x0 is None:
        (x0,_)=np.mean(xy_list,axis=0).tolist()
    elif y0 is None:
        (_,y0)=np.mean(xy_list,axis=0).tolist()
    print('origin used:',[x0,y0])  

    for i in range(len(xy_list)): 
          xy_list[i].append(i) 

    xy_list1 = sorted(xy_list, key=lambda a_entry: carttopolar(a_entry[0], a_entry[1],x0,y0)[1])

    sort_index = []  
    for x in xy_list1: 
          sort_index.append(x[2])
          del x[2]


    return xy_list1, sort_index

if __name__ == '__main__':

    #xy_list=[[1,1], [1,-1], [-1,1], [-1,-1]]
    xy_list=[[1,2], [1,0], [-1,2], [-1,0]]
    print ('xy_list',xy_list) 


    xy_list1,sort_index=sort_aniclkwise(xy_list)
    print ('xy_list',xy_list) 
    print ('sort_index',sort_index)   

    '''  
    x,y = 1,0.00001
    r,t=carttopolar(x,y,x0=0,y0=0)
    print(r)
    print(t)

    a = ([[1,1], [1,-1], [-1,1], [-1,-1]])
    print (a) 
    a = sorted(a, key=lambda a_entry: carttopolar(a_entry[0], a_entry[1])) 
    print (a)
    '''