c# - 围绕中心 vector2 点旋转对象

标签 c# math xna xna-4.0

我应该以我不是数学家作为开场白。我在另一个问题中找到的代码似乎有点工作......除了它会导致我放置的对象在一个大圆圈中旋转,大部分都在屏幕外。

代码如下:

public void Update(GameTime gameTime)
{
    Location = RotateAboutOrigin(Center, Origin, 0.01f);
}

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
{
    var u = point - origin; //point relative to origin  

    if (u == Vector2.Zero)
         return point;

    var a = (float)Math.Atan2(u.Y, u.X); //angle relative to origin  
    a += rotation; //rotate  

    //u is now the new point relative to origin  
    u = u.Length() * new Vector2((float)Math.Cos(a), (float)Math.Sin(a));
    return u + origin;
} 

通过在中心向量周围的任意位置单击鼠标来设置位置。

中心是我单击时“放置”的对象的(您猜对了)中心。它是简单地除以纹理的高度和宽度来确定的。

Origin 是我试图旋转的 vector2。它静态设置为 384,384。


据我所知,它获取两个向量之间的距离,然后使用 atan2 确定角度。之后的其余部分对我来说是个谜。我知道我应该学习一切的作用,而且我确实打算在 Spring 开始上大学时(只晚了十年)。我试过阅读它们,但我迷路了。任何帮助将不胜感激。

另外,如果您有一个好的 trig for dummies 网站可以推荐,我会很高兴通读它。

最佳答案

这里有一个替代方案:

public Vector2 RotateAboutOrigin(Vector2 point, Vector2 origin, float rotation)
{
    return Vector2.Transform(point - origin, Matrix.CreateRotationZ(rotation)) + origin;
} 

它执行“转换到世界原点,旋转,然后转换回”位。

无论原点相对于世界原点的位置如何,这都会将“点”围绕“原点”旋转“旋转”弧度。触发发生在内置函数“CreateRotationZ()”中。要查看它如何应用触发器,请在框架中反射(reflect)该方法。

编辑:修复变量名

关于c# - 围绕中心 vector2 点旋转对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8148651/

相关文章:

c# - 我怎样才能改进这个平方根方法?

javascript - 如何制作一个函数来计算带小数的数字的阶乘?

c# - 引用和修改 Game1 是不好的做法吗?

c# - Json解析器异常解析值时遇到意外字符: S.路径 '',第0行,位置0

c# - 以正确的方式从 SQL Server 获取单条记录

java - 数学的堆栈行为

c# - 如何在单游戏中使用或制作 "Effects"?

c++ - 如何在构造函数中正确初始化 XMVECTOR?

C# 如何实现终止处理程序

c# - ViewBag 和 HtmlHelper 错误 : "One or more types required to compile a dynamic expression cannot be found. Are you missing an assembly reference?"