找到一组曲线的凸包络的算法或想法是什么?
Which algorithm or idea to find the convex envelope of a set of curves?
让我们将曲线定义为一组可以计算到任意精度的二维点。例如,这是一条曲线:
给出一组N条相交曲线(N可以任意大),如下图:
如何找到由一组曲线定界的连通区域的周长(必要时给出边界框);或者,在上面的例子中,红色曲线?注意周长可以是凹的,没有明显的参数化。
- 可以给出红色曲线的起点
- 我对构建通用算法的有效想法很感兴趣,但是...
- 我正在用 C++ 编写代码,我可以使用任何开源库来帮助解决这个问题
- 我不知道这个问题是否有名称或是否有 ready-made 解决方案,如果有请告诉我,我会编辑标题和标签。
补充说明:
- 解决方案是唯一的,因为在感兴趣的区域中只有一个没有任何曲线的连接区域,但当然我只能计算有限数量的曲线。
- 曲线最初是参数化的(然后应用仿射变换),所以我可以添加任意数量的点。我可以计算距离、长度并与它们同行。交叉路口也是可行的。基本上任何可以从点坐标建立起来的几何运算都是可以接受的。
- 我发现 "cutting" 齿轮时遇到类似的问题。 https://scialert.net/fulltext/?doi=jas.2014.362.367,但我仍然不知道如何以一种相当有效的方式解决它。
当我遇到这样的问题(数学不够或非常棘手)时,我将每条曲线分解成段。
然后,我搜索 segment-segment 个路口。例如,曲线 Ci 中的一段与曲线 Cj 中的所有段。即使您可以用边界框替换线段并进行 box-box 交集以快速丢弃,重点关注那些有交集的框。
这给出了 curve-curve 个交叉点的粗略近似值。
除了交叉点,您还可以搜索 max/min 坐标,也可以使用线段或框来近似。
一旦获得合适的近似值,您可以通过减少线段和框的 length/size 并重复相交(或 max/min)检查来改进它。
您可以使用网格得到近似解。首先,找到曲线的边界框。然后在边界框内进行网格化。然后搜索单元格以找到指定区域。最后使用周长上的单元格数量近似计算周长值(因为单元格的大小已知)。
如果曲线按顺序给出,您可以找到连续曲线之间的成对交点。根据它们的性质,解析或数值解都可以。
那么包络的第一个近似值就是通过这些点的折线。
另一种近似可以通过绘制连续曲线的公切线,并将这些切线成对相交来获得。无论如何,公切线问题更难。
如果已知曲线方程的单个参数,则可以通过求解微分方程来求包络曲线,该微分方程是通过消去曲线隐式方程与该方程微分得到的参数得到的范围。您可以对这个方程进行数值积分。
让我们将曲线定义为一组可以计算到任意精度的二维点。例如,这是一条曲线:
给出一组N条相交曲线(N可以任意大),如下图:
如何找到由一组曲线定界的连通区域的周长(必要时给出边界框);或者,在上面的例子中,红色曲线?注意周长可以是凹的,没有明显的参数化。
- 可以给出红色曲线的起点
- 我对构建通用算法的有效想法很感兴趣,但是...
- 我正在用 C++ 编写代码,我可以使用任何开源库来帮助解决这个问题
- 我不知道这个问题是否有名称或是否有 ready-made 解决方案,如果有请告诉我,我会编辑标题和标签。
补充说明:
- 解决方案是唯一的,因为在感兴趣的区域中只有一个没有任何曲线的连接区域,但当然我只能计算有限数量的曲线。
- 曲线最初是参数化的(然后应用仿射变换),所以我可以添加任意数量的点。我可以计算距离、长度并与它们同行。交叉路口也是可行的。基本上任何可以从点坐标建立起来的几何运算都是可以接受的。
- 我发现 "cutting" 齿轮时遇到类似的问题。 https://scialert.net/fulltext/?doi=jas.2014.362.367,但我仍然不知道如何以一种相当有效的方式解决它。
当我遇到这样的问题(数学不够或非常棘手)时,我将每条曲线分解成段。
然后,我搜索 segment-segment 个路口。例如,曲线 Ci 中的一段与曲线 Cj 中的所有段。即使您可以用边界框替换线段并进行 box-box 交集以快速丢弃,重点关注那些有交集的框。
这给出了 curve-curve 个交叉点的粗略近似值。
除了交叉点,您还可以搜索 max/min 坐标,也可以使用线段或框来近似。
一旦获得合适的近似值,您可以通过减少线段和框的 length/size 并重复相交(或 max/min)检查来改进它。
您可以使用网格得到近似解。首先,找到曲线的边界框。然后在边界框内进行网格化。然后搜索单元格以找到指定区域。最后使用周长上的单元格数量近似计算周长值(因为单元格的大小已知)。
如果曲线按顺序给出,您可以找到连续曲线之间的成对交点。根据它们的性质,解析或数值解都可以。
那么包络的第一个近似值就是通过这些点的折线。
另一种近似可以通过绘制连续曲线的公切线,并将这些切线成对相交来获得。无论如何,公切线问题更难。
如果已知曲线方程的单个参数,则可以通过求解微分方程来求包络曲线,该微分方程是通过消去曲线隐式方程与该方程微分得到的参数得到的范围。您可以对这个方程进行数值积分。