一定角度的速度

时间:2013-04-04 23:49:57

标签: c# vector linear algebra

我试图找到一个角度的速度。

要做到这一点,我试图使用三角形,但我遇到了路障。

这是移动对象的代码

Velocity = new Vector3((float)Math.Cos(MathC.AngleToPoint(EnemyObject.transform.position, PlayerPosition)),
              (float)Math.Sin(MathC.AngleToPoint(EnemyObject.transform.position, PlayerPosition)), 0);

这是AngleToPoint方法

public static double AngleToPoint(Vector3 startingPoint, Vector3 endPoint)
{
    double hypotenuse = LineLength(startingPoint, endPoint);
    double adjacent = LineLength(startingPoint, new Vector3(endPoint.x, startingPoint.y, 0));
    double opposite = LineLength(endPoint,  new Vector3(endPoint.x, startingPoint.y, 0));

    double angle = adjacent / hypotenuse;


    return Math.Acos(DegreeToRadian(angle));

}

这是LineLength方法

public static float LineLength(Vector2 point1, Vector2 point2)
{
    return Math.Abs((float)Math.Sqrt(Math.Pow((point2.x - point1.x), 2)+Math.Pow((point2.y - point1.y),2)));

}

我收到很多NaN错误,而且这种移动并不像我想要的那样。

编辑:我已经解决了这个问题。我不确定我是否解释得很好,所以请允许我再尝试这样做。我不是物理学家,如果我把这些术语中的一些错误的话,请原谅。

我的目标是让一个物体以恒定的速度移动而不管方向如何。所以你可以假设你是一个人在朝北方向(0,1)拿枪,然后旋转45度并开枪。枪的速度是一些标量,例如每秒50个单位。我想知道我需要在任何方向上进行该运动的向量的X和Y值。所以速度(0,50)向右旋转45度。

我知道Velocity.X = SpeedCos(Angle)和Velocity.Y = SpeedSin(Angle),但我需要找到Angle的值。

要做到这一点,我的想法是根据起始位置和目的地制作一个直角三角形,然后使用trig找到Angle。

public static double AngleToPoint(Vector3 startingPoint, Vector3 endPoint)
{
    double hypotenuse = LineLength(startingPoint, endPoint);
    double adjacent = LineLength(startingPoint, new Vector3(endPoint.x, startingPoint.y, 0));
    double opposite = LineLength(endPoint,  new Vector3(endPoint.x, startingPoint.y, 0));

    double angle = adjacent / hypotenuse;


    return Math.Acos(DegreeToRadian(angle));

}

这段代码正在制作一个直角三角形。相反的原因是即使它没有被使用是因为我尝试了多种方法来尝试实现这一点,但仍然遇到错误。在制作一个直角三角形之后,它需要adj和hypo来获得cos(adj / hypo),然后我称之为Acos,以弧度给出角度。然而,这没有用,它没有正确地返回我的角度并且产生了很多NaN错误。

搜索后我找到了这个帖子和atan2的解释

https://gamedev.stackexchange.com/questions/14602/what-are-atan-and-atan2-used-for-in-games

http://i.stack.imgur.com/xQiWG.png

这个图让我意识到,如果我只是将行startingPoint,endPoint转换为startingPoint = 0,我可以调用atan2并返回我想要的角度。这是完成该任务的代码。

public static double GetAngleToPoint(Vector3 startingPoint, Vector3 endPoint)
{
    endPoint -= startingPoint;
    return Math.Atan2(endPoint.y, endPoint.x);
}

Velocity = new Vector3(Speed * (float)Math.Cos(MathC.GetAngleToPoint(StartingPosition, PlayerPosition)),
              Speed * (float)Math.Sin(MathC.GetAngleToPoint(StartingPosition, PlayerPosition)), 0);

2 个答案:

答案 0 :(得分:0)

这对您有帮助:How to Calculate Velocity at an Angle

(听起来像游戏开发相关问题,你可能会在这里得到更多帮助) https://gamedev.stackexchange.com/

(或者也许在这里) https://math.stackexchange.com/

答案 1 :(得分:0)

以下解决方案最初由问题作者D Yamamoto发布。


我已经解决了问题。我不确定自己的解释是否很好,所以请允许我再尝试一次。我不是物理学家,如果我误解了这些术语,请原谅。

我的目标是使物体以恒定的速度移动而与方向无关。因此,您可以假设您是一个向北(0,1)方向持枪的人,然后旋转45度并开枪。喷枪的速度是一个标量,例如每秒50个单位。我想知道在任何方向进行该运动所需的向量的X和Y值是多少。因此,速度(0,50)向右旋转45度。

我知道Velocity.X = SpeedCos(Angle)和Velocity.Y = SpeedSin(Angle),但是我需要找到Angle的值。

为此,我的思路是根据起始位置和目的地绘制一个直角三角形,然后使用Trig查找Angle。

NULL

这段代码是一个直角三角形。即使没有使用它,也存在相反的原因,是因为我尝试了多种方法来实现此目的,但一直遇到错误。制成直角三角形后,需要用adj和hypo来获得cos(adj / hypo),然后我将其称为Acos,以弧度表示角度。但是,这没有用,它不能正确地返回角度并创建了许多NaN错误。

搜索后,我发现this gamedev.se Q&A解释了atan2,并包含以下图片:

  

http://i.stack.imgur.com/xQiWG.png

这让我意识到,如果我仅将startingPoint,endPoint行转换为startingPoint = 0,我可以调用atan2并返回所需的角度。这是完成此任务的代码。

SELECT try_convert(decimal(10, 2), pci1__c) pci1__c
       FROM mx_credit_analysis;