2012-05-11 14 views
0

2つのベクトルがあり、それぞれが2 Point3D(原点と方向)で定義されています。私は彼らの交差点のポイントを見つける必要があります。 少しでも助けが歓迎されます。 私は誤った出力を与える私の機能を投稿します。3Dベクトル交差のアルゴリズムが必要

public static CurvIntersect3D Intersect2Linii3D (Vector3D dr1, Vector3D dr2) { 
    CurvIntersect3D result = new CurvIntersect3D(0, null); 

    double x = Math3D.VectorNorm3D(dr1.getDirectie()); 
    double t = Math3D.VectorNorm3D(dr2.getDirectie()); 
    double cosa = (dr1.getDirectie().getX()*dr2.getDirectie().getX() + dr1.getDirectie().getY()*dr2.getDirectie().getY() + dr1.getDirectie().getZ()*dr2.getDirectie().getZ())/(t*x); 
    Punct3D p1 = dr1.getOrigine(); 
    Punct3D p2 = new Punct3D(), p3 = new Punct3D(); 
    for (int i=0; i<3; i++) 
    { 
     p2.set(i, dr1.getOrigine().get(i) + dr1.getDirectie().get(i)); 
     p3.set(i, dr1.getOrigine().get(i) + dr2.getDirectie().get(i)); 
    } 

    Matrici.Matrice3x3 rot = Math3D.GetMatriceRotatie(p1, p2, p3); 
    Punct3D orig = new Punct3D(); 
    for (int i=0; i<3; i++) 
     orig.set(i, rot.getElement(i, 0) * (dr2.getOrigine().getX()-dr1.getOrigine().getX()) + 
        rot.getElement(i, 1) * (dr2.getOrigine().getY()-dr1.getOrigine().getY()) + 
        rot.getElement(i, 2) * (dr2.getOrigine().getZ()-dr1.getOrigine().getZ())); 

    x = orig.getY() - orig.getZ()* cosa/Math.sqrt(1 - cosa*cosa); 
    p1 = new Punct3D(); 
    for (int i=0; i<3; i++) 
     p1.set(i, dr1.getOrigine().get(i) + x*dr1.getDirectie().get(i)); 
    result.setCount(1); 
    result.add(p1); 
    return result; 
} 

CurvIntersec3Dは、点の配列とその長さを格納する構造体です。

+1

原点と方向を指定し、ベクトルではなく線を指定しています。 – ja72

答えて

6

前述したように、2つのラインは1つのポイントで会わないことがあります。あなたが一般的にできることは、line1にline2に最も近い点とその逆を見つけることです。これらの2点を接続して共通法線の方向を作成します。

考えると3Dポイントr1=[r1x,r1y,r1z]r2=[r2x,r2y,r2z]を通過すると、あなたは、このような他のラインに最も近いライン上の点を見つけることができますe2=[e2x,e2y,e2z]単位方向e1=[e1x,e1y,e1z]を有し、かつ二行:

  1. は方向投影を検索しu=Dot(e1,e2)=e1x*e2x+e1y*e2y+e1z*e2z
  2. u==1の場合、線は平行です。交差点は存在しません。
  3. LINE2 d2 = (t2-u*t1)/(u*u-1)
  4. 沿っLINE1 d1 = (t1-u*t2)/(1-u*u)
  5. 検索距離に沿って分離突起t1=Dot(r2-r1,e1)t2=Dot(r2-r1,e2)
  6. 検索距離はLINE1 p1=Add(r1,Scale(d1,e1))
  7. 上の点がLINE2 p2=Add(r2,Scale(d2,e2))

上のポイントを探す検索注:方向ベクトルはDot(e1,e1)=1とでなければなりません。 関数Dot()はベクトル内積です。関数Add()はベクトルの成分を加算し、関数Scale()はベクトルの成分を数値に乗算します。

幸運。

+0

グッドキャッチ、 'u == 1 'のときは線が平行です。私はその投稿を修正した。 – ja72

0

あなたのラインに交差がありますか?

ことが保証されている場合、問題はかなり単純です:、ラインのパラメトリック方程式を取得し、これらのような2つの線形方程式系を解く:

A_X0 + T * A_Dir_X = B_X0 + U * B_DirX、X0 Dirは方向ベクトルです(ゼロ以外の外積を持つ任意の座標ペアを考慮に入れてください)

もしそうでなければ、最初にskew linesの間の距離を計算する必要があります。距離がゼロの場合、交点を見つけることができます。

関連する問題