我有一些地理数据(下面的图像显示了河流的路径为红点),我想用多段三次贝塞尔曲线近似。通过对计算器等问题,在这里和这里我发现由Philip J.施耐德从“图形宝石”的算法。我成功地实现了它并且可以报告即使有数千个点它也非常快。不幸的是,速度带来了一些缺点,即装配非常不合适。请考虑以下图形:
多段贝塞尔曲线
红点是我的原始数据,蓝线是由Schneider算法创建的多段贝塞尔曲线。如您所见,算法的输入是一个容差,至少与绿线表示的一样高。然而,该算法创建了具有太多急转弯的贝塞尔曲线。你也会在图像中看到这些不必要的急转弯。很容易想象,对于所示数据,具有较小急转弯的贝塞尔曲线,同时仍保持最大公差条件(仅将贝塞尔曲线稍微推向品红色箭头的方向)。问题似乎是算法从我的原始数据中选取数据点作为各个贝塞尔曲线的终点(品红箭头指示一些嫌疑人)。贝塞尔曲线的端点受此限制,
我正在寻找的是一种算法,它使用具有两个约束的多段贝塞尔曲线来近似我的数据:
多段贝塞尔曲线绝不能超过数据点一定距离(由Schneider算法提供)
多段贝塞尔曲线绝不能产生过于尖锐的曲率。检查此标准的一种方法是沿多段贝塞尔曲线滚动具有最小曲率半径的圆,并检查它是否沿其路径接触曲线的所有部分。虽然看起来有更好的方法涉及一阶和二阶导数的叉积
我发现可以创造更好拟合的解决方案或者仅适用于单个贝塞尔曲线(并且省略了如何在多段贝塞尔曲线中找到每个贝塞尔曲线的良好起点和终点的问题)或者不允许最小曲率约束。我认为最小曲率约束是这里的棘手条件。
这是另一个例子(这是手绘而不是100%精确):
一些例子
让我们假设图一显示曲率约束(圆必须适合整个曲线)以及任何数据点与曲线的最大距离(恰好是绿色圆的半径)。图2中红色路径的成功近似显示为蓝色。该近似值符合曲率条件(圆可以在整个曲线内滚动并在任何地方触摸它)以及距离条件(以绿色显示)。图3显示了路径的不同近似值。虽然它符合距离条件但很明显圆圈不再适合曲率。图4显示了一条不可能用给定约束近似的路径,因为它太尖了。该示例应该说明为了正确地近似路径中的一些尖转弯,算法必须选择不属于路径的控制点。图3显示,如果选择沿路径的控制点,则不能再满足曲率约束。此示例还显示算法必须退出某些输入,因为无法使用给定的约束来近似它。
这个问题是否存在解决方案?解决方案不一定要快。如果需要一天时间来处理1000点,那就没问题了。解决方案也不必是最佳的,因为它必须导致最小二乘拟合。
最后,我将用C和Python实现它,但我也可以阅读大多数其他语言。
德玛西亚99
largeQ