How to “round” a 2D Vector to nearest 15 degrees

六眼飞鱼酱① 提交于 2019-12-11 00:08:30

问题


I'm working on a simple game and I'm trying to simplify part of the 2D collision reaction in the game. When certain objects hit walls, I'm calculating a collision normal (collisionPoint - objectCenter) and reflecting based on that normal. I'm interested in rounding that normal vector to its nearest 15° but I'm not sure of a good way to go about that.

My current thought is doing something like this

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));

Is this a reasonable way to do it? Is there a better way?


回答1:


Try this:

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);
}

You don't need to add 7.5, take this example:

// 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



回答2:


actually this is more correct if you want the nearest 15 degree angle : do this:

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

INT ALWAYS rounds DOWN by default this should properly give you the nearest angle in any case that is positive or negative have fun!! and add the part where you use degree to rad and rad to degree if needed INSIDE the parens (like right next to angle% if that angle is not given in degrees then use some sort of rad2deg multiplier inside there this is more like how you would do this in basic, with some modification It will work in c code or such, well good luck!!



来源:https://stackoverflow.com/questions/9038392/how-to-round-a-2d-vector-to-nearest-15-degrees

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!