Java 计算直线是否与面相交
我正在写一个3D应用程序。我必须确定用户当前正在看的面(不总是轴对齐) 我将每个面的位置设为四个点。 我把线作为向量 我查了一下,我可以计算出脸的法线,并用它来计算脸的方程。我还可以计算直线的方程 如果我合并这些,我可以计算交点(在平面上),然后查看该点是否在面上。但我如何在代码中求解这些方程呢 如何简单地计算直线是否与面相交 编辑: 如何使用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
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上发布。我现在自己试着用变量解方程,但我被卡住了。但是谢谢你的编辑。该死!我的电脑在我快完成的时候重启了。很抱歉,你得再等一会儿。没问题,在我最终得到答案后,你可以看看我的答案,它应该是正确的。但真的谢谢你的帮助!