Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:转换为3d空间的两个椭圆段的交点_Java_3d_Line_Intersection_Ellipse - Fatal编程技术网

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,因此我们可以将圆的向量变换回