■点群の凸包および最小包含円を求める(JavaScript版)

 凸包(とつほう、convex hull)とは平面上の点群を包む最小の凸多角形です。
 また、最小包含円とは点群を含む最小の円です。

 ここでは、任意に与えられた点群に対して凸包 および 最小包含円を算出し、表示します。
 ・点群をマウス入力する。
 ・「凸包を求める」ボタン または 「最小包含円を求める」ボタンを押す。
 ・データのクリア、自動生成も可能。


点群No.表示 凸包点No.表示


  ●計算方法
・凸包の計算方法
 convex0.jpg
n個の点 (xi, yi),i=1,2,..,n に対して、
(1)y座標が最小の点を見つけ、Q1とする [上図では点5]。
(2)点Q1から残りの点を結ぶ線分のx軸に対する角度θを計算し、
   θ最小の点を求める ->Q2とする[上図では点4]。
(3)点Q2から残りの点を結ぶ線分のベクトルQ1Q2に対する角度θを計算し、
   θ最小の点を求める ->Q3とする[上図では点12]。
(4)以後、Q2、Q3をQ1、Q2と置き換えて(3)の処理を繰り返す。
(5)最初の点に戻ったら終了。

・最小包含円の計算方法
(1)凸包を求める(処理時間短縮のため)。
(2)凸包を構成する点群に対して、次の処理を行う。
 (2-1)任意の3点に対する最小包含円を求める。
   ・鋭角3角形のときはその外心(各辺の垂直2等分線の交点)
   ・鈍角3角形のときは鈍角の対辺の中点
 (2-2)他の点が上の最小包含円に含まれるかチェックする。
   ・すべて含まれればそれが求める最小包含円である。
   ・そうでなければ、新たな3点を選び、(2-1)に戻る。
ホーム