给定一个点列表,如何以定义的起始角度围绕中心位置对它们进行径向排序?当我第一次开始解决这个问题时,我查阅了这篇文章并尝试了跨产品解决方案:
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# 与处理中的 Java)。它应该具有完全相同的功能。
仍然可以通过遵循一对附加规则来使用叉积和任意起始向量执行排序:
[要遵循的示例代码]