Vector 需要一个三维矢量求交的算法吗
我有2个向量,每个向量由2Vector 需要一个三维矢量求交的算法吗,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
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
。这也是避免被零除的一种情况。