プチコンまとめWiki (初代/mkII)

内積・外積の使い方

内積・外積とは

内積も外積も高校の数学で習うかもしれない計算方法のことです。(掛け算の仲間です)。 なので、難しく話すといくらでも難しくなりますが、プチコンプログラマにとっては意味は分からなくても高速化できるかもしれない計算テクニックにすぎません。

計算方法

内積・外積は2つのベクトルの掛け算にあたります。
ベクトルとは長さと向きを持った数のことで、要はX軸方向の値と、Y軸方向の値をまとめて1つの数とみなしたものです。

説明上の変数定義

以下の、変数を使って説明します。

VECT.PNG
A掛けられる側のベクトル
B掛ける側のベクトル
AxベクトルAのX軸方向の長さ
AyベクトルAのY軸方向の長さ
BxベクトルBのX軸方向の長さ
ByベクトルBのY軸方向の長さ
RベクトルBからAへの角度

定義

以下に内積と外積の定義になります。そして定義からゴチャゴチャした計算をした結果、以下の計算結果になります。

定義計算結果
内積|A||B|cos(R)Ax*Bx + Ay*By
外積|A||B|sin(R)Ax*By - Ay*Bx

|A|と|B|はベクトルの長さのことです。
cosとsinの詳細が知りたいときは三角関数の使い方をご覧ください。

ここで、この計算で求められた値にどんな意味があるんだろう?とか、考えちゃダメです。
重要なのは定義と計算結果が一致するということです。
|A|と|B|は絶対にプラスの値なので、三角関数と計算結果の符号が一致します。つまり

内積SGN(cos(R)) == SGN(Ax*Bx + Ay*By)
外積SGN(sin(R)) == SGN(Ax*By - Ay*Bx)

が、成り立ちます。 要するに内積を求めるとcosの、外積を求めるとsinの符号が分かるということです。

sin・cosの符号

では、sin・cosの符号が分かると何がうれしいのでしょうか?
それは、角度Rの大まかな値が分かるということです。 sin・cosは角度によってこのように変化します。

SINCOS.PNG

角度はラジアンで表してあります。ラジアンについても三角関数の使い方をご覧ください。

このようにsin・cosの値はπ/2(90°)単位で変化するので、大まかな前後左右が判断できます。

Bから見たAの方向
左後左前右前右後
内積-0+++0--
外積---0+++0

注意事項

  • この説明はプチコン画面のXY上限定での説明をしています。3次元だったりY座標が上を向いていたりすると色々合わない部分が出てきます。
  • コードの読みやすさは内積・外積を使うよりATANを使ったほうが圧倒的に高いです。速度の問題がない場合はATANを使った方が良いかもしれません。
  • プチコンの場合、他のプログラム環境と比べると三角関数は比較的速く、四則演算は比較的遅く感じます。単純な計算の場合、まだ内積・外積の方が高速ですが、前後の処理が大きく変わってしまう場合は逆転する可能性もあります。

CHECKER FLAG (ひとことコメント)

コメントがあれば一言どうぞ。(作品に直接関係ない質問や雑談は掲示板へ)


表示モード : [ スマホ・3DS対応表示 | クラシック表示 ]
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team. License is GPL. Based on "PukiWiki" 1.3 by yu-ji
ページの処理時間 : 0.090 秒 | このページの最終更新 : 2022/09/20 (火) 12:43:55 (565d) | ログイン
Copyright(C) 2011-2014 プチコンまとめWiki ◆1sxkymI8ji30