找到一组曲线的凸包络的算法或想法是什么?

Which algorithm or idea to find the convex envelope of a set of curves?

让我们将曲线定义为一组可以计算到任意精度的二维点。例如,这是一条曲线:

给出一组N条相交曲线(N可以任意大),如下图:

如何找到由一组曲线定界的连通区域的周长(必要时给出边界框);或者,在上面的例子中,红色曲线?注意周长可以是凹的,没有明显的参数化。

补充说明:

当我遇到这样的问题(数学不够或非常棘手)时,我将每条曲线分解成段。

然后,我搜索 segment-segment 个路口。例如,曲线 Ci 中的一段与曲线 Cj 中的所有段。即使您可以用边界框替换线段并进行 box-box 交集以快速丢弃,重点关注那些有交集的框。

这给出了 curve-curve 个交叉点的粗略近似值。

除了交叉点,您还可以搜索 max/min 坐标,也可以使用线段或框来近似。

一旦获得合适的近似值,您可以通过减少线段和框的 length/size 并重复相交(或 max/min)检查来改进它。

您可以使用网格得到近似解。首先,找到曲线的边界框。然后在边界框内进行网格化。然后搜索单元格以找到指定区域。最后使用周长上的单元格数量近似计算周长值(因为单元格的大小已知)。

如果曲线按顺序给出,您可以找到连续曲线之间的成对交点。根据它们的性质,解析或数值解都可以。

那么包络的第一个近似值就是通过这些点的折线。

另一种近似可以通过绘制连续曲线的公切线,并将这些切线成对相交来获得。无论如何,公切线问题更难。


如果已知曲线方程的单个参数,则可以通过求解微分方程来求包络曲线,该微分方程是通过消去曲线隐式方程与该方程微分得到的参数得到的范围。您可以对这个方程进行数值积分。