Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何";“圆形”;最接近15度的二维矢量_C#_Xna_Linear Algebra_Trigonometry_Collision - Fatal编程技术网

C# 如何";“圆形”;最接近15度的二维矢量

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;

我正在做一个简单的游戏,我试图简化游戏中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));
这样做合理吗?有更好的方法吗?

试试这个:

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)