【问题标题】:Calculate closest snap point in angle以角度计算最近的捕捉点
【发布时间】:2021-07-06 19:36:17
【问题描述】:

我有一个功能,我想根据角度的旋转返回要捕捉到的角度。我希望能够更改 snapPoints 数组以提供不同的捕捉点。

角度被限制在 -90 到 90 之间,我将角度加 100 以消除负数;

由于某种原因,它只返回 [-90]

private int ClosestSnapPoint()
{
    int[] snapPoints = {-90, 0, 90};
    float dist = 300f;
    int closestPoint = 0;
        
    foreach(int point in snapPoints){
        float d = (point + 100f) - (angle + 100f);
        if(dist > d){
            dist = d;
            closestPoint = point;
        }       
    }
        
    return closestPoint;
}

示例数据 -

角度 = -50,最近点 = -90

角度 = -10,最近点 = 0

角度 = 10,最近点 = 0

角度 = 50,最近点 = 90

【问题讨论】:

  • 您能否为给定的输入添加一些预期结果?
  • 使用Math.Abs取绝对值,例如Math.Abs(-10) -> 10, Math.Abs(10) -> 10
  • angle来自哪里?

标签: c#


【解决方案1】:

如果我们可以假设 angle 为 -90 angle

private int snap(int angle)
{
    if( angle < -45 ) return -90; // For -90 <= angle < -45
    if( angle < 45 ) return 0;    // For -45 <= angle < 45
    return 90;                    // For 45 <= angle <= 90
}

您可能需要调整“等距”值 -45 和 45。如果您希望它们计数到更高的角度,只需使用 &lt;= 而不是 &lt;

如果您想要一种更通用的方法来将角度捕捉到任意 snapPoints 列表:

// -90 <= angle <= 90 and any x in snaps -90 <= x <= 90
int snap( int angle, int[] snaps )
{
    int result = -90;
    int minDistance = 180;
    for( int i = 0; i < snaps.Length; i++)
    {
        int absoluteDistance = Math.Abs(angle-snaps[i]);
        if(minDistance > absoluteDistance)
        {
            minDistance = absoluteDistance;
            result = snaps[i];
        }
    }
    return result;
}

在行动:https://dotnetfiddle.net/x3B9XJ

但是为了让你的代码工作,最小的改变就是简单地使用

int d = Math.Abs(point - angle); // you actually don't need float

你总是得到 -90 的原因

foreach(int point in snapPoints){
    float d = (point + 100f) - (angle + 100f);
    if(dist > d){
        dist = d;
        closestPoint = point;
    }       
}

是:使用 snapPoints,(point + 100) 可以获得 10、100 和 190。

现在,无论 angle (say, N) ,它总是:10-N

因此,您的“最近点”始终为 -90。

使用您的示例数据:

|角度 |角度+100 | d / snapPoint = -90 | d / snapPoint = 0 | d / snapPoint = 90 | | -50 | 50 | -40 | 50 | 140 | | -10 | 90 | -80 | 10 | 100 | | 10 | 110 | -100 | -10 | 80 | | 50 | 150 | -140 | -50 | 40 |

让我们逐步检查您的angle = 50 代码:

  1. 迭代:d = -140,dist (300) > d == true => dist = -140,closestPoint = -90
  2. 迭代:d = -50, dist (-140) > d == false
  3. 迭代:d = 40,dist (-140) > d == false

结果:最近点 == -90

【讨论】:

  • 这真的很有帮助,谢谢。所以我需要做的就是让 dist = Mathf.Abs(d) 发挥作用。
  • 你不需要浮点数,但是是的,这应该可以解决问题。
猜你喜欢
  • 2013-10-02
  • 2010-12-01
  • 1970-01-01
  • 2020-04-02
  • 2018-12-19
  • 1970-01-01
  • 2019-02-27
  • 2018-11-20
相关资源
最近更新 更多