如何将2D矢量“舍入”到最接近的15度

时间:2012-01-27 18:42:53

标签: c# xna linear-algebra trigonometry collision

我正在开发一款简单的游戏,我正试图在游戏中简化部分2D碰撞反应。当某些物体碰到墙壁时,我正在计算碰撞法线(collisionPoint - objectCenter)并根据该法线进行反射。我有兴趣将法向矢量四舍五入到最接近的15°,但我不确定这是一个很好的方法。

我目前的想法是做这样的事情

float angle = atan2(normal.Y, normal.X) * Rad2Deg;
float newAngle = ((int)(angle + 7.5f) / 15) * 15.0f * Deg2Rad;
vector2 newNormal = vector2(cos(newAngle), sin(newAngle));

这是一种合理的方法吗?还有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

试试这个:

float roundAngle = 15 * Deg2Rad;
float angle = (float)Math.Atan2(normal.Y, normal.X);
Vector2 newNormal;

if (angle % roundAngle != 0)
{
    float newAngle = (float)Math.Round(angle / roundAngle) * roundAngle;
    newNormal = new Vector2((float)Math.Cos(newAngle), (float)Math.Sin(newAngle));
}
else
{
    newNormal = Vector2.Normalize(normal);
}

您不需要添加7.5,请参考此示例:

// 4 degrees should round to 0
    (4 + 7.5) / 15 == 11.5 / 15 == 0.77
// When this gets rounded up to 1 and multiplied by 15 again, it becomes 15 degrees.

// Don't add 7.5, and you get this:
    4 / 15 == 0.27
// When rounded, it becomes 0 and, as such the correct answer

// Now how about a negative number; -12
    -12 / 15 == -0.8
// Again, when rounded we get the correct number

答案 1 :(得分:0)

如果你想要最近的15度角,这实际上更正确: 这样做:

newangle% = INT(((angle%+7.5)/15)*15) 

INT默认情况下,DOWN默认情况下向下舍入,这应该可以正确地给你最近的角度,无论是正面还是负面都有乐趣! 并将你使用度数的部分加到rad和rad到度数如果需要INSIDE the parens(就像角度%旁边,如果没有用度数给出角度那么在那里使用某种rad2deg乘数) 这更像是你在基本的方式做到这一点,经过一些修改它会在c代码等工作,祝你好运!