4

画面上を移動する三角形(二等辺三角形)を作成しようとしていますが、同時に、ユーザーが方向キー(右または左など)を押すと、それをわずかに回転させます。

三角形のノーズ(頂点)が常に三角形をリードしてほしいです。(あの古い小惑星ゲームのように)。

私の問題は、この背後にある数学にあります。X時間間隔ごとに、三角形を「ある方向」に移動させたいのですが、この方向を見つけるのに助けが必要です(xおよびyの増分/減分)。

三角形の中心点 (セントロイド) を見つけることができ、一番上の x 点と y 点があるので、使用する線ベクトルはありますが、「どのように」作業するかについての手がかりはありません。

古い Sin と Cos の方法と、三角形が回転した量 (角度) に関係があると思いますが、その点については少しさびています。

どんな助けでも大歓迎です。

4

9 に答える 9

5

vy/vx のアークタンジェント (逆タンジェント) は、vx と vy が (重心 -> 先端) ベクトルのコンポーネントであり、ベクトルが向いている角度を示します。

ただし、古典的な逆正接は、-90° < r < +90° 度に正規化された角度を与えるため、結果の符号と vx の符号に応じて、結果に 90 度を加算または減算する必要があります。

幸いなことに、標準ライブラリには、vx と vy を個別にパラメーターとして取り、0° から 360° または -180° から +180° の角度を返す atan2() 関数が含まれているはずです。また、vx=0 の特殊なケースも扱います。注意しないと、0 による除算になります。

http://www.arctangent.net/atan.htmlを参照するか、「arctangent」を検索してください。

編集: わかりやすくするために投稿では度数を使用しましたが、Java および他の多くの言語/ライブラリは 180° = π であるラジアンで動作します。

三角形のポイントに vx と vy を追加して「前方」方向に移動させることもできますが、ベクトルが正規化されていることを確認してください (vx² + vy² = 1)。そうしないと、速度は三角形のサイズによって異なります。

于 2008-10-21T01:05:17.440 に答える
4

さらにいくつかあります:

ベクトルは変位を表します。変位、並進、移動、またはあなたがそれを呼びたいものは何でも、開始点がなければ意味がありません.重心点の x/y コンポーネントは意味がありません。これらのコンポーネントは、原点からの重心点の変位を示します。つまり、pOrigin + vCentroid = pCentroid です。0 点から開始し、重心点の変位を表すベクトルを追加すると、重心点が得られます。

ご了承ください:

ベクトル + ベクトル = ベクトル
(2 つの変位を加算すると、3 つ目の異なる変位が得られます)

ポイント + ベクトル = ポイント
(ポイントを移動/移動すると、別のポイントが得られます)

ポイント + ポイント = ???
(2 つのポイントを追加することは意味がありません;ただし:)

ポイント - ポイント = ベクトル
(2 つのポイントの差は、それらの間の変位です)

さて、これらの変位は (少なくとも) 2 つの異なる方法で考えることができます。あなたが既によく知っているのは直角(x, y) システムで、ベクトルの 2 つのコンポーネントがそれぞれ x 方向と y 方向の変位を表します。ただし、極座標(r, Θ)も使用できます。ここで、Θ は変位の方向 (任意のゼロ角度に対する角度) を表し、r は距離を表します。

たとえば、(1, 1) ベクトルを考えてみましょう。これは、私たちが見慣れている座標系で右に 1 単位、上に 1 単位移動することを表します。このベクトルの極座標は (1.414, 45°) です。同じ動きですが、「角度 45° の方向への 1.414 単位の変位」として表されます。

極座標と直角座標の関係は次のとおりです。

Θ = atan2(y, x)
r = sqrt(x²+y²) (直角三角形がどこに来るかわかりましたか?)

逆に、

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

ここで、三角形の重心から「先端」コーナーまで引かれた線分は、三角形が「向いている」方向を表すため、その線に平行なベクトルを取得する場合 (例: vForward = pTip - pCentroid )、そのベクトルのΘ 座標は、三角形が向いている角度に対応します。

(1, 1) ベクトルをもう一度取ります。これが vForward の場合、「先端」ポイントの x 座標と y 座標は両方とも重心の座標よりも 1 大きいことを意味します。重心が (10, 10) にあるとしましょう。これにより、「先端」コーナーが (11, 11) に配置されます。(前の式の両辺に "+ pCentroid" を追加することで、 pTip = pCentroid + vForwardを覚えておいてください。) さて、この三角形はどちらの方向を向いているでしょうか? 45°ですよね?これが (1, 1) ベクトルの Θ 座標です!

于 2008-10-22T00:32:02.360 に答える
4

@マーク:

この回答ボックスでベクトル、座標、点、角度についての入門書を 2 回書いてみましたが、時間がかかりすぎるため、どちらの場合も気が変わりました。できます。

重心と「先端」座標はベクトルではありません。つまり、それらをベクトルとして考えても何も得られません。

必要なベクトル vForward = pTip - pCentroid は、重心点から「先端」コーナーの座標を差し引くことで計算できます。このベクトルの atan2()、つまり atan2(tipY-centY, tipX-centX) は、三角形が「向いている」角度を示します。

それが何に関連しているかについては、問題ではありません。あなたのライブラリはおそらく、増加する X 軸 (---> おそらくあなたが見たすべての 2D グラフの右/東方向) が 0° または 0π であるという規則を使用するでしょう。増加する Y (上、北) 方向は、90° または (1/2)π に対応します。

于 2008-10-21T12:54:41.067 に答える
4

三角形の回転角度と、おそらく現在の速度を保存する必要があるようです。

x' = x + speed * cos(angle)
y' = y + speed * sin(angle)

角度は度ではなくラジアンであることに注意してください。

ラジアン = 度 * RadiansInACircle / DegreesInACircle

RadiansInACircle = 2 * Pi

DegressInACircle = 360

頂点の位置については、それぞれが中心から特定の距離と角度に配置されています。この計算を行う前に、現在の回転角度を追加します。動きを計算するのと同じ数学です。

于 2008-10-21T01:08:23.847 に答える
2

重心を原点に保ちます。重心から鼻までのベクトルを方向ベクトルとして使用します。http://en.wikipedia.org/wiki/Coordinate_rotation#Two_dimensionsはこのベクトルを回転させます。このベクトルから他の 2 点を作成します。3 点を画面上の位置に変換して描画します。

于 2008-10-21T01:25:12.660 に答える
0

結果を得るには、一般的な2D回転式を三角形に適用する必要があることがわかります。ここでは、さまざまなコンポーネント間の関係に少し問題があります。

aibは、次のように述べています。

vy / vxのアークタンジェント(逆タンジェント)。vxとvyは(図心->先端)ベクトルのコンポーネントであり、ベクトルが向いている角度を示します。

vxとvyは、セントリオッドまたはチップのx座標とy座標ですか?ここでの「ベクトル」の用語については混乱していると思います。ベクトルは、方向を表す2D(この場合)空間の単なる点であるという印象を受けました。

したがって、この場合、重心->チップのベクトルはどのように計算されますか?それはただのセントリオッドですか?

meyahoocomlorenpechtelは次のように述べています。

三角形の回転角と、おそらく現在の速度を保存する必要があるように思われます。

相対回転角はどれくらいですか?三角形の原点ですか、それともゲームウィンドウ自体ですか?また、将来の回転では、角度は最後の回転からの角度ですか、それとも三角形の元の位置ですか?

これまでの助けに感謝します、本当に感謝しています!

于 2008-10-21T04:24:02.393 に答える
0

目的の効果を実現するには、最上部の頂点を図心にする必要があります。

于 2008-10-21T04:30:56.963 に答える
0

まず、重心を計算するのではなく、重心から始めます。重心の位置と三角形の回転角度がわかっているので、これを使用して頂点の位置を計算します。(構文エラーについては事前にお詫びします。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 は上に行くほど大きくなりますが、画面座標はそのようには機能しません。

回転角度を導出するのではなく、位置と回転角度として物事を追跡すると、計算ははるかに簡単になります。

また、最後のコードでは、回転角度によって位置を変更しています。その結果、船は更新サイクルごとに回転角度だけ回転します。猫がしっぽを追うのではなく、小惑星のようなものが目的だと思います!

于 2008-10-30T05:14:08.397 に答える
0
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);
于 2008-10-21T01:11:24.637 に答える