我试图找到一条曲线和一个三维曲面的交点,但没有成功如图所示,曲面为圆锥体,曲线为双曲线。
CONE AND THE CURVE
这将模拟光线击中某个曲面我试着用平分法,但似乎没用然后我尝试了牛顿算法,但结果仍然不好。
有没有其他好的算法适合解决这类问题?

最佳答案

问题
您正在搜索曲线-曲面相交算法。请注意,曲线和曲面都可以用隐式形式或参数形式表示隐式曲面由方程F(x,y,z)=0定义,对于二次曲面,F(x,y,z)是x,y,z的二次多项式参数形式的表面由其参数的点值函数S(u,v)定义(例如,可以使用圆锥轴线的距离和极角作为圆锥表面的参数)。曲线通常只以参数形式描述,作为参数t的函数c(t),对于双曲曲线,它可以是二次函数。
隐式曲面
最简单的情况是将问题视为参数曲线与隐式曲面的交集。在这种情况下,你可以用单变量t写出一个方程q(t)=f(c(t))=0。当然,牛顿迭代并不能保证在一般情况下找到所有的解,如果你找到两个q(t)符号不同的点,等分只能找到一个解。
在你的例子中,q(t)是一个四次多项式(在把二次曲线参数化为二次曲面方程之后)。它可以用Ferrari's analytic formula从理论上解决,但我强烈反对,因为它在数值上是非常不稳定的。您可以在这里应用任何流行的多项式解算器,如Jenkins-Traub算法或companion matrix的特征值算法(另请参见this question)。您也可以使用区间数学的方法:例如,您可以递归地将参数t的域区间细分为更小的片段,同时修剪所有肯定不包含零的片段(interval arithmetic将帮助您检测这些片段)。
参数曲面
现在我们可以继续讨论曲线和曲面都用参数表示的情况。我不知道任何解决方案,可以受益于这一事实,你的曲面是圆锥的,你的曲线是双曲线,所以你必须应用一般的曲线曲面相交算法。或者,可以将隐式定义的圆锥体拟合到参数曲面中,然后对四次多项式根使用上面的解。
许多可靠的一般求交算法都是基于细分方法(实际上又是区间数学)一般的想法是不断地把曲线和曲面分成越来越小的部分。一定不会相交的那对碎片会尽快掉下来。在最后,你会有一组小块对,紧紧地包围你的交叉点。为了使交点精确,Yoy可能想从中运行牛顿迭代。
下面是一个示例算法的概要:
从单个曲线段(整个输入曲线)和单个曲面开始
片(整个表面)和这些片的一个潜在相交对(pip)。
将每个曲线分段细分为两半(按参数),将每个曲面分段细分为四个象限(按两个参数)。
对于每个旧的PIP,检查所有8对半曲线与曲面象限如果它们真的不相交,就忘掉它们吧。如果它们可以相交,请将它们另存为新的PIP。
除非所有零件都足够小,否则从步骤2开始用新零件和PIP-s重复。
对于每一对曲线件和曲面件,你必须检查它们是否可能相交,这可以通过检查它们的轴对齐的边界框来容易地完成。此外,还可以将曲线和曲面表示为NURBS,在这种情况下,可以使用凸面外壳作为更紧密的边界体积。
一般来说,这种算法有很多变化和改进。我建议阅读以下文献以获取更深入的知识:
计算机辅助设计与制造中的形状查询。
chapter 4:对于根解算器
section 5.7:对于曲线-曲面相交
PhD of Michael Hohmeyer
第4.5节:用于曲线-曲面相交
第4.1节和第4.2节:凸面船体交叉口(如果你足够勇敢)。
底线
如果你正在寻找一个简单而有效的解决方案,并且你确信双曲线和圆锥是你唯一需要担心的事情,那么你最好使用圆锥的隐式定义,并用一些标准的数值算法从一个很好的库中解出四次方程。

关于algorithm - 如何找到3D曲线和3D曲面的交点?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34486959/

10-15 23:31