Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[数学][C]直線交差点

[数学]捻じれて縺れてこんがらかるの続き、計算編です。

まず、お互いの直線をベクトルと見なし、その外積を求めます。
この外積は何を意味するかというと、前回の平行な面における法線となっています。

 

この法線がわかれば、平行な面どうしの距離を計算する事が出ケイます。
それぞれの面から適当な点を1つづつ取り、bの面からaの面へ向かうベクトルを作ります。

この時、cと法線ベクトルの内積を求めれば、お互いの面の距離がわかります。
内積は、あるベクトル成分をどれだけ持っているか、という計算にも使えるわけです。

この辺のからくりがわからなくても、cと法線ベクトルが直角ならば、
aの面とbの面がぴったりくっついている、というのがわかればいいです。

ということで、こんな感じのソースになります。

int LineHitCheck(const Vec3 &a1, const Vec3 &a2, const  Vec3 &b1, const Vec3 &b2){
  Vec3 va = a1 - a2;
  Vec3 vb = b1 - b2;
  Vec3 nv = outer(va, vb);
  Vec3 vc = a1 - b1;

  if (nv.x == 0 && nv.y == 0 && nv.z == 0){
    // 平行or同一の場合
    Vec3 nv2 = outer(va, vc);
    if (nv2.x == 0 && nv2.y == 0 && nv2.z == 0){
      return 同一;
    }else{
      return 平行;
    }
  }else{
    // 交差orねじれの場合
    if (inner(vc, nv) == 0){
      return 交差;
    }else{
      return ねじれ;
    }
  }
}

平行だったときの場合は飛ばしましたが、直線Aと直線Bが同一ということは、
直線B上にあるすべての点が直線A上にあるということです。
ですから、直線Aの一点と直線Bの一点を結ぶベクトルは、常に直線Aベクトルと0度or180度であり、
外積を求めると必ず零ベクトルになります。

ねじれの直線の距離は、法線ベクトルを正規化してcベクトルとの内積を求めると出ます。
カプセルの当たり判定で求める事があるかもしれません。

投稿日時 : 2009年10月14日 20:44

Feedback

# LhGNMXaQkFY 2011/12/13 20:39 http://www.drinkershealth.net/antabuse-disulfiram/

Very amusing thoughts, well told, everything is in its place:D

# If your articles are alawys this helpful, "I'll be back." 2012/10/20 20:55 Pankaj

If your articles are alawys this helpful, "I'll be back."

タイトル
名前
Url
コメント