スポンサーリンク

二次元の三角形の内外判定

http://www.thothchildren.com/chapter/5b267a436298160664e80763

上記サイトはC言語のサンプルが載っている今時珍しいサイトでお世話になっているのだが一カ所致命的なミスがある。コメントしたいがログイン式になっていてできないので代わりにここに書いておきたい。

以下、上記サイトのベクトルの係数による解法の修正版

template<typename real_t>
inline bool isInTheTriangle(
  real_t px,  real_t py,
  real_t p0x, real_t p0y,
  real_t p1x, real_t p1y,
  real_t p2x, real_t p2y
) {
  real_t Area = 0.5 * (-p1y * p2x + p0y * (-p1x + p2x) + p0x * (p1y - p2y) + p1x * p2y);

  real_t s = 1.0 / (2.0 * Area) * (p0y * p2x - p0x * p2y + (p2y - p0y) * px + (p0x - p2x) * py);
  real_t t = 1.0 / (2.0 * Area) * (p0x * p1y - p0y * p1x + (p0y - p1y) * px + (p1x - p0x) * py);

  if (
    (0 < s) && (s < 1) &&
    (0 < t) && (t < 1) &&
    (0 < (1 - s - t)) &&
    ((1 - s - t) < 1)
    ) {
    return true;
  }
  else {
    return false;
  }
}

ついでにテンプレート化も施した。

C言語の比較演算子は左結合で、左から右に向かって零,非零の値に変換していく。従って 0 < a < b という形の比較ができない。必ず (0<a)&&(a<b)と書かなければいけない。めんどくさいがそうなのだ。

 

ちなみに外積を使ったやり方の方は問題ない。

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: