質問
画面上を移動する三角形(二等辺三角形)を作成すると同時に、ユーザーが方向キー(右または左など)を押したときに画面をわずかに回転させようとしています。
三角形の先端(頂点)が常に三角形をリードするようにします。 (その古い小惑星ゲームのように)。
私の問題は、この背後にある数学にあります。 X時間間隔ごとに、三角形を<!> quot; some direction <!> quot;に移動させたいので、この方向(xとyの増分/減分)を見つけるのに助けが必要です。
三角形の中心点(セントロイド)を見つけることができ、一番上のxおよびy点があるので、作業する線ベクトルがありますが、<!> quot; how < !> quot;それで動作します。
古いSinメソッドとCosメソッド、および三角形が回転した量(角度)と関係があると思いますが、その点については少しさびています。
ご協力ありがとうございます。
解決
vxとvyが(centroid-<!> gt; tip)ベクトルのコンポーネントであるvy / vxのアークタンジェント(逆タンジェント)は、ベクトルが向いている角度を示します。
古典的なアークタンジェントは、-90 <!>#176;に正規化された角度を提供します。 <!> lt; r <!> lt; +90 <!>#176;ただし、結果の符号とvxの符号に応じて、結果に90度を加算または減算する必要があります。
幸いなことに、標準ライブラリは、パラメータとしてvxとvyを別々に取り、0 <!>#176の間の角度を返すatan2()関数を提供する必要があります。および360 <!>#176;または-180 <!>#176;および+180 <!>#176;度。また、vx = 0の特殊なケースも処理します。これは、注意しないとゼロによる除算になります。
http://www.arctangent.net/atan.html を参照するか、単に検索する<!> quot; arctangent <!> quot;。
編集:わかりやすくするために投稿で学位を使用しましたが、Javaおよび他の多くの言語/ライブラリーは180 <!>#176; = <!>#960;。
vxとvyを三角形のポイントに追加して、<!> quot; forward <!> quot;内で移動させることもできます。方向ですが、ベクトルが正規化されていることを確認してください(vx <!>#178; + vy <!>#178; = 1)、そうでない場合、速度は三角形のサイズに依存します。
他のヒント
@Mark:
この回答ボックスのベクトル、座標、ポイント、および角度に関する入門書を2回書いてみましたが、時間がかかりすぎて、物事を説明するチュートリアルがたくさんあるので、両方の機会に気が変わりました私がこれまで以上に優れています。
あなたの重心と<!> quot; tip <!> quot;座標はベクトルではありません。つまり、それらをベクトルと考えることから得られるものは何もありません。
必要なベクトルvForward = pTip-pCentroidは、<!> quot; tip <!> quot;の座標を引くことで計算できます。重心点からの角。このベクトルのatan2()、つまりatan2(tipY-centY、tipX-centX)は、三角形が<!> quot; facing <!> quot;。
である角度を示します。相対的なものに関しては、問題ではありません。あなたのライブラリは、おそらく、増加するX軸(--- <!> gt;おそらくあなたが見たすべての2Dグラフの右/東方向)が0 <!>#176;という規則を使用するでしょう。または0 <!>#960;。増加するY(上、北)方向は90 <!>#176に対応します。または(1/2)<!>#960;。
私は、三角形の回転角度とおそらく現在の速度を保存する必要があるように思えます。
x' = x + speed * cos(angle)
y' = y + speed * sin(angle)
角度は度ではなくラジアンであることに注意してください!
ラジアン=度* RadiansInACircle / DegreesInACircle
RadiansInACircle = 2 * Pi
DegressInACircle = 360
頂点の位置については、それぞれが中心から特定の距離と角度で配置されています。この計算を行う前に、現在の回転角度を追加します。それは動きを理解するのと同じ数学です。
さらにいくつかあります:
ベクトルは変位を表します。変位、翻訳、移動、またはあなたがそれを呼び出したいものは何でも、出発点なしでは無意味です。だから私は<!> quot; forward <!> quot;を参照しました。上記のベクトルは<!> quot;重心から、<!> quot;そして、それが<!> quot; centroid vector、<!> quot;重心点のx / y成分を含むベクトルは意味がありません。これらのコンポーネントは、原点からの重心点の変位を提供します。つまり、pOrigin + vCentroid = pCentroidです。 0点から開始し、図心点の変位を表すベクトルを追加すると、図心点が得られます。
注意:
vector + vector = vector
(2つの変位を追加すると、3番目の異なる変位が得られます)
ポイント+ベクトル=ポイント
(ポイントを移動/移動すると、別のポイントが得られます)
ポイント+ポイント= ???
(2つのポイントを追加しても意味がありません。ただし、:)
ポイント-ポイント=ベクトル
(2点の差は、それらの間の変位です)
現在、これらの変位は(少なくとも)2つの異なる方法で考えることができます。既によく知っているのは rectangular (x、y)システムです。このシステムでは、ベクトルの2つのコンポーネントがそれぞれx方向とy方向の変位を表します。ただし、 polar 座標(r、<!>#920;)も使用できます。ここでは、<!>#920;変位の方向(任意のゼロ角に対する角度)とr、距離を表します。
たとえば、(1、1)ベクトルを取得します。これは、私たちが見慣れている座標系で1単位右に1単位上に移動することを表しています。このベクトルの極座標は(1.414、45 <!>#176;);同じ動きですが、<!> quot; 45 <!>#176;角度方向の1.414単位の変位として表されます。 (繰り返しますが、東方向が0 <!>#176で、角度が反時計回りに増加する便利な極座標システムを使用します。)
極座標と直交座標の関係は次のとおりです。
<!>#920; = atan2(y、x)
r = sqrt(x <!>#178; + y <!>#178;)(今、直角三角形の位置がわかりますか?)
そして逆に、
x = r * cos(<!>#920;)
y = r * sin(<!>#920;)
今、三角形の重心から<!> quot; tip <!> quot;に描かれた線分コーナーは、三角形が<!> quot;対面する、<!> quot;の方向を表します。その線に平行なベクトルを取得する場合(たとえば、 vForward = pTip-pCentroid )、そのベクトルの<!>#920;-座標は、三角形が向いている角度に対応します。
(1、1)ベクトルを再度取得します。これがvForwardである場合、<!> quot; tip <!> quot;ポイントのx座標とy座標は、どちらも重心の座標より1大きくなりました。重心が(10、10)にあるとしましょう。 <!> quot; tip <!> quot; (11、11)のコーナー。 (前の方程式の両側に<!> quot; + pCentroid <!> quot;を追加することにより、 pTip = pCentroid + vForward を覚えておいてください。)この三角形はどの方向を向いていますか? 45 <!>#176 ;、そうですか?これが<!>#920;-(1、1)ベクトルの座標です!
重心を原点に保ちます。重心から鼻までのベクトルを方向ベクトルとして使用します。 http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensions はこれを回転させますベクター。このベクトルから他の2点を作成します。 3点を画面上の位置に変換して描画します。
double v; // velocity
double theta; // direction of travel (angle)
double dt; // time elapsed
// To compute increments
double dx = v*dt*cos(theta);
double dy = v*dt*sin(theta);
// To compute position of the top of the triangle
double size; // distance between centroid and top
double top_x = x + size*cos(theta);
double top_y = y + size*sin(theta);
結果を得るには、一般的な2d回転式を三角形に適用する必要があることがわかります。ここでは、さまざまなコンポーネント間の関係に少し問題があります。
aib 、次のように述べました:
の逆正接(逆正接) vy / vx、vxとvyは (centroid-<!> gt; tip)のコンポーネント ベクトル、ベクトルの角度を与える 直面しています。
vxとvyは、centriodまたはtipのxおよびy座標ですか?私は<!> quot; vector <!> quotの用語に関して混乱していると思います。ここに。ベクターは、方向を表す2D(この場合)空間の単なるポイントであるという印象を受けました。
では、この場合、重心-<!> gt; tipのベクトルはどのように計算されますか?それはただの中心ですか?
meyahoocomlorenpechtel の説明:
あなたには保存する必要があるようです 三角形の回転角度と おそらく現在の速度です。
相対的な回転角は?三角形の原点、またはゲームウィンドウ自体?また、将来の回転では、角度は最後の回転からの角度ですか、それとも三角形の元の位置ですか?
これまでの支援に感謝します。本当に感謝しています!
目的の効果を得るには、最上部の頂点を重心にする必要があります。
最初に、計算するのではなく重心から始めます。重心の位置と三角形の回転角度がわかっているので、これを使用して頂点の位置を計算します。 (構文エラーについては事前におaび申し上げます。Javaに手を出し始めたところです。)
//開始点
double tip_x = 10;
double tip_y = 10;
should be
double center_x = 10;
double center_y = 10;
//三角形の詳細
int width = 6; //base
int height = 9;
3つの角度と距離のペアの配列でなければなりません。
angle = rotation_angle + vertex[1].angle;
dist = vertex[1].distance;
p1_x = center_x + math.cos(angle) * dist;
p1_y = center_y - math.sin(angle) * dist;
// and the same for the other two points
Y距離を減算していることに注意してください。画面スペースが反転しているという事実につまずいています。私たちの考えでは、Yが上がるとYが増加しますが、画面座標はそのようには動作しません。
回転角を導出するのではなく、位置と回転角として物事を追跡する場合、数学ははるかに簡単です。
また、最後のコードでは、回転角度によって位置を変更しています。その結果、更新サイクルごとに船が回転角だけ回転します。目的は小惑星のようなものであり、猫が尾を追いかけているのではないことです!