你所做的两个尝试是按照到中心的距离和角位置排序点,但它们都不会构建螺旋。
这是伪代码的算法应该更spiraly生产的东西:
point = farthest_from_center(points)
result = [point]
points.remove(point)
//choose a previous point so that previous_point->point is perpendicular to point->center
previous = {x: point.x-point.y+center.y , y: point.x+point.y-center.x}
while(points is not empty){
next=least_angled_point(previous,point,points) //see below for details
result.push(next)
points.remove(next)
previous=point
point=next
}
return result
我们希望在每一次迭代从我们目前正在经营的方向最小偏差的点来选择。当从离中心最远的点开始并且垂直方向时,这应该产生螺旋。
选择least_angled_point可以通过计算矢量previous-> point和point-> next之间的点积来计算点中所有可能的下一个点,然后选择最高值(点乘积给出点之间的角度的余弦值)矢量,较高的余弦对应较低的角度)。 这点积可由下式计算:
function dot_product(previous,point,next){
return (point.x-previous.x)*(next.x-point.x)+(point.y-previous.y)*(next.y-point.y)
该算法将有N^2的复杂点的数量,因为它需要计算所有其余点从每个点的点积连接,但如果你不需要在成千上万的点上工作,它应该没问题。
我还没有实施和测试它,所以如果你这样做,并发现任何错误让我知道,我会尽力帮助!
来源
2016-11-24 09:48:06
Leo
你能指定点的列表在哪里吗?我找不到它。 –
points = generatePoints()部分生成x,y点列表并将它们放入点var中。 generatePoints是示例的底部,它是一个简单的随机,以窗口的中心为质心 –