次の疑似C/Java / C#コードがあります。
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
外積ABxACを計算するにはどうすればよいですか?
次の疑似C/Java / C#コードがあります。
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
外積ABxACを計算するにはどうすればよいですか?
あなたの最後の質問であなたに与えられた解決策は基本的にあなたのすべてのポイントにZ=0を追加します。そのように拡張されたベクトルを使用して、外積を計算します。幾何学的に外積は、計算に使用される2つのベクトルに直交するベクトルを生成します。これは、両方のベクトルがXY平面にあるため、結果にはZ成分のみが含まれるためです。そのzコンポーネントの符号は、そのベクトルがXY平面で上向きか下向きかを示します。その符号は、ABが互いに時計回りまたは反時計回りの順序であることに依存しています。つまり、zコンポーネントの符号は、見ている点がAB上にある線の左側または右側にあるかどうかを示します。
したがって、2つのベクトルの外積AとBがベクトルになります。
AxB = (AyBz − AzBy, AzBx − AxBz, AxBy − AyBx)
AzとBzがゼロの場合、そのベクトルの3番目の成分が残ります。
AxBy - AyBx
Aが点aからbへのベクトルであり、Bが点aからcへのベクトルである場合、
Ax = (b[x]-a[x])
Ay = (b[y]-a[y])
Bx = (c[x]-a[x])
By = (c[y]-a[y])
与える
AxBy - AyBx = (b[x]-a[x])*(c[y]-a[y])-(b[y]-a[y])*(c[x]-a[x])
これはスカラーであり、そのスカラーの符号は、点cがベクトルabの左または右のどちらにあるかを示します。
または、スタックオーバーフローまたはgamedevを確認できます
ABとACの間の角度が鋭角であるか鈍角であるかを尋ねていると仮定すると、次のようになります。
int a[]= { 30, 20 };
int b[] = { 40, 50 };
int c[] = {12, 12};
int ab_x = b[0] - a[0];
int ab_y = b[1] - a[1];
int ac_x = c[0] - a[0];
int ac_x = c[1] - a[1];
int dot = ab_x*ac_x + ab_y*ac_y;
boolean signABxAC = dot > 0; // pick your preferred comparison here
外積はベクトルであり、 「符号」はありません。
スカラー(ドット)積を意味しますか?そうした場合、それはベクトルのペア[a、b、c]•[d、e、f]のようにad + be + cfとして計算されるため、その式の符号は内積の符号になります。
乗算と加算を行わずに符号を理解することは、おそらくそれらを実行するよりも速くはありません。
3つのポイントすべてに2つのコンポーネントしかないため、3つすべてのzコンポーネントはゼロであると想定します。つまり、ベクトルABとBCはxy平面にあるため、外積はz方向を指すベクトルであり、そのx成分とy成分はゼロに等しくなります。
「符号」とは、それが正または負のz方向を指しているかどうかを意味する場合、計算によってそのことがわかります。
あなたの場合、2つのベクトルはAB =(10、30、0)とAC =(-18、-8、0)です。これら2つの外積をとると、ベクトルAB X AC =(0、0、460)が得られます。z成分が正であるため、これは正の符号を持っていると言うつもりですか?はいの場合、それがあなたの答えです。
更新:必要な内積の場合、この場合は負になります。
ABドットAC=-180 -240 + 0=-420。
リンクした質問を読んだところ、外積のz成分の符号が必要なようです(ABとACのz値が0であると仮定)。線ABのどちら側に点Cがあるかを示します。
その場合、必要なのは、ABとACを行とする行列の行列式の符号だけです。
xAB = b[0] - a[0]
yAB = b[1] - a[1]
xAC = c[0] - a[0]
yAC = c[1] - a[1]
detABxAC = (xAB * yAC) - (yAB * xAC)
if (detABxAC < 0)
// sign is negative
elif (detABxAC > 0)
// sign is positive
else
// sign is 0, i.e. C is collinear with A, B