3

私は Minecraft PE というゲームの mod を作成しており、それを使用して学習しています。Yコードを表示する前に、これが縦軸で横軸であるXことを知っておいてくださいZ。ここに私が使用したいくつかのコードがあります:

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

ある角度でtanなんか返ってくる時があるので使っていませんでした。NaNこのコードは、明確に を使用したときの角度のサインを示しMath.asinます。angleは -1 から 1 の間の値であり、機能します! 私が期待していたZ軸を通過すると、負から正に切り替わったので、それが機能することはわかっています。しかし、ラジアンを返すはずだと思いましたか?入力がラジアンであることをどこかで読みましたが、私の入力はラジアンではありません。自分のコードがどのように機能し、どのように実行する必要があったかについての答えが本当に欲しいです! 一日中三角法を学んでいたのですが、本当にイライラしたので、今はどこから答えが得られるのか質問します!

誰かが自分のコードがどのように機能するか、およびラジアンで角度を取得するためにコードを変更する方法を説明できますか? 私がしたことは正しいですか?私は実際にラジアンを与えて、それをある種のサイン度タイプのものに変えただけですか?

4

1 に答える 1

3

sinでは、何が何であるかについて簡単に復習しましょうasin。下の図の直角三角形を見てください。

出典:ウィキペディア

このA直角三角形の点を見ると、線分ACとの間に角度ができていることがわかりますAB。この角度との関係sinsin、斜辺に対する反対側の長さの比率です。言い換えると:

sin A = opposite / hypotenuse = a / h

これは、 をとった場合、これはにある角度の にa / h等しいことを意味します。そのため、実際の角度を見つけるには、この方程式の両側に正弦演算子を適用する必要があります。そのような:sinA

A = asin(a / h)

たとえば、三角形のa = 1h = 2の場合、この直角三角形が と の間ACで作る角度のサインABは次のとおりです。

sin A = 1 / 2

ここにある実際の角度を見つけるには、次のようにします。

A = asin(1 / 2)

これを電卓に入れると、30 度になります。ラジアンは角度を表す別の方法であり、次の関係が成り立ちます。

angle_in_radians = (angle_in_degrees) * (Math.PI / 180.0)

私は実際にあなたのコードと少し混乱していasinますsinasinとの間のプロパティsinは次のとおりです。

arcsinと同じasinです。x >= -Math.PI / 2, x <= Math.PI / 2上記の式は、または度である限りx >= -90, x <= 90、この関係が成り立つことを示しています。コードでは、 内の引数sin間違いなく-1 から 1 の間になるため、これは実際には次のように単純化されます。

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

移動するポイント間の角度を見つけたい場合は、三角形の右側を使用していません。これについては後で詳しく説明します。


さて、これはあなたの質問にどのように関係していますか? コード内の方程式を見てください。確認する必要がある 4 つのポイントがあります。

  • fPosXBeforeMoved-X移動前のポイントの位置
  • sPosX-X移動後のポイントの位置
  • fPosZBeforeMoved-Z移動前のポイントの位置
  • sPosZ-Z移動後のポイントの位置。

実際には、これを次のように直角三角形で表すことができます (下手な図ですみません)。

ここに画像の説明を入力

移動前の点を平面上に、(fPosXBeforeMoved,fPosZBeforeMoved)移動後の点を表すことができます。この図では、 が水平成分で、が垂直成分です。目の前に写真を置いていると想像してください。 左から右に向かう軸、上下に向かう軸、あなたに向かって出て画像の内側に向かう軸になります。XZ(sPosX,sPosZ)XZXZY

座標AC間の差を取ることによって隣接する ( ) セグメントの長さを見つけることができ、座標間の差を取ることによって反対側の ( ) セグメントの長さを見つけることができます。あとは、斜辺の長さ ( ) を見つけるだけです。学校のことを思い出すと、これはピタゴラスの定理を使用して単純に行われます。XABZh

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));

以前のコードにあったものと比較して、 andの減算を交換したことに注意してください。その理由は、前の点と後の点を調べる場合、常に後の点が最初に来て、前の点が 2 番目になるからです。一番下の斜辺を計算している場合、これは問題ではありません。これは、値を減算する順序に関係なく、減算の 2 乗を取るため、順序に関係なく同じ数が得られるためです。一貫性を保つために、ここで斜辺の順序を入れ替えることにしました。注文sPosXfPosXBeforeMoved減算するときに値が正または負になると、最終的に角度を見つけるときに違いが生じるためです。

この除算は常に-1 から 1 の間であることに注意してください。したがって、ここで逆三角関数を確実に使用できます。最後に、角度を求めたい場合は、逆余弦を適用します。言い換えると:

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)

あなたが今持っているものに関しては、隣接する斜辺と斜辺の比率を測定しているだけだと思います。これは、各軸をまたいでいる場所を検出したい場合はまったく問題ありません。実際の角度を見つけたい場合は、代わりに上記のコードを使用します。


頑張って楽しんでね!

于 2014-08-26T03:30:29.463 に答える