将角度固定到方向

时间:2015-08-12 05:18:05

标签: c# xna angle

我想修一个角度。

问题 - 视频:https://youtu.be/5LGbYguG4P0

例如:

我有角度90,我想要修正45度(因此它不能低于/超过(90 - 45)或(90 + 45)。

在过去的几个小时里,我尝试了多种方法,就像搜索出互联网一样。

有些人主要是因为内置的角度包裹而错误地“包裹”(我认为它的包裹是-Pi到Pi),所以当它到达-Pi或Pi时,超过它,它会包裹,并向相反的角度跳了一大步。

尝试(S):

[Authenticate]
public JsonResult GetParentMenus()
{
    using (MealPlannerAuthorizationEntities repository = new MealPlannerAuthorizationEntities())
    {
        var parentMenus = repository.MP_AUTH_Menus.Where(x => x.IsButton == false && x.IsListButton == false).Select(c => new { DisplayText = c.MenuName, Value = c.MenuId }).OrderBy(x => x.DisplayText).ToList();
        return Json(new { Result = "OK", Options = parentMenus }, JsonRequestBehavior.AllowGet);
    }
}

说明:

    public static float AngleBound(float Angle, float BoundAngle, ushort Degrees)
    {
        float A = MathHelper.ToDegrees(Angle), BA = MathHelper.ToDegrees(BoundAngle), DMin = (BA - Degrees), DMax = (BA + Degrees);
        return MathHelper.ToRadians(MathHelper.Max(DMin, MathHelper.Min(DMax, A)));
    }

    public static float AngleBound(float Angle, float BoundAngle, ushort Degrees)
    {
        return MathHelper.ToRadians((float)Wrap((MathHelper.ToDegrees(Angle) + 180), ((MathHelper.ToDegrees(BoundAngle) + 180) + (Degrees / 2f)), ((MathHelper.ToDegrees(BoundAngle) + 180) - (Degrees / 2f))));
    }

    public static float AngleBound(float Angle, float BoundAngle, ushort Degrees)
    {
        return MathHelper.ToRadians((float)Wrap(MathHelper.ToDegrees(Angle), (MathHelper.ToDegrees(BoundAngle) + (Degrees * 1)), (MathHelper.ToDegrees(BoundAngle) - (Degrees * 1))));
    }

2 个答案:

答案 0 :(得分:0)

public static float AngleBound (float Angle, float BoundAngle, ushort Degrees)
{
    var RadDegrees = Degrees * Math.PI / 180;
    var MinBound = BoundAngle - RadDegrees; 
    var MaxBound = BoundAngle + RadDegrees; 

    if (MinBound < 0)
        MinBound += 2*Math.PI;

    if (MaxBound > 2*Math.PI)
        MinBound -= 2*Math.PI;

    if (Angle <= MinBound)
        return MinBound;

    if (Angle >= MaxBound)
        return MaxBound;

    return Angle;
}

答案 1 :(得分:0)

到目前为止,所有答案都没有考虑到Clamp(380, 300, 380 % 20)。角度变为20(这很好),但在下一次迭代Clamp(20, 300, 380)角度变为300(这导致奇怪的跳跃)。

让我们重温一下这个问题:

让我们首先定义一些术语,以确保我们在同一页面上。 (你的措辞让我有些困惑,但它不应该重要)。

TargetAngle,您不希望偏离的角度超过少量

Deviation,最小和最大角度(TargetAngle - DeviationTargetAngle + Deviation

InputAngle,算法应修正的角度

然后有三种情况

  1. TargetAngle - Deviation >= 0 && TargetAngle + Deviation < 360
  2. 最简单的问题。解决方案是使用夹具。 angle = MathHelper.Clamp(InputAngle, TargetAngle - Deviation, TargetAngle + Deviation);

    1. TargetAngle - Deviation > 0 && TargetAngle + Deviation > 360
    2. 让我们看看如果我们采用TargetAngle = 350deviation = 20可接受的范围现在是350-360和0-10会发生什么。在代码中,这是:

      // Fix the lower bound, angle might be larger than 360    
      if(angle >= TargetAngle - Deviation)
      {
          MathHelper.Clamp(angle, TargetAngle - Deviation, TargetAngle + Deviation);
      }
      
      // Wrap around, let angle be in the 0-360 range
      angle = angle % 360
      
      // If angle has become, or is smaller than the minimum value, check if
      // its in the lower range (0-10) in our example
      if(angle < TargetAngle - Deviation)
      {
          MathHelper.Clamp(angle, 0, (TargetAngle + Deviation) % 360);
      }
      
      1. TargetAngle - Deviation < 0 && TargetAngle + Deviation < 360
      2. 让我们TargetAngle = 10deviation = 20。可接受的范围现在是0-30 350-360。您可以像我解决第二种情况一样解决这个问题。

        请注意,代码显然可以简化。但首先要涵盖所有情况,然后测试它是否有效,然后开始简化:)。