1

わかりました、これがここで尋ねるのは本当にばかげているように聞こえますが、それはプログラミングに関連しています。

私はゲームに取り組んでおり、ユーザーが 3D 座標を三角測量して何か (タスクなど) を見つけることができるシステムを実装することを考えています。また、ユーザーが三角測量に使用しているポイントの座標をユーザーが決定した座標にできるようにしたいと考えています (したがって、おそらくビーコンなどを設定することにより、位置の座標は相対的になります)。

ポイント間の距離を計算する方法を用意しているので、基本的に、三角形/ピラミッドの辺の長さと、後の座標以外のすべてを計算できます。私は三角法を行ってから長い時間が経ち、sin、cos、tan 関数に慣れていません。それらが必要であると感じていますが、それらを実装する方法がわかりません。

数学的/プログラム的な方法でこれを行う方法について、誰かが私にデモンストレーションを与えることができますか?

追加情報: 私の関数は 2 つの点の間の正確な距離を返すので、2 つの点をそれぞれ 0,0,0 と 4,4,0 に設定し、それらの点がスケールに設定されているとします (ゲームの世界は非常に各「ブロック」領域が 3D 座標で表される大きな 3D グリッド)、約 5.6 の値が返されます。

変化に関する重要なポイントは、ユーザーがポイントを設定できることです。たとえば、0,0,0 を読み取るポイントを設定すると、実際の位置は 52、85、93 のようになる可能性があります。ただし、ブロックをカウントするとします。他のポイントを正しく設定します (たとえば、ポイント 4,4,0 を実際のポイント 56, 89, 93 に設定します)、最終結果は相対位置を返します (たとえば、位置を特定しようとしているオブジェクトは実際のポイント 152 にあります)。 、185、93、相対値 100,100,0 を返します)。位置を特定しようとしているポイント以外のすべてのポイントと、すべてのポイント間の距離を計算できるようにする必要があります。

また、実際の座標を使用して計算できない理由を聞かないでください。結果を計算するときに方程式を画面に表示したいと思っています.7

例:これは図です 例図

これらが平地での私のゲームのポイントだと想像してください。点fが知りたいです。点 d と e、および辺 A、B、C の値を知っています。

私が知っているデータのみを使用して、これを行う方法を見つける必要があります。

回答済み編集:

これに何日も取り組んだ後、ショーン・ケニーは彼の時間、忍耐、そして知性を私に提供してくれました。

将来のコーダーがこのコードを使用し、私が抱えていたのと同じ問題が発生しないように、コードをテストするときに、コードのさまざまな言語に相当するものを配置したいと考えています。

4

2 に答える 2

4

私は解決策に少し時間を費やしましたが、実装者、つまりあなたはそれが何をしているのかを知っているべきだと思います。そういうわけで、私は強いヒントの形で答えを出します。

まず、d から e までのベクトルを計算します。座標を絶対座標ではなく位置ベクトルと見なすと、d から e を指すベクトルが何であるかをどのように判断できますか? どこから始めてどこにたどり着いたかだけを知っている場合、移動した変位をどのように決定するか考えてみてください。変位は直線、点 A から点 B、ずれなし、そうではありません。その家の周りを歩かなければならなかったので、さらに歩きました。直線。その点(0,0)から始めれば簡単です。

2 つ目は、余弦則です。それが何であるか知っていますか?そうでない場合は、それを読んでくださいdベクトルDEと_ DF_ 角度の関数ではなく、角度が必要であることを忘れないでください (cos は関数です)。

次に、スカラー積と呼ばれるベクトルの「トリック」を使用できます。そこにcos関数があることに注意してください。さて、あなたは考えているかもしれません。

を定義しDQ = [1,0]ます。DQx 軸に沿った長さ 1 のベクトル (単位ベクトル) です。私たちが知っている他のベクトルはどれですか? 2 つの位置ベクトルを知っていますか?

2 つのベクトルが得られたら (もう 1 つのベクトルがわかるといいのですが)、スカラー積を使用して角度を求めることができます。繰り返しますが、角度だけであり、関数ではありません。

さて、願わくば、角度が 2 つあることを願っています。目的の座標に対してさらに別の角度を取得するために、一方を他方から取得できDFますか? 以前に単位ベクトルを使用するという選択は、恣意的ではありませんでした。

スカラー積は、cos(theta) = x / r いくらかキャンセルした後、次のようになります。xxFr

最終結果は次のとおりです。

theta = arccos( xe / B ) - arccos( ( (A^2) + (B^2) - (C^2) ) / ( 2*A*B ) ) 

どこで は、原点が点thetaにある線に沿った単位ベクトルの間で形成される角度です。y = 0d

この情報を使用して、 に対する点の x 座標と y 座標を見つけることができfますd。どのように?繰り返しますが、スカラー積を使用します。残りはかなり簡単なので、あなたにあげます。

x = r.cos(theta)

y = r.sin(theta)

基本的な三角法から。

これを 1 つの値にコード化しようとすることはお勧めしません。

代わりに、これを試してください:

//pseudo code
dx = 0
dy = 0  //initialise coordinates somehow
ex = ex
ey = ey
A = A
B = B
C = C

cosd = ex / B
cosfi = ((A^2) + (B^2) - (C^2)) / ( 2*A*B)
d = acos(cosd)      //acos is a method in java.math 
fi = acos(cosfi)   //you will have to find an equivalent in your chosen language
                  //look for a method of inverse cos
theta = fi - d

x = A cos(theta)
y = A sin(theta)

すべての変数を小数を取ることができるものとして初期化します。たとえばfloat、またはdoubleJavaで。

イムグル

x 軸に沿った緑は f の x 座標を表し、紫は y 座標を表します。
青い角度は、私たちが見つけようとしている角度です。なぜなら、斜辺の長さが分かっていれば、単純な三角関数を使用して x と y を計算できるからです。1 までのこの黄色の線は、スカラー積が取得される単位ベクトルであり、これは x 軸に沿って走っています。

単純な減算で青の角度を推定できるように、黒と赤の角度を見つける必要があります。

お役に立てれば。拡張は 3D に対して行うことができ、すべてのベクトル関数は基本的に 3D に対して同じように機能します。

于 2012-08-06T20:17:06.027 に答える
0

原点からの変位がある場合、これが別のユーザー定義の座標であるかどうかに関係なく、その 3D ポイントの座標は単に(x, y, z).

これらの長さをポイントから定義し、座標も考慮する場合は(x, y, z) + (x1, y1, z1) = (x2, y2, z2)、x2、y2、z2 が(0, 0, 0)原点からの変位であると簡単に記述できます。

このベクトルの長さを知りたい場合、つまり、A から B への線を x 軸と定義した場合、x 変位はどうなるでしょうか。3D ベクトルにピタゴラスを使用できます。これは 2D とまったく同じように機能します。 :

Length l = sqrt((x^2) + (y^2) + (z^2))

編集: ユーザー定義のポイント A (x1、y1、z1) があり、これを原点 (0,0,0) として定義したいとします。別のユーザーがポイント B (x2、y2、z2) を選択し、x、y、z 平面での A から B までの距離を知っています。新しい原点に関して、この点が何であるかを理解したい場合は、次のように簡単に実行できます。

B relative to A = (x2, y2, z2) - (x1, y1, z1) = (x2-x1, y2-y1, z2-z1) = C

C はベクトル A>B です。ベクトルは、大きさ (線の長さ) と方向 (A から B を指す角度) を持つ量です。

原点 O に対する B の位置を計算したい場合は、逆の操作を行うことができます。

 B relative to O = (x2, y2, z2) + (x1, y1, z1) = (x1+x2, y1+y2, z1+z2) = D

D はベクトル O>B です。

編集2:

//pseudo code
userx = x;
usery = y;
userz = z; 
//move origin
for (every block i){
 xi = xi-x;
 yi = yi - y;
 zi = zi -z;
}
于 2012-08-06T12:18:43.277 に答える