【问题标题】:Need an algorithm for 3D vectors intersection需要一种用于 3D 矢量交集的算法
【发布时间】:2012-05-11 12:43:16
【问题描述】:

我有 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;
}

CurvIntersec3D 是一个存储点数组及其长度的结构。

【问题讨论】:

  • 通过指定原点和方向并指定直线而不是矢量。

标签: vector 3d geometry line intersection


【解决方案1】:

如前所述,两条线可能不会在一个点相交。一般来说,您可以做的最好的事情是在 line1 上找到最接近 line2 的点,反之亦然。连接这两个点以创建公共法线方向。

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

  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. 沿线1查找距离d1 = (t1-u*t2)/(1-u*u)
  5. 沿线2查找距离d2 = (t2-u*t1)/(u*u-1)
  6. 在line1上找到点p1=Add(r1,Scale(d1,e1))
  7. 在line2上找到点p2=Add(r2,Scale(d2,e2))

注意:您必须将方向作为单位向量,Dot(e1,e1)=1Dot(e2,e2)=1。 函数Dot() 是向量点积。函数Add()将向量的分量相加,函数Scale()将向量的分量与一个数相乘。

祝你好运。

【讨论】:

  • 很好,当u==1 线是平行的。我更正了帖子。
  • 两条相反方向的平行线将给出u==-1。也是避免被零除的情况。
【解决方案2】:

你确定你的线有交点吗?

如果有保证,那么问题就很简单了:获取线的参数方程,求解一个由两个线性方程组成的系统,如下所示:

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

如果不是,那么首先需要计算两个skew lines之间的距离。如果距离为零,那么我们可以找到交点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多