Vector 需要一个三维矢量求交的算法吗

Vector 需要一个三维矢量求交的算法吗,vector,3d,geometry,line,intersection,Vector,3d,Geometry,Line,Intersection,我有2个向量,每个向量由2Point3D(原点和方向)定义。我需要找出他们的交叉点。 一点点帮助总是受欢迎的。 我将发布我的函数,它给了我错误的输出 public static CurvIntersect3D Intersect2Linii3D (Vector3D dr1, Vector3D dr2) { CurvIntersect3D result = new CurvIntersect3D(0, null); double x = Math3D.VectorNorm3D(d

我有2个向量,每个向量由2
Point3D
(原点和方向)定义。我需要找出他们的交叉点。 一点点帮助总是受欢迎的。 我将发布我的函数,它给了我错误的输出

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;
}
public static curveintersect3d intersect2lini3d(Vector3D-dr1,Vector3D-dr2){
CurveIntersect3D结果=新的CurveIntersect3D(0,空);
double x=Math3D.VectorNorm3D(dr1.getDirectie());
double t=Math3D.VectorNorm3D(dr2.getDirectie());
双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();
点3D p2=新点3D(),p3=新点3D();

对于(int i=0;i你确定你的线有交点吗

如果有保证,那么问题就相当简单:得到线的参数方程,解两个线性方程组,如下所示:

A_X0+t*A_Dir_X=B_X0+u*B_DirX,其中X0是基点,Dir是方向向量(考虑具有非零叉积的任何坐标对)


如果没有,则必须首先计算两条线之间的距离。如果距离为零,则我们可以找到交点。

如前所述,两条线可能不会在一个点处相交。通常,最好在第1行上找到离第2行最近的点,反之亦然。连接这两个点以创建通信在法线方向上

给定两条线穿过3D点
r1=[r1x,r1y,r1z]
r2=[r2x,r2y,r2z]
并具有单位方向
e1=[e1x,e1y,e1z]
e2=[e2x,e2y,e2z]
您可以在该线上找到与另一条线最接近的点,如下所示:

  • 找到方向投影
    u=Dot(e1,e2)=e1x*e2x+e1y*e2y+e1z*e2z
  • 如果
    u==1
    则直线平行。不存在交点
  • 找到分离投影
    t1=Dot(r2-r1,e1)
    t2=Dot(r2-r1,e2)
  • 沿测线1查找距离
    d1=(t1-u*t2)/(1-u*u)
  • 沿直线2查找距离
    d2=(t2-u*t1)/(u*u-1)
  • 在第1行找到点
    p1=Add(r1,刻度(d1,e1))
  • 在第2行找到点
    p2=Add(r2,刻度(d2,e2))
  • 注意:必须将方向作为单位向量,
    点(e1,e1)=1
    点(e2,e2)=1
    。 函数
    Dot()
    是向量的点积。函数
    Add()
    添加向量的分量,函数
    Scale()
    将向量的分量乘以一个数字


    祝你好运。

    通过指定原点和方向,并指定直线而不是向量。祝你好运,当
    u==1
    直线平行时。我更正了帖子。两条平行直线在相反方向上会给出
    u==-1
    。这也是避免被零除的一种情况。