好きなことを書いて自分を愛するブログ

好きなことにとどまらず思考をつらつらと書いたりもする

外積3回による交差判定と交点の導出

これ、何か月か前に苦労して理解したはずなのにまた混乱してしまったので改めて実際の値を使って計算してみた。
そもそも高校の時にろくに勉強しなかったせい(言い訳)でなかなかベクトルの知識や使い方が身についていない。研究テーマにモーメントの計算なんかが大切なのに、毎度混乱してしまう。
というわけで春学期にpythonの初歩を少しだけ教えてもらったおかげで環境が整っていたので、せっかくなのでpythonで計算とグラフの作成をしてみた。


いま線分の交差判定に使っている式は以下のとおり:

  1. 線分AB、CDについて、{\overrightarrow{AB}, \overrightarrow{AC}, \overrightarrow{CD}}の3つのベクトルを作る。
  2. {\overrightarrow{AB} \times \overrightarrow{CD} = C_0}{\overrightarrow{AB}}{\overrightarrow{CD}}が平行か判定。{C_0}が0ならば平行で、交差判定はおしまい。
  3. {\overrightarrow{AC} \times \overrightarrow{AB} = C_a, \overrightarrow{AC} \times \overrightarrow{CD} = C_b}を求める。
  4. {R_0 = C_a/C_0, R_1 = C_b/C_0}により内分比を求める。
  5. 内分比が{0 \leq R_0 \leq 1}かつ{0 \leq R_1 \leq 1}の場合、線分は交差している。
  6. さらに、{\overrightarrow{AB}}{R_1}倍して、点Aの座標値を加えると交点座標が求められる。

ちなみに、3のところでは交差だけでなく接触も含まれてしまうので、私のコードでは<にしてある。なぜかうまく表示されなかったので≦で書いたけど。

まあとにかくこの一連の流れの、特に内分比がいったいAからなのかBからなのかわからなくて実際に計算してみた次第。
点A(4, 2)と点B(6, -2)からなる線分ABと、点C(-2, -4)と点D(8, 0)からなる線分CDが交差しているか計算して、グラフを描いたり交点座標を求めれば内分比がどちらの端からのものなのかわかるでしょうという感じ。いや、絶対にAとCからだとは思うんだけど、実際に見たかったのよ。

そして、pythonのmatplotlibを使って描画したグラフがこちら: f:id:konapower:20170914174616p:plain
はい。交点は(5.5, -1)、内分比は{R_0}{R_1}も0.75でした。
…高校生か、もはや中学生かというレベルの計算。いやでも、外積を習うのは高校生だったかな?あれ大学…?
とりあえず、視覚的にも値的にも導出される内分比はAとC側の値だったということがわかりました!


という感じ。pythonのヘッダーとかいろんな宣言とか書かないでいきなり式を書き始められるのはとっても手軽でいいなと思いました。グラフを描くのも簡単。プラグラミングをしている感覚もなく(?)楽しくお絵かきしている感じでした。
私の使っているDelphiは…GUIを作るのが簡単かな…。
あと初めてMarkdowntexを使って記事を書いたけど、とてもめんどくさい。ブロガーというものがお仕事になるのもうなずける。
そして研究は進まない。