如何找到 3D 曲线和 3D 曲面的交点?
How to find the intersection point of a 3D curve and a 3D surface?
我试图找到曲线和 3D 曲面的交点,但运气不好。曲面呈圆锥形,曲线呈双曲线,如图所示。
CONE AND THE CURVE
这模拟了光线撞击某个表面。我尝试使用二分法,但它似乎不起作用。然后又试了牛顿算法,结果还是不行。
还有其他适合解决此类问题的好算法吗?
以参数形式给出的曲线
x = fx(t)
y = fy(t)
z = fz(t)
和表面的一个形式的方程
g(x,y,z) = 0
只要插入曲线函数,二分法就可以了:
g(fx(t), fy(t), fz(t)) = 0
唯一的问题是找到合适的起始点 t1 和 t2,其中 g 具有相反的符号。
问题
您正在搜索 curve-surface 交集算法。请注意,曲线和曲面都可以用 implicit 形式或 parametric 形式表示。隐式形式的曲面由方程 F(x, y, z) = 0 定义,它是 x、y, z 在圆锥曲面的情况下。参数形式的曲面由其参数的 point-valued 函数 S(u, v) 定义(例如,您可以使用沿锥轴的距离和极角作为锥面的参数) .曲线通常仅以参数形式描述,作为参数为 t 的函数 C(t),它可以是双曲线的二次函数。
隐式曲面
最简单的情况是将您的问题视为参数曲线与隐式曲面的交点。在这种情况下,您可以写下一个方程式 q(t) = F(C(t)) = 0 和单个变量 t。当然,一般情况下,牛顿迭代并不能保证找到所有的解,二分法只有找到符号不同的两个点q(t).[=14才能确定找到一个解=]
在你的例子中 q(t) 是一个四次多项式(在将二次曲线参数化到二次曲面方程之后)。理论上可以用Ferrari's analytic formula, but I strongly advise against it, because it is quite unstable numerically. You can apply any popular polynomial solver here, like Jenkins-Traub algorithm or eigenvalues algorithm for companion matrix (also see this question). You can also use methods of interval mathematics: for example, you can recursively subdivide the domain interval of parameter t into smaller pieces, while pruning all the pieces that surely do not contain zeros (interval arithmetic来解决,可以帮你检测出这样的碎片。
参数化曲面
现在我们可以继续讨论曲线和曲面都以参数化方式表示的情况。我不知道有什么解决方案可以从您的曲面是圆锥形且曲线是双曲线这一事实中获益,因此您必须应用通用的 curve-surface 交集算法。或者,您可以将 implicitly-defined 圆锥拟合到参数化曲面中,然后使用上面的解决方案求四次多项式根。
很多靠谱的通用交集算法都是基于细分法(其实又是区间数学)。总体思路是不断将曲线和曲面分成越来越小的块。肯定不相交的成对棋子会被尽快丢弃。最后你会得到一组小件对,紧紧地包围着你的交点。 Yoy 可能想要 运行 牛顿从它们迭代以使交点精确。
下面是示例算法的概要:
- 从单个曲线段(整条输入曲线)和单个曲面开始
一块(整个表面),以及这些块的一对潜在相交 (PIP)。
- 将每条曲线细分为两半(按参数),将每个曲面细分为四个象限(按两个参数)。
- 对于每个旧 PIP,检查所有 8 对半曲线与曲面象限。如果它们确实不相交,请忽略它们。如果它们可以相交,将它们保存为新的 PIP。
- 除非所有棋子都足够小,否则用新棋子从步骤 2 开始重复 PIP-s。
对于每对曲线块和曲面块,您必须检查它们是否可能相交,这可以通过检查它们的 axis-aligned 边界框轻松完成。此外,您可以将曲线和曲面表示为 NURBS,在这种情况下,您可以使用凸包作为更紧密的边界体积。
通常,此算法有大量的变化和改进。我建议阅读以下文献以获得更深入的知识:
- computer-aided 设计和制造的形状询问。
- chapter 4:对于根求解器
- section 5.7:对于curve-surface路口
- PhD of Michael Hohmeyer。
- 第 4.5 节:对于 curve-surface 交集
- 第 4.1 和 4.2 节:凸包相交(如果你足够勇敢)。
底线
如果您正在寻找一个简单有效的解决方案,并且您确定双曲线和圆锥是您唯一需要担心的事情,那么您最好使用圆锥的隐式定义并用一些方法求解四次方程来自您可用的优秀库的标准数值算法。
我试图找到曲线和 3D 曲面的交点,但运气不好。曲面呈圆锥形,曲线呈双曲线,如图所示。 CONE AND THE CURVE
这模拟了光线撞击某个表面。我尝试使用二分法,但它似乎不起作用。然后又试了牛顿算法,结果还是不行。
还有其他适合解决此类问题的好算法吗?
以参数形式给出的曲线
x = fx(t)
y = fy(t)
z = fz(t)
和表面的一个形式的方程
g(x,y,z) = 0
只要插入曲线函数,二分法就可以了:
g(fx(t), fy(t), fz(t)) = 0
唯一的问题是找到合适的起始点 t1 和 t2,其中 g 具有相反的符号。
问题
您正在搜索 curve-surface 交集算法。请注意,曲线和曲面都可以用 implicit 形式或 parametric 形式表示。隐式形式的曲面由方程 F(x, y, z) = 0 定义,它是 x、y, z 在圆锥曲面的情况下。参数形式的曲面由其参数的 point-valued 函数 S(u, v) 定义(例如,您可以使用沿锥轴的距离和极角作为锥面的参数) .曲线通常仅以参数形式描述,作为参数为 t 的函数 C(t),它可以是双曲线的二次函数。
隐式曲面
最简单的情况是将您的问题视为参数曲线与隐式曲面的交点。在这种情况下,您可以写下一个方程式 q(t) = F(C(t)) = 0 和单个变量 t。当然,一般情况下,牛顿迭代并不能保证找到所有的解,二分法只有找到符号不同的两个点q(t).[=14才能确定找到一个解=]
在你的例子中 q(t) 是一个四次多项式(在将二次曲线参数化到二次曲面方程之后)。理论上可以用Ferrari's analytic formula, but I strongly advise against it, because it is quite unstable numerically. You can apply any popular polynomial solver here, like Jenkins-Traub algorithm or eigenvalues algorithm for companion matrix (also see this question). You can also use methods of interval mathematics: for example, you can recursively subdivide the domain interval of parameter t into smaller pieces, while pruning all the pieces that surely do not contain zeros (interval arithmetic来解决,可以帮你检测出这样的碎片。
参数化曲面
现在我们可以继续讨论曲线和曲面都以参数化方式表示的情况。我不知道有什么解决方案可以从您的曲面是圆锥形且曲线是双曲线这一事实中获益,因此您必须应用通用的 curve-surface 交集算法。或者,您可以将 implicitly-defined 圆锥拟合到参数化曲面中,然后使用上面的解决方案求四次多项式根。
很多靠谱的通用交集算法都是基于细分法(其实又是区间数学)。总体思路是不断将曲线和曲面分成越来越小的块。肯定不相交的成对棋子会被尽快丢弃。最后你会得到一组小件对,紧紧地包围着你的交点。 Yoy 可能想要 运行 牛顿从它们迭代以使交点精确。
下面是示例算法的概要:
- 从单个曲线段(整条输入曲线)和单个曲面开始 一块(整个表面),以及这些块的一对潜在相交 (PIP)。
- 将每条曲线细分为两半(按参数),将每个曲面细分为四个象限(按两个参数)。
- 对于每个旧 PIP,检查所有 8 对半曲线与曲面象限。如果它们确实不相交,请忽略它们。如果它们可以相交,将它们保存为新的 PIP。
- 除非所有棋子都足够小,否则用新棋子从步骤 2 开始重复 PIP-s。
对于每对曲线块和曲面块,您必须检查它们是否可能相交,这可以通过检查它们的 axis-aligned 边界框轻松完成。此外,您可以将曲线和曲面表示为 NURBS,在这种情况下,您可以使用凸包作为更紧密的边界体积。
通常,此算法有大量的变化和改进。我建议阅读以下文献以获得更深入的知识:
- computer-aided 设计和制造的形状询问。
- chapter 4:对于根求解器
- section 5.7:对于curve-surface路口
- PhD of Michael Hohmeyer。
- 第 4.5 节:对于 curve-surface 交集
- 第 4.1 和 4.2 节:凸包相交(如果你足够勇敢)。
底线
如果您正在寻找一个简单有效的解决方案,并且您确定双曲线和圆锥是您唯一需要担心的事情,那么您最好使用圆锥的隐式定义并用一些方法求解四次方程来自您可用的优秀库的标准数值算法。