从平面多项式域转换为平面多边形

计算科学 计算几何 matlab 八度
2021-12-02 15:10:13

假设我们有一个平面域,其边界可以用多项式曲线(如贝塞尔曲线)来描述。现在假设您想要产生边界的离散化,即您想要通过对定义域边界的多项式进行采样来产生多边形。如何生成一个导致错误低于某些用户提供的容差的边界?误差的度量可能类似于。

sides01||line(xj,xj+1,t)Ωj(t)||2dt

的直线)相对于边由参数化表示的多项式域的平方误差。每边都在区间中参数化。xixi+1Ωj(t)t[0,1)

我正在尝试改进 GNU/Octave 包几何的 shape2polygon 功能。

编辑:这个想法是产生具有给定误差的原始域的多边形表示,并且顶点尽可能少。

谢谢

编辑:

  • 我已经实现了 Ramer-Douglas-Peucker 算法的 GNU/Octave 非递归版本来简化折线和多边形。simplePolyline_geometry.msimplePolygon_geometry.m
  • 我在LH de Figueiredo (1993)中实现了该算法的 GNU/Octave 非递归版本。“参数曲线的自适应采样”。图形宝石 III此函数执行参数化平面曲线的自适应采样。曲线2折线.m多项式域的扩展位于shape2polygon.m中。
3个回答

您想要对边界曲线执行自适应采样。

对于 Bézier 曲线,递归使用 de Casteljau 算法,直到控制点近似共线。例如,参见Anti-Grain Geometry 项目中 Bezier 曲线的自适应细分。

对于一般曲线,请参见参数曲线的自适应采样,在 Graphics Gems V,1995 中。

简化多边形的问题已得到充分研究。Douglas-Peucker 算法是最流行的方法之一。它可以实现在 O(n log n) 时间内运行。请参阅有关此算法的 Wikipedia 文章

对我来说,问题很简单,您是否希望拥有最少数量的顶点,或者您是否只对少量顶点感兴趣。

我会使用明显的贪婪适应算法:你从少量顶点开始,得到一个很差的边界近似。假设您在此步骤中然后对于多边形近似的每一段 ,计算这一段则沿边界插入一个新顶点并拆分段一分为二。重复此操作,直到所有段的误差小于并且您有一个总体误差等于或小于的边界近似值。Ni,i=1Neiei>tolNtolNtol