2

このコードは、XNAフレームワークで構築されたゲームから取得されました。三角法と物理学の観点から、それがどのように機能するかについて説明したいと思います。

ball.velocity = new Vector2((float)Math.Cos(cannon.rotation)、(float)Math.Sin(cannon.rotation));

ball.rotationは、私が考えるべきスプライトの回転、ラジアンです。

なぜ彼らはラジアン単位の角度を使用してx位置を見つけるだけで、同じことを斜辺が指している方向のy位置を見つけることができるのですか。

私がこれを尋ねた理由。このフレームワークがtrigの計算をどのように行うかを感じてみたいと思います。マウスがある方向にスプライトを回転させようとしています。つまり、xとyがわかっているので、角度が必要です。

したがって、ここには2つの質問があります。上記のコードを説明し、既知の点の方向にスプライトを向けます。

アップデート:

xnaは逆座標系を使用しているため、オブジェクトが存在する点aは(0,0)ではないことがわかりました。だから今私が持っている変数はこれらです:

オブジェクトのポイント。マウスのポイント。

4

5 に答える 5

10

すべての角度は、単位円上の点に対応します (単位円は、原点を中心とする半径 1 の一意の円です。つまり、単位円は、 を満たす点の集合ですx^2 + y^2 = 1)。対応は次のとおりです: 与えられた角度は、点thetatheta対応します(cos theta, sin theta)。なぜ(cos theta, sin theta)単位円上に住んでいるのですか? みんなの好きなアイデンティティのために

cos^2 theta + sin^2 theta = 1.

それは と でx = cos thetaありy = sin theta、点(x, y)は を満たすx^2 + y^2 = 1ので(x, y)は単位円上にあります。

これを逆にするには、単位円上の点を指定すると、逆正接を使用して角度を見つけることができます(おそらくarctanまたは またはとして知られている場合atanもありますtan-1)。正確には、単位円上でを計算(x, y)することで に対応する角度を見つけることができます。(x, y)theta = arctan(y / x)

もちろん、ここには厄介な詳細がいくつかあります。関数は、入力とarctanの違いを判別できません。なぜなら、 とは同じ符号を持っています。さらに、入力を処理できません。したがって、通常、これらの厄介な詳細を処理する関数を定義することで、これらを処理します(x, y)(-x, -y)y / x(-y / -x)arctanx = 0atan2

atan2(y, x) = arctan(y / x)       if x > 0
            = pi + arctan(y / x)  if y >= 0, x < 0
            = -pi + arctan(y / x) if y < 0, x < 0
            = pi / 2              if y > 0, x = 0
            = -pi / 2             if y < 0, x = 0
            = NaN                 if y = 0, x = 0

C# では、上で参照したMath.Atan関数arctanであり、上で参照しMath.Atan2た関数atan2です。

于 2009-10-14T15:10:50.477 に答える
4
     |
    y.-----* P
     |    /|
     |   / |
     | r/  |
     | / a |
     |/)___.__
    O          x

    we have:

    a = angle in radians
    O: origin
    P: known point
    r: distince between O & P

    to calculate x, y:

         x = r*cos(a)
         y = r*sin(a)

(in your example : r = 1, a = cannon.rotation)

ここで、x、y があり、次のものが必要な場合:

if x!= 0  a = atan(y/x)
otherwise a = sign(y)*Pi/2

詳細(およびよりきれいなグラフ)については、ウィキペディア:極座標系

于 2009-10-14T15:18:30.600 に答える
2

cos と sin が円上の点を返していることがわかります。

その点で、カノンの真ん中を円の中心と見なしてください。次に、角度 (カノンの角度) を指定すると、それが指している円上の位置を sin と cos で取得できます。大砲が 0,0 の位置を中心にしていると考えると、この値は弾丸が移動する方向でもあります。

回答 2: x と y が分かっていて、角度を知る必要がある場合は、1 つの点が 0,0、もう 1 つの点が x,y である三角形の傾斜面から形成される角度を返す atan 関数が必要です。ポイントであり、1 つのポイントは 90 度の角度にあるポイントです。

于 2009-10-14T15:09:56.773 に答える
2

残念ながら、これは良い質問であり、SO は回答するのに最適な形式ではありません。

文字で説明するよりも、パラメトリック方程式について学んでおくと参考になると思います。Google で「円のパラメトリック方程式」を検索することから始めることができます。

この概念が私にぴったりだったのは、sin、cos、円、および角度の関係を理解するまで、さまざまなコードを試してみることでした。写真や画像を見ることも大いに役立ちます。それまでは説明を読んでいましたが、説明をしっかりと理解することはできませんでした。

于 2009-10-14T15:16:14.780 に答える
0

三角関数に慣れていない場合、あなたが求めていることを説明するのは困難です。

問題のコード行は、大砲から発射されると思われるボールの方向の単位ベクトルを計算します。Cos と Sin の部分は、大砲の角度の X 成分と Y 成分をそれぞれ抽出します。つまり、大砲が指し示す方向がボールの発射方向です。

結果は方向のみであり、実際の速度ではない可能性が高いため、少し誤解を招く可能性があります。そのベクトルの下に、そのベクトルに定数を掛けて、ボールに最終的な移動速度を与える線があると思います。

于 2009-10-14T15:23:38.320 に答える