我有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是一种存储点数组及其长度的结构。
答案 0 :(得分:8)
如前所述,两条线可能不会在一个点上相遇。一般来说,你能做的最好的事情就是找到最靠近第2行的第1行上的点,反之亦然。连接这两个点以创建普通法线方向。
如果两条线穿过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)
d1 = (t1-u*t2)/(1-u*u)
d2 = (t2-u*t1)/(u*u-1)
p1=Add(r1,Scale(d1,e1))
p2=Add(r2,Scale(d2,e2))
注意:您必须将路线指定为单位向量,Dot(e1,e1)=1
和Dot(e2,e2)=1
。
函数Dot()
是矢量点积。函数Add()
添加了向量的组件,函数Scale()
将向量的组件与数字相乘。
答案 1 :(得分:0)
你确定你的线有交叉吗?
如果有保证,那么问题就很简单了:获取线的参数方程,求解这样的两个线性方程组:
A_X0 + t * A_Dir_X = B_X0 + u * B_DirX,其中X0是基点,Dir是方向向量(考虑任何一对非零交叉坐标的坐标)
如果没有,那么首先需要计算两个skew lines之间的距离。如果距离为零,那么我们就可以找到交点。