如何按指定起始角度对围绕中心点的点进行径向排序?
围绕中心点按指定起始角度径向排序点
我需要实现一组点围绕中心点按指定起始角度的径向排序,最初尝试了叉积方案:
public static void RadialCrossSort(Vector3 centerPoint, ref List<Vector3> vertices) { vertices.Sort(delegate (Vector3 a, Vector3 b) { Vector3 aDifference = a - centerPoint; Vector3 bDifference = b - centerPoint; float comparison = bDifference.x * aDifference.y - aDifference.x * bDifference.y; return (int)Mathf.Sign(comparison); }); }
这个算法存在两个问题:无法自定义起始角度,且排序后部分点顺序混乱、出现重叠:

于是改用三角函数方案,该方案能实现正常排序:
public static float GetAngle(Vector3 centerPoint, Vector3 point) { Vector3 pointFromOrigin = point - centerPoint; float angle = Mathf.Atan2(pointFromOrigin.y, pointFromOrigin.x) + Mathf.PI; return angle; } public static void RadialTrigSort(Vector3 centerPoint, ref List<Vector3> vertices) { vertices.Sort(delegate (Vector3 a, Vector3 b) { float angleA = GetAngle(centerPoint, a); float angleB = GetAngle(centerPoint, b); return (int)Mathf.Sign(angleA - angleB); }); }
排序后的结果符合预期:

但我三角函数基础薄弱,不知道如何修改代码来调整排序的起始角度,恳请提供帮助。
注:上述代码为优化版本,与生成示意图的代码(Unity C# vs Processing Java)不完全相同,但功能完全一致。
内容的提问来源于stack exchange,提问作者Harper Rhett
相关产品推荐
相关产品推荐

