2007-07-02-01-円周通過判定 - その2 - project-enigma

2007-07-02-01-円周通過判定 - その2

>> Site top >> weblog >> 月別アーカイブ >> 2007年07月のlog >> 2007-07-02-01-円周通過判定 - その2

最終更新日付:2014/01/02 00:00:00


円周通過判定 - その2

2007 年 07 月 02 日

昨日書いた「円周通過判定」ですが、実際にあの方法で算出しようとするとかなり面倒なことがわかりました。というわけで他の方法を探ってみましたよ。

結局のところ、垂線を引いて線分との交点を求める...というのが面倒でたまらないわけです。知りたいのは交点の座標ではなくその垂線の距離だけなのですから、他にもっと楽な方法があればそれに越したことはありません。というか、あって欲しいものです...というわけで、昨日の図(とほぼ同じもの)をじっと見つめてみましょう。

さて、点 A、B、O それぞれの座標はわかっています。線分ABの長さもそこから計算できます。三角形の面積は、「底辺×高さ÷2」でしたよね。ということは、A-B-O が作る三角形の面積を求めるためには、h を知る必要があるということ。しかし、それは逆に言えば、三角形の面積がわかっていれば h がわかるということでもあります。「底辺×高さ÷2」以外の方法で面積を求める方法があるのか? あるんですね。

それは、「ヘロンの公式」というものだそうで、そういえば高校生くらいのときに聞いたことがあったような気がします。三角形の3辺の長さだけから面積を導けるという、それはそれは魔法のような公式であります。ちょっと図を変えて、式をのっけておきます。

コレを使って、「 底辺×高さ÷2 」 の公式と絡めてあげれば高さがわかりますね。こちらの方が何倍も楽に現実的な値が得られそうです。良かった良かった。

 

コメント

EIJ - 07/03/2007 12:04:20 AM

多分一番シンプルなhの計算法は

h = |AO × AB| / |AB|

です。AO,ABはベクトル、×は外積、|x|はベクトルxの大きさを意味しています。ベクトルの成分が与えられる場合は外積の計算が簡単なのでこれが一番早いです。

また、OからABにおろした垂線の足が線分ABに含まれているかの判定は内積でできます。

すべてのケースで距離を求める式は結局

if( AO・AB <= 0 ) {
    h = |AO|;
} else if( BO・BA <= 0 ) {
    h = |BO|;
} else {
    h = |AO × AB| / |AB|;
}

になります、・はベクトルの内積を表しています

陰郎 - 07/03/2007 09:01:52 PM

あー、EIJさん、ありがとうございます。

内積、学生時代にやりましたねぇ...指摘頂くまで意識をかすりもしませんでした。(汗  ネットを「衝突判定」とかで検索すると、ゲームなんかでの判定処理の王道なんですね(ちなみに陰郎は大学が文系なので、外積はやっていません...)。

とはいえ、自分の頭に染み込むにはちょっと時間がかかりそうです。じっくり考えてから取り入れてみようと思います。

このページにコメントする

 

このページのタグ

Page tag : 開発

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.