给定一个x,y点数组,如何按顺时针顺序(围绕它们的整体平均中心点)对该数组的点进行排序?我的目标是将点传递给线创建函数,以最终看起来相当"坚实"的东西,尽可能凸起,没有相交的线.
为了它的价值,我正在使用Lua,但任何伪代码都会受到赞赏.非常感谢您的帮助!
更新:作为参考,这是基于Ciamej优秀答案的Lua代码(忽略我的"app"前缀):
function appSortPointsClockwise(points)
local centerPoint = appGetCenterPointOfPoints(points)
app.pointsCenterPoint = centerPoint
table.sort(points, appGetIsLess)
return points
end
function appGetIsLess(a, b)
local center = app.pointsCenterPoint
if a.x >= 0 and b.x < 0 then return true
elseif a.x == 0 and b.x == 0 then return a.y > b.y
end
local det = (a.x - center.x) * (b.y - center.y) - (b.x - center.x) * (a.y - center.y)
if det < 0 then return true
elseif det > 0 then …Run Code Online (Sandbox Code Playgroud) 我有一个3D点和一个中心的列表,我想围绕一个给定的法向矢量按(逆时针)顺序对它们进行排序。这些点不是共面的,但是它们和中心绑定到球体的表面,并且它们勾勒出多边形。法线向量是从球心到分类中心的向量。我尝试了此比较功能,但是当两点?/2之间的距离大于彼此时,它就会失败。
如何获得任意点的实际3D(逆时针)排序?
这不是按顺时针方向对球体表面上的3D点进行排序的重复,因为此问题专门用于解决角度比较中缺少传递性的问题。
这不是将3d共面点列表按顺时针或逆时针排序的重复,因为该问题更多地是关于确定一个点是否与另一个点更接近顺时针或逆时针,尽管这是一个比较关系,但它不会给出定义明确的总排序。