Java 计算直线是否与面相交

Java 计算直线是否与面相交,java,vector,3d,line,intersection,Java,Vector,3d,Line,Intersection,我正在写一个3D应用程序。我必须确定用户当前正在看的面(不总是轴对齐) 我将每个面的位置设为四个点。 我把线作为向量 我查了一下,我可以计算出脸的法线,并用它来计算脸的方程。我还可以计算直线的方程 如果我合并这些,我可以计算交点(在平面上),然后查看该点是否在面上。但我如何在代码中求解这些方程呢 如何简单地计算直线是否与面相交 编辑: 如何使用java代码求解这些方程 Equations of Line x = point.x - dir.x * t y = point.y - dir.y

我正在写一个3D应用程序。我必须确定用户当前正在看的面(不总是轴对齐)

我将每个面的位置设为四个点。 我把线作为向量

我查了一下,我可以计算出脸的法线,并用它来计算脸的方程。我还可以计算直线的方程

如果我合并这些,我可以计算交点(在平面上),然后查看该点是否在面上。但我如何在代码中求解这些方程呢

如何简单地计算直线是否与面相交

编辑: 如何使用java代码求解这些方程

 Equations of Line
 x = point.x - dir.x * t
 y = point.y - dir.y * t
 z = point.z - dir.z * t

 Equation of Plane
 normal.x * (x - face[0].x) + normal.y * (y - face[0].y) + normal.z * (z - face[0].z) = 0

可以首先检查直线是否与包含面的平面相交(这是一个非常简单的线性系统)。如果交点I存在,并且你的脸是ABCD,你可以在ABC中计算I的(alpha,beta)。如果alpha或beta<0表示ABC不包含I),则对BCD执行相同的操作

总而言之(伪代码):

我不知道它在性能方面是否是最优的,但从数学上讲它是有效的

编辑:如何准确计算I?

为此,使用平面(ABC)和线L=(U,p)的笛卡尔表示更为方便,其中U是方向向量(U,v,w),p是属于L的点(x0,y0,z0)

  • 首先,求(ABC)的法向量N=(a,b,c)。(ABC)的方程式是:a.x+b.y+c.z+d=0。通过在方程中输入A的坐标来确定d

  • L的方程是(E1):(x,y,z)=(x0,y0,z0)+λ(u,v,w)

现在,如果Un=0,则线平行于平面,我们认为没有交点。否则,我们可以在(E0)中注入(E1)来确定λ:

lambda=-(a.x0+b.y0+c.z0+d)/(a.u+b.v+c.w)


接下来,您可以使用(E1)中的lambda值计算点I的坐标。

您可以首先检查直线是否与包含您的面的平面相交(这是一个非常简单的线性系统)。如果交点I存在,并且你的脸是ABCD,你可以在ABC中计算I的(alpha,beta)。如果alpha或beta<0表示ABC不包含I),则对BCD执行相同的操作

总而言之(伪代码):

我不知道它在性能方面是否是最优的,但从数学上讲它是有效的

编辑:如何准确计算I?

为此,使用平面(ABC)和线L=(U,p)的笛卡尔表示更为方便,其中U是方向向量(U,v,w),p是属于L的点(x0,y0,z0)

  • 首先,求(ABC)的法向量N=(a,b,c)。(ABC)的方程式是:a.x+b.y+c.z+d=0。通过在方程中输入A的坐标来确定d

  • L的方程是(E1):(x,y,z)=(x0,y0,z0)+λ(u,v,w)

现在,如果Un=0,则线平行于平面,我们认为没有交点。否则,我们可以在(E0)中注入(E1)来确定λ:

lambda=-(a.x0+b.y0+c.z0+d)/(a.u+b.v+c.w)


接下来,您可以使用(E1)中的lambda值计算点I的坐标。

谢谢您的回答。我现在解决了。如果有人有同样的问题,仍然需要这些方程式,我将它们发布在这里:

/*
     * EQUATIONS OF LINE
     * x = point.x - dir.x * t
     * y = point.y - dir.y * t
     * z = point.z - dir.z * t
     * 
     * 
     * EQUATION OF PLANE
     * normal.x * (x - face[0].x) + normal.y * (y - face[0].y) + normal.z * (z - face[0].z) = 0
     * 
     * ax + by + cz = d
     * 
     * a = normal.x
     * b = normal.y
     * c = normal.z
     * d = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * 
     * MERGE THEM
     * normal.x * x + normal.y * y + normal.z * z = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * Deploy
     * normal.x * (point.x - dir.x * t) + normal.y * (point.y - dir.y * t) + normal.z * (point.z - dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * Multiply out
     * (normal.x * point.x) - (normal.x * dir.x * t) + (normal.y * point.y) - (normal.y * dir.y * t) + (normal.z * point.z) - (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * (-1)
     * 
     * Reshaping
     * -(normal.x * point.x) + (normal.x * dir.x * t) - (normal.y * point.y) + (normal.y * dir.y * t) - (normal.z * point.z) + (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z)
     * (normal.x * dir.x * t) + (normal.y * dir.y * t) + (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)
     * t * ((normal.x * dir.x) + (normal.y * dir.y) + (normal.z * dir.z)) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)
     * t = ((-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)) / ((normal.x * dir.x) + (normal.y * dir.y) + (normal.z * dir.z))
     * 
     */

谢谢你的回答。我现在解决了。如果有人有同样的问题,仍然需要这些方程式,我将它们发布在这里:

/*
     * EQUATIONS OF LINE
     * x = point.x - dir.x * t
     * y = point.y - dir.y * t
     * z = point.z - dir.z * t
     * 
     * 
     * EQUATION OF PLANE
     * normal.x * (x - face[0].x) + normal.y * (y - face[0].y) + normal.z * (z - face[0].z) = 0
     * 
     * ax + by + cz = d
     * 
     * a = normal.x
     * b = normal.y
     * c = normal.z
     * d = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * 
     * MERGE THEM
     * normal.x * x + normal.y * y + normal.z * z = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * Deploy
     * normal.x * (point.x - dir.x * t) + normal.y * (point.y - dir.y * t) + normal.z * (point.z - dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * -1
     * Multiply out
     * (normal.x * point.x) - (normal.x * dir.x * t) + (normal.y * point.y) - (normal.y * dir.y * t) + (normal.z * point.z) - (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) * (-1)
     * 
     * Reshaping
     * -(normal.x * point.x) + (normal.x * dir.x * t) - (normal.y * point.y) + (normal.y * dir.y * t) - (normal.z * point.z) + (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z)
     * (normal.x * dir.x * t) + (normal.y * dir.y * t) + (normal.z * dir.z * t) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)
     * t * ((normal.x * dir.x) + (normal.y * dir.y) + (normal.z * dir.z)) = (-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)
     * t = ((-face[0].x * normal.x - face[0].y * normal.y - face[0].z * normal.z) + (normal.x * point.x) + (normal.y * point.y) + (normal.z * point.z)) / ((normal.x * dir.x) + (normal.y * dir.y) + (normal.z * dir.z))
     * 
     */

谢谢你的回答。我的主要问题是我不能用java来解方程。我可以在纸上解决它们,但如何在代码中解决:x=point.x-dir.x*t | y=point.y-dir.y*t | z=point.z-dir.z*t | normal.x*(x-face[0].x)+normal.y*(y-face[0].y)+normal.z*(z-face[0]=0我正在编辑我的消息来回答你的问题。然而,在这里写数学是不方便的,所以很抱歉,我会很简短。你说得对,我应该在math.stackexchange.com上发布。我现在自己试着用变量解方程,但我被卡住了。但是谢谢你的编辑。该死!我的电脑在我快完成的时候重启了。很抱歉,你得再等一会儿。没问题,在我最终得到答案后,你可以看看我的答案,它应该是正确的。但真的谢谢你的帮助!谢谢你的回答。我的主要问题是我不能用java来解方程。我可以在纸上解决它们,但如何在代码中解决:x=point.x-dir.x*t | y=point.y-dir.y*t | z=point.z-dir.z*t | normal.x*(x-face[0].x)+normal.y*(y-face[0].y)+normal.z*(z-face[0]=0我正在编辑我的消息来回答你的问题。然而,在这里写数学是不方便的,所以很抱歉,我会很简短。你说得对,我应该在math.stackexchange.com上发布。我现在自己试着用变量解方程,但我被卡住了。但是谢谢你的编辑。该死!我的电脑在我快完成的时候重启了。很抱歉,你得再等一会儿。没问题,在我最终得到答案后,你可以看看我的答案,它应该是正确的。但真的谢谢你的帮助!