C# 如何";“圆形”;最接近15度的二维矢量
我正在做一个简单的游戏,我试图简化游戏中2D碰撞反应的一部分。当某些对象撞击墙壁时,我正在计算碰撞法线(C# 如何";“圆形”;最接近15度的二维矢量,c#,xna,linear-algebra,trigonometry,collision,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;
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));
这样做合理吗?有更好的方法吗?试试这个:
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
实际上,如果您想要最接近的15度角,则这更为正确: 这样做: INT始终向下舍入默认情况下,这将正确地为您提供最接近的角度,无论是正角度还是负角度,祝您玩得开心!! 如果需要,在parens中添加使用度到rad和rad到degree的部分(如角度%旁边,如果该角度不是以度为单位给出的,则在其中使用某种rad2deg乘数)
这更像是你在basic中所做的,经过一些修改,它将在c代码或类似的代码中工作,祝你好运!!我的三角函数技能不再是以前的技能了…但是四舍五入到最接近的15度如何简化任何事情呢?这是碰撞响应设计的一部分,而不是简化数学的任何东西。这是一段代码e可能是我会做的。法线。Y总是正的吗?如果法线。Y小于0,角度将小于0。假设角度==-38度。你希望它圆到-45,但是-38+7.5=-30.5将圆到-30。@BobKaufman,这是一个好的观点。
normal.Y
可能是负的…实际上这比OP更不正确。铸造的点对于int
来说,当你再次乘以15时,这个数字将是15的倍数。在这里,你基本上做了一个大圆圈,最后得到了一个int
,其中包含angle+7.5
,使用已经存在的Math.Round()
处理负数情况的函数。谢谢。
newangle% = INT(((angle%+7.5)/15)*15)