如何以起始角度对点进行放射状排序?

问题描述 投票:0回答:1

给定一个点列表,如何以定义的起始角度围绕中心位置对它们进行径向排序?当我第一次开始解决这个问题时,我查阅了这篇文章并尝试了跨产品解决方案:

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)。它应该具有完全相同的功能。

c# sorting geometry trigonometry
1个回答
0
投票

仍然可以通过遵循一对附加规则来使用叉积和任意起始向量执行排序:

  • 如果AB在起始向量的同一侧,则根据A x B
  • 的符号对它们进行排序
  • 如果 AB 位于相对侧,则无论 A x B 为何,向量的 顺时针
  • 侧的向量优先

[要遵循的示例代码]

© www.soinside.com 2019 - 2024. All rights reserved.