Java:转换为3d空间的两个椭圆段的交点
我已将直线和椭圆的段(而非平面和椭球体)转换为三维空间,并需要计算两个给定段是否相交以及相交的位置Java:转换为3d空间的两个椭圆段的交点,java,3d,line,intersection,ellipse,Java,3d,Line,Intersection,Ellipse,我已将直线和椭圆的段(而非平面和椭球体)转换为三维空间,并需要计算两个给定段是否相交以及相交的位置 我正在使用Java,但还没有找到一个库来解决我的问题,也没有找到一些可以用于我自己实现的算法。对于测线交点测试,有几种方法可以解决。经典的方法是使用线性代数(即,求解线性矩阵系统),但从软件开发的角度来看,我更喜欢几何代数的方法,以普莱克坐标的形式,它只需要实现向量代数运算(即叉积和点积)在求解线性系统时,它们比矩阵运算更容易编码 为了比较起见,我将两者都显示出来,然后您决定: 线性代数方式 给定
我正在使用Java,但还没有找到一个库来解决我的问题,也没有找到一些可以用于我自己实现的算法。对于测线交点测试,有几种方法可以解决。经典的方法是使用线性代数(即,求解线性矩阵系统),但从软件开发的角度来看,我更喜欢几何代数的方法,以普莱克坐标的形式,它只需要实现向量代数运算(即叉积和点积)在求解线性系统时,它们比矩阵运算更容易编码 为了比较起见,我将两者都显示出来,然后您决定: 线性代数方式 给定线段p受点P1和P2限制,线段Q受点Q1和Q2限制 线的参数化形式如下所示: p(t)=P1+t(P2-P1) Q(t)=Q1+t(Q2-Q1) 其中t是区间[0 1]中的实数 如果两条线相交,则以下等式成立: p(t0)=Q(t1) 假设存在两个未知数字t0和t1。将上述方程展开,我们得到: t0(P2-P1)-t1(Q2-Q1)=Q1-P1 我们可以通过在矩阵代数中表示上述方程来求解t0和t1: A x=B 式中,A是3x2矩阵,第一列为向量坐标(P2-P1),第二列为向量坐标(Q2-Q1);x是未知量t0和t1的2x1列向量,B是坐标为向量(Q1-P1)的3x1列向量 经典地,系统可以通过计算矩阵A的伪逆来求解,表示为A^+: A^+=(A^T A)^-1 A^T 见: 幸运的是,Java中的任何矩阵包都应该能够非常轻松地计算上述计算,而且可能也非常高效 如果将A与其伪逆A^+相乘等于单位矩阵I,即(A^+==I,则存在唯一答案(交集),您可以通过计算以下乘积得到它: x=A^+B 当然,如果你首先不能计算伪逆,例如,因为(A^ta)是奇异的(即行列式为零),那么就不存在交集 因为我们处理的是线段,所以当x0和x1都在区间[01]内时,交点在点p(x0)或Q(x1)处 其他解决方法 为了避免处理矩阵代数,我们可以尝试使用向量代数和替换法求解系统: t0(P2-P1)-t1(Q2-Q1)=Q1-P1 t0=a+t1+b t1=C•(Q1-(1-a)P1-a P2)/| C |^2 其中: a=(P2-P1)•(Q1-P1)/(P2-P1)^2 b=(P2-P1)•(Q2-Q1)/(P2-P1)^2 C=b(P2-P1)-(Q2-Q1) 我还不能提供上述结果的几何直观 采摘器协调方式 给定线段p受点P1和P2限制,线段Q受点Q1和Q2限制 线p的拾取器坐标由一对3d向量(Pd,Pm)给出: Pd=P2-P1 Pm=P1 x P2 式中,Pm是P1和P2的叉积。线Q的采摘器坐标(Qd,Qm)可以用完全相同的方法计算 线p和Q只有在共面时才能相交。Thr线P和Q为共平面iif: Pd•Qm+Qd•Pm=0 其中(•)是dot产品。由于机器的精度有限,稳健测试不应检查零,而应检查少量。如果Pd x Qd=0,则线平行(此处0为零向量)。同样,应针对instamce进行稳健测试,以确保(Pd x Qd)的平方长度较小 如果两条线不平行,则它们是共面的,它们的交点(用Pucker的行话称为“相交”)将是点: x=((Pm•N)Qd-(Qm•N)Pd-(Pm•Qd)N)/(Pd x Qd)•N 其中N是任何坐标轴向量(即,(1,0,0)或(0,1,0)或(0,0,1)),使得(Pd x Qd)•N为非零 如果p和Q均未通过原点,则其采摘器坐标Pm和Qm将分别为非零,且以下sinpler公式将起作用 x=Pm x Qm/Pd•Qm 有关采摘器坐标的介绍,请参见: 有关一般的交点公式,请参见以下内容的“推论6”: 将椭圆前后转换为圆 我们总是可以把椭圆变成圆。椭圆有两个“半径”,称为半轴,你可以把它们想象成两个正交向量,一个大的称为大半轴,一个小的称为小半轴。可以对两个半轴向量应用非均匀缩放变换,使其大小相等,从而得到一个圆 我们通过椭圆的中心O定义椭圆“E”,中心O是一个3d点,椭圆的两个半轴A1和A2也是3d向量。椭圆平面的法向量N可通过其半轴N=A1 x A2的叉积计算,然后将其归一化为单位长度 现在假设有一个线性函数M,你可以用它将椭圆E变换(缩放)成一个圆C,半径等于短半轴,方法是将它应用于椭圆的半轴A1和A2以及椭圆的中心O 请注意,Elipse的圆心O和椭圆的法向量N不会因M而改变。因此M(N)=N和M(O)=O。这意味着圆位于同一平面上,并且与椭圆具有相同的位置C。线性函数M有一个对应的反函数M^-1,因此我们可以将圆的向量变换回