4

私は複雑な問題を抱えており、それは私が自信を持っていない数学の理解を伴います。

若干のコンテキストが役立つ場合があります。私は子供向けの3D列車シミュレーターを構築しており、WebGLを使用してブラウザーで実行されます。線路資産を配置するためのポイントのネットワークを作成し(画像を参照)、列車が移動するための参照を提供しようとしています。

私はスクリプトを作成できるデザイナーであり、実際にはプログラマーや数学者ではないため、問題を説明するために視覚的な表現を作成しました。

問題の視覚化

基本的に3つの形(図A、B、C)があり、幅はありますが、Aと曲線(B、C)の直線として表すことができます。曲線BとCはAから派生(曲げ修正)されているため、すべて同じ長さ(l)で112です。曲線(BとC)の半径(r)はそれぞれ285.5で、(a)角度は曲げられています。 atは22.5°でした。

各形状(A、B、C)には、それぞれに取り付けられた緑色のボックスの中央に示されている登録ポイント(開始点)があります。

私がやろうとしているのは、0、0から始まる「トラック」のネットワークを作成することです(標準のデカルト座標を使用)。

私の問題は、曲線の後に次の要素を配置する場所です。直線の場合は、y軸に沿った一定のオフセットとして長さを使用できるので問題ありませんが、それは退屈なので、曲線を追加する必要があります。

図Dは、可能なトラックレイアウトの例を示していますが、静的な回答(画像内のすべてが配置されている場所に基づく)を探しているわけではないことを理解してください。どのように構成しても適用できる式が必要です。追跡。

図Dを使用して、最初の要素の後に2番目の曲線要素を配置する場所を見つけようとしました。中心座標と半径を指定して、円の円周の点をプロットする式を使用しました(図E)。

直線の長さ(y位置)を設定しただけなので、ポイント1がありました。円の中心は、オフセットy位置、半径(r)(x位置)のオフセット、および角度(a)が常に22.5°(ちなみに、ラジアンに変換された)であるため、簡単に計算できます。式の要件に従って)。

数式に値を渡した後、数式は3時から反時計回りに作業していると想定していたため、正しい結果が得られませんでした。そのため、(a)から180を差し引き、それをラジアンに変換して、期待値を取得する必要がありました。結果。

それはうまくいきました。180°のトラックカーブを作成したい場合は、同じ中心点を使用して、毎回角度から22.5°を差し引くことができます。素晴らしい。しかし、私は図1と図2のようなよりダイナミックなトラックレイアウトが必要です。D&E。

では、図Eの作業点5は、その曲線セグメントの中心点を表すため、どのように処理すればよいでしょうか。わからない。

また、ボーナスの質問として、これはこれを行うための正しい方法ですか、それとも私は物事を複雑にしすぎていますか?

この問題は私がゲームを構築するのを妨げる唯一の問題であり、あなたが理解できるように、それは少し大きな問題なので、事前に誰かの貢献に感謝します。

4

2 に答える 2

7

トラックを構築するとき、配置する次のトラックの位置は、トラックの現在の端の位置と方向を基準にする必要があります。

現在のポイントを示すために( xy)の位置と角度を保存します(で、0から始まり、pi / 2ラジアンで始まります。これは「3時から反時計回り」のシステムでまっすぐ上に対応します)。axya

次に、構築します

fx = cos(a);
fy = sin(a);
lx = -sin(a);
ly = cos(a);

これは、現在直面している方向を基準にした「前方」および「左」ベクトルのxおよびy成分に対応します。位置を1単位前方に移動したい場合は、(x、y)を(fx、fy)だけインクリメントします。

あなたの場合、トラックの直線部分を配置するためのルールは次のとおりです。

x=x+112*fx
y=y+112*fy

曲線を配置するためのルールは少し複雑です。カーブを右に曲がる場合は、112 * sin(22.5°)前方に移動し、次に右に112 *(1-cos(22.5°))ステップしてから、時計回りに22.5°回転する必要があります。コードでは、

x=x+285.206*sin(22.5*pi/180)*fx // Move forward
y=y+285.206*sin(22.5*pi/180)*fy

x=x+285.206*(1-cos(22.5*pi/180))*(-lx) // Side-step right
y=y+285.206*(1-cos(22.5*pi/180))*(-ly)

a=a-22.5*pi/180 // Turn to face new direction

左に曲がるのは右に曲がるのと同じですが、負の角度になります。

後続のピースを配置するには、この手順を再度実行し、、を計算し、fx現在更新されている値を使用して、次にどのタイプのトラックピースに応じてインクリメントします。fylxlyaxy

あなたが考慮するかもしれないもう一つのポイントがあります。私の経験では、これらの種類のピースで閉ループを形成するトラックを構築することは、通常、90°のターンまたはかなり対称的なレイアウトを作成することに固執する場合に機能します。ただし、完全に結合されていないトラックを作成するのは非常に簡単であり、結合できるようにトラックを変更する方法がわかりません。あなたのプログラムが子供たちに彼ら自身のレイアウトをデザインすることを許すならば、おそらく心に留めておくべき何か。

于 2013-01-16T17:21:05.353 に答える
0

ポイント5は3から2まで等距離ですが、反対方向です。

于 2013-01-16T13:47:47.357 に答える