方向ベクトルがあると仮定すると、ここで角度を計算したり、三角関数を使用したりする必要はありません。
var pos_x, pos_y, dir_x, dir_y, target_x, target_y;
if ((pos_x - target_x) * dir_y > (pos_y - target_y) * dir_x) {
// Target lies clockwise
} else {
// Target lies anticlockwise
}
これは、オブジェクトが向いている方向にオブジェクトを通る架空の線を描画し、その線のどちら側にターゲットがあるかを判断するだけです。これは基本的な線形代数であるため、角度から方向ベクトルを計算する必要がない限り、この関数のどこでもなどsin()
を使用する必要はありません。cos()
これも右手座標系を使用します。左手座標系を使用している場合は逆になります。式は同じですが、「時計回り」と「反時計回り」が入れ替わります。
より詳細な説明:この関数は、フォワードベクトル(dir_x, dir_y)
とターゲットへのベクトルの外積を計算し(target_x - pos_x, target_y - pos_y)
ます。結果として得られる外積は、ターゲットが時計回りか反時計回りかに応じて、正または負の擬スカラーになります。
ベクトルのクラッシュコース
ベクトルは、大きさと方向です。たとえば、北に3 km、または下に6センチメートルです。デカルト座標(x、y)を使用してベクトルを表すことも、極座標(r、θ)を使用してベクトルを表すこともできます。どちらの表現も同じベクトルを提供しますが、使用する数値と式は異なります。一般に、極座標ではなくデカルト座標を使用する必要があります。あなたがゲームを書いているなら、極座標はひどくひどいです—それらはあなたのコードをsin()
どこにcos()
でも散らかします。
コードには3つのベクトルが含まれています。
ベクトル(pos_x, pos_y)
は、原点を基準にしたオブジェクトの位置です。
ベクトル(target_x, target_y)
は、原点を基準にしたターゲットの位置です。
ベクトル(dir_x, dir_y)
は、オブジェクトが向いている方向です。