gpt4 book ai didi

javascript - 找不到 Angular 对象以弧度为单位移动

转载 作者:行者123 更新时间:2023-11-29 10:42:47 25 4
gpt4 key购买 nike

我一直在为一款名为《我的世界》 PE的游戏制作游戏模组,我正在用它来学习。在显示代码之前,我想让您知道Y是垂直轴,而XZ是水平轴。这是我使用的一些代码:

Math.asin(Math.sin((fPosXBeforeMoved - sPosX) /
Math.sqrt(Math.pow(fPosXBeforeMoved - sPosX, 2) +
Math.pow(fPosZBeforeMoved - sPosZ, 2))));

我没有使用 tan,因为有时它会以某个 Angular 返回类似 NaN的内容。当我清楚地使用 Math.asin时,此代码为我们提供了 Angular 正弦。 angle是一个介于-1和1之间的值,它可以正常工作!我知道它是可行的,因为当我越过Z轴时,我所期望的确实从负到正。但是,我认为它应该返回弧度?我在某处读到输入是弧度的,但输入不是弧度的。我真的很想知道我自己的代码如何工作以及应该如何做的答案!我花了一整天的时间学习三角学,但是我真的很沮丧,所以现在我从哪里得到所有答案就问这个问题!

有人可以解释一下我自己的代码如何工作,以及如何修改它以获得弧度角吗?我做的对吗?我实际上是给它弧度并将其变成某种正弦度类型的东西吗?

最佳答案

好的,让我们快速回顾一下sinasin是什么。在下图中查看这个直角三角形:

资料来源:Wikipedia

通过查看这个直角三角形的点A,我们看到线段ACAB之间形成了一个 Angular 。该 Angular 与sin之间的关系是sin是相对边的长度与斜边的比率。换一种说法:

sin A = opposite / hypotenuse = a / h

这意味着,如果我们采用 a / h,则等于位于 sin的 Angular A。因此,要找到 实际角,我们需要在此方程式的两边应用 反正弦运算符。因此:
A = asin(a / h)

例如,如果三角形中的 a = 1h = 2,则此直角三角形在 ACAB之间形成的 Angular 正弦为:
sin A = 1 / 2

为了找到此处的实际 Angular ,我们执行以下操作:
A = asin(1 / 2)

将其放入您的计算器,我们得到30度。弧度是表示 Angular 另一种方法,其中以下关系成立:
angle_in_radians = (angle_in_degrees) * (Math.PI / 180.0)

我实际上对您的代码有些困惑,因为您先执行 asin,然后再执行 sinasinsin之间的属性是:
arcsinasin相同。上面的等式指出,只要 x >= -Math.PI / 2, x <= Math.PI / 2x >= -90, x <= 90度,则此关系成立。在您的代码中, sin内的参数 绝对在-1到1之间,因此实际上简化为:
(fPosXBeforeMoved - sPosX) / Math.sqrt(Math.pow(fPosXBeforeMoved - sPosX, 2) + 
Math.pow(fPosZBeforeMoved - sPosZ, 2));

如果要查找移动的点之间的 Angular ,则无需使用三角形的右侧。我将在后面详细介绍。

好吧,这与您的问题有什么关系?看一下代码中的方程式。我们需要看以下四点:
  • fPosXBeforeMoved-我们移动
  • 之前您的点的 X位置
  • sPosX-移动
  • 后您的点的 X位置
  • fPosZBeforeMoved-我们移动
  • 之前您的点的 Z位置
  • sPosZ-我们移动后您的点的Z位置。

  • 实际上,我们可以像这样以直角三角形来表示(不好的图表):

    我们可以将您之前移动的点表示为 (fPosXBeforeMoved,fPosZBeforeMoved)平面上的 XZ,而点 (sPosX,sPosZ)是您移动之后的位置。在此图中, X将是水平分量,而 Z将是垂直分量。想象一下,您在前面举着一张照片。 X将是从左到右的轴, Z将是向上和向下的轴, Y将是朝向您的方向并进入图片的轴。

    通过获取 AC坐标之间的差异,可以找到相邻( X)段的长度,通过获取 AB坐标之间的差异,可以找到相对的( Z)段的长度。我们只需要找到斜边的长度( h)。如果您从学校回忆起,只需使用勾股定理即可:
    h^2 = a^2 + b^2
    h = sqrt(a^2 + b^2)

    因此,如果您引用该图,我们的斜边就是(在JavaScript中):
    Math.sqrt(Math.pow(fPosXBeforeMoved - sPosX, 2) + Math.pow(fPosZBeforeMoved - sPosZ, 2));

    您会将其识别为代码的一部分。我们介绍了 sin,但让我们看一下 coscos是相邻边的长度与斜边的比率。换一种说法:
    cos A = adjacent / hypotenuse = b / h

    这解释了这一部分:
    (sPosX - fPosXBeforeMoved) / Math.sqrt(Math.pow(sPosX - fPosXBeforeMoved, 2) + 
    Math.pow(sPosZ - fPosZBeforeMoved, 2));

    请注意,与以前的代码相比,我 交换了减去 sPosXfPosXBeforeMoved。之所以这样,是因为当您检查前面的点和后面的点时, 之后的点总是首先出现,然后第二点才是第二点。在计算斜边的底部,这无关紧要,因为无论从哪个顺序减去值,我们都将减去减法的平方,因此无论顺序如何,您都将得到相同的数字。为了一致起见,我决定在这里以斜边交换订单。 顺序在顶部影响的重要性,因为在减去时的正负值会在最终找到 Angular 时有所不同。

    注意,该除法将 始终在-1到1之间,因此我们当然可以在这里使用反三角函数。最后,如果要查找 Angular ,则应应用余弦逆。换一种说法:
    Math.acos((sPosX - fPosXBeforeMoved) / Math.sqrt(Math.pow(sPosX - fPosXBeforeMoved, 2)
    + Math.pow(sPosZ - fPosZBeforeMoved, 2)));

    我认为这就是您应该进行编程的方式。请注意,这将返回弧度
    。如果您希望以度为单位,请使用上面显示的方程式,然后重新排列,以便求解度数而不是弧度。因此:
    angle_in_degrees = angle_in_radians * (180.0 / Math.PI)

    至于您现在拥有的东西,我怀疑您只是在测量相邻和斜边的比率,如果您想检测每个轴的交叉点,则完全可以。如果您想找到实际的 Angular ,我会改用上面的代码。

    祝好运并玩得开心点!

    关于javascript - 找不到 Angular 对象以弧度为单位移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25497032/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com