【问题标题】:Libgdx degree between two points calculationLibgdx 两点之间的度数计算
【发布时间】:2013-08-20 10:59:03
【问题描述】:

在这里我正在计算演员和触摸点之间的度数,并将这个度数作为旋转角度传递给演员。我希望演员应该指向手指触摸或手指拖动方向。(考虑我通过手指触摸在路上拉公共汽车并且拖)

float degrees = (float) ((Math.atan2(touchPoint.x - crocodile.position.x, -(touchPoint.y - crocodile.position.y)) * 180.0d / Math.PI));

它的计算度数正确。只是有时在两者之间它给出了不同的程度。所以当结果真的与预期不同时,我的演员就会波动。

我打印的结果是:

块引用

    degree is :: 141.93233
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 158.61426
    degree is :: 90.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 90.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93057
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93306
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93134
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93134
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93306
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 141.93134
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 141.93134
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93008
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93306
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93257
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 141.93134
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0
    degree is :: 180.0

现在,180 和 141 为什么会随着这些值波动。 考虑到我期望 141 不断或 180 不断我需要在上面的公式中进行更改。

【问题讨论】:

  • 只要你的输入没有改变它就不能改变(假设你有一个确定性的cpu,应该是这种情况......)。因此,要么您的接触点发生变化,要么您的鳄鱼的位置发生变化。此外:像touchPoint.sub(crocodile.position).angle() 这样的东西可能更容易理解?
  • @noone ,我想通过使用code touchPoint.sub(crocodile.position).angle() 我可以找到角度吗?但是crocodile.position是Vector2值,而sub没有采用Vector2值,如果我使用code touchPoint.sub(crocodile.position.x,crocodile.position.y,0).angle();然后它也与任何 API 文档功能不匹配。意味着角度()没有在那里解决......在上面的答案中“你说你的鳄鱼的位置正在改变”是的“我想告诉你是的,我正在将鳄鱼的位置更新到接触点。”那么如果我想把它移到那里我该怎么办..谢谢。
  • Vector3 没有角度(),但Vector2 有。所以试试flot angle = (new Vector2(touchPoint.x, touchPoint.y)).sub(crocodile.position).angle()
  • @noone ,我的解决方案也受到了同样的波动影响。问题是我正在做的事情。@ 987654329@crocodile.position.x = touchPoint.x ; crocodile.position.y = touchPoint.y ;这可能是问题......我必须解决它,但我必须移动鳄鱼..
  • 如果你改变位置,角度总是会改变,所以这不是问题。我只是提供了另一种实现,因为它更容易理解。

标签: rotation libgdx formula points degrees


【解决方案1】:

第一个参数必须是y,第二个是x。

double atan2(double y, double x)

Atan2实际上是指定y/x的反正切函数

因为通常第一个参数是 y。

此外,有时当您交换 x 和 y 时,您可以获得适当的度数,因为在某些边界(如 x

Look here for more explanation

【讨论】:

  • format您的答案以提高其可读性。
【解决方案2】:

结合问题和答案帮助我快速解决了我的问题。只是为了澄清一下解决方案:

double degrees = Math.atan2(
    towards.getY() - pointer.getY(),
    towards.getX() - pointer.getX()
) * 180.0d / Math.PI;
pointer.setRotation((float) degrees);

还要注意,要围绕中间旋转,您需要执行以下操作:

pointer.setOrigin(Align.center);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多