2012-05-11 2 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

앞에서 언급했듯이 두 라인은 단일 지점에서 만나지 않을 수 있습니다. 일반적으로 할 수있는 최선의 방법은 line1에서 line2와 가장 가까운 지점을 찾는 것입니다. 이 두 지점을 연결하여 일반적인 일반 방향을 만듭니다.

을 감안할 때 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. 호선 따라 분리 돌기 t1=Dot(r2-r1,e1)t2=Dot(r2-r1,e2)
  4. 찾기 거리를 찾아 호선 d2 = (t2-u*t1)/(u*u-1)
  5. 따라 d1 = (t1-u*t2)/(1-u*u)
  6. 찾기 거리 호선 p2=Add(r2,Scale(d2,e2))

의 점을 찾아 호선 p1=Add(r1,Scale(d1,e1))

  • 의 점을 찾아 참고 : 단위 벡터로 방향이 있어야합니다 (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은 방향 벡터입니다 (0이 아닌 교차 곱을 가진 좌표 쌍을 고려하십시오).

    그렇지 않은 경우 먼저 skew lines 사이의 거리를 계산해야합니다. 거리가 0이면 교차점을 찾을 수 있습니다.

    관련 문제