基本上我有一个点列表,每个点都有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]))
答案 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)
'''