アトリエ ぺっぺ

トップページ > プログラムTips > 平面での線と点の位置関係

◆ 平面での線と点の位置関係
線と点の位置関係が知りたいときがあります。
この点は、線の右側にあるのか、左側にあるのか・・?
そのような場合は、以下のようにして位置関係を調べることができます。
 
■ 必要な情報:
  ○ 線上の任意の2点 pt1(x1,y1) pt2(x2,Y2)
  ○ 点 pt(x,y)
   ※ 線ではなく線分であれば、任意の2点に始終点を使用してもよいでしょう。
 
    // 準備の計算
    vx1 = x2 - x1;
    vy1 = y2 - y1;
    vx2 = x - x1;
    vy2 = y - y1;
    // 判断用の値
    ans = vx1 * vy2 - vy1 * vx2;
このansの正負で、線のどちら側にあるかを調べることができます。
 
 |・
 
と、
 
・|
 
のときでは、正負が逆転する、ということですね。
 
※ 解説
この例では、ベクトルの外積計算を使っています。
 
本来、外積は3次元での道具で、ベクトルの外積計算を行うと、その2つのベクトルに垂直なベクトルが算出できます。
上の例では、準備の計算で2つのベクトルを作成しています。
具体的に書くと、線上の点1を基準として、そこから
@線上の点2へのベクトル
A計測点へのベクトル
を作成しています。イメージできない場合は絵に書いてみてください。私は絵ばっかり描いてます・・
 
さて、この準備した2つのベクトルは2次元でのベクトルなので、Z成分を0と考えて3次元座標に移すと、XY平面に平行なベクトルになります。
これらのベクトルに垂直なベクトル、というと、XY平面に対して垂直なベクトルということになります。
 
これがZの+方向に向くか−方向に向くかは、外積を出すときの2つベクトルの位置関係によります。
ベクトル1、2が時計回りの位置関係であれば−、反時計回りであれば+の方向に向かうベクトルになります。
上記のansの部分は、外積計算で取得できるベクトルのZ成分のみを計算しています。
 
ちなみに、X、Y成分の計算は以下のようになります。
ここでのvz1、vz2は2つのベクトルそれぞれのZ成分ですが、XY平面に平行なベクトルなので、値は0となります。
 
    ansX = vy1 * vz2 - vz1 * vy2;
    ansY = vz1 * vx2 - vx1 * vz2;
3Dゲーム等を作成する場合は別ですが、ディスプレイが平面である、という構造上、
このような2次元計算でのテクニックを知っているだけで結構プログラミングが楽になる場合もあります。
 

(C) 2002 atelier-peppe
ababa@atelier-peppe.sakura.ne.jp