我试图确定是否符段(即两点之间)交叉领域。我不感兴趣的位置的交叉点,就是否段相交球表面。没有任何人有任何建议什么是最有效的算法为这会是什么?(我想知道如果有任何的算法更简单的比通常的雷领域的交叉点算法,因为我不感兴趣,在交叉路口的位置)

有帮助吗?

解决方案

我不知道什么样的标准的方式这样做,但是如果你只想要知道,如果它相交,这里是什么,我将做。

一般的规则...避免这样做,sqrt()或其它昂贵的运作。在可能时,应对方的半径。

  1. 确定如果出发点是内部的半径范围。如果你知道这是从来没有的情况,然后跳过这个步骤。如果你在里面,你的射线交叉的领域。

从这里,你的开始点是外的领域。

  1. 现在,想象一下这小盒子,将适合的领域。如果你是外那箱子,检查x-direction,y和z方向的射线,看看它是否会相交的边的箱子你的射线开始。这应该是一个简单标志的检查,或者比较对零。如果你是外部和远离它,你将永远不会相互交叉。

从这里,你是在更复杂的阶段。你的起始点之间的虚框及的领域。你可以得到简化的表达使用的计算和几何形状。

要点什么你想要做的是确定如果最短的距离射线和领域是不到半径的领域。

让您的光线来表示(x0+it,y0+jt,z0+kt),以及该中心的你的球被at(x,y,z).因此,我们想找到t这样,它将给予最短的(xS-x0-我t、y s-y0-jt,zS-z0-kt)。

让x=xS-x0,y=y-y0,z=zS-z0,D=幅度矢量的平方

D=x^2-2*xt+(i*t)^2+y^2-2*yjt+(j*t)^2+z^2-2*zkt+(k*t)^2

D=(i^2+j^2+k^2)t^2-(x我+yj+zk)*2*t+(x^2+y^2+z^2)

dD/dt=0=2*t*(i^2+j^2+k^2)-2*(x我+yj+z*k)

t=(x我+yj+z*k)/(i^2+j^2+k^2)

塞t回方程式对D=....如果结果是小于或等于广场的领域的半径,你有一个交叉路口。如果它是较大,则没有任何交叉点。

其他提示

如果您是如果知道,如果它相交或不那么你的基本算法看起来像这样只关心...

考虑您有射线线,A的矢量 - >乙

您知道,这个矢量和的球的中心之间的最短距离发生在你的光线矢量的交点且通过球体的中心的载体,其是在90度到这一点。

您因此具有两个向量,其中充分完全定义的等式。可以使用线性代数,所以线的长度(或更有效地线的长度的平方),并测试,如果这是小于半径(或半径的平方计算出矢量的交点)你的球。

此页有针对此问题的精确解。从本质上讲,你是代替行入公式为球体的公式,然后计算所产生的二次的判别。判别的值指示交集。

您八九不离十有工作的位置无论如何,如果你想要的精度。在算法上提高速度的唯一方法是从射线球体相交切换到射线包围盒相交。

或者你可以去更深,尝试和改进的sqrt和其他内部函数调用

http://wiki.cgsociety.org/index.php/Ray_Sphere_Intersection

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top