【问题标题】:Approximate a list of points with a short list of Bézier curves用简短的 Bézier 曲线列表近似点列表
【发布时间】:2017-04-02 19:01:38
【问题描述】:

我有一份(x, y) 积分列表。我知道如何列出通过所有这些点并具有连续的一阶(和二阶,虽然不太重要)导数的贝塞尔曲线。但是,我最终得到的列表太长了。如果它可以让我减少我拥有的曲线数量,我更愿意近似我拥有的点。我希望能够传递一个参数,即我得到的近似值有多接近或曲线的最大数量,最好是前者。

我想要这个的原因是最终结果将有一个图形用户界面,用户可以在其中编辑贝塞尔曲线,曲线是否准确通过每个点并不重要,只要它们很接近。曲线越多,编辑就越困难。

编辑: 有关此目的的更多信息。我正在尝试制作图像编辑软件。当有人加载位图时,我希望能够跟踪中心线。 Potrace 是我用来追踪形状轮廓的工具,但它不适用于追踪笔画。我已经能够识别沿中心线的许多点,并且我想将这些数据转换为连接的贝塞尔曲线列表。我不想制作贝塞尔样条曲线的原因是控制点太多,难以编辑。 “太多”不是一个易于定义的术语,但我希望能够传递一个参数来限制曲线的数量。根据最大曲线数最小化曲线与点的距离的函数或根据与点的最大偏差最小化曲线数的函数。

【问题讨论】:

  • Ramer-Douglas-Peuker algorithm 看起来可能是一个不错的解决方案。
  • 必须是单独的贝塞尔曲线吗?否则,您只是在寻找样条拟合。
  • 这是一个相当宽泛的问题——你有一些关于你在做什么的具体细节吗?名单代表什么?为什么你需要贝塞尔曲线,特别是? “太长”是什么意思?如果这些点可以是近似值,那么保留它们的哪些方面很重要?等等等等。
  • @NicoSchertler,样条拟合的问题是曲线太多,因为我的曲线比点数少。
  • 样条曲线更为通用。您还可以使用近似点的样条曲线(即它不一定通过所有点)。可以指定度数(即连续性)和段数。我假设您将后者称为曲线数。

标签: math graphics geometry bezier approximation


【解决方案1】:

有几种方法可以实现您想做的事情:

1) 使用 RDP 算法减少点数,然后创建一个通过剩余点的贝塞尔曲线列表。

2) 使用曲线拟合算法(例如 Schneider 算法)生成多条以 G1(切线)连续性连接的 Bezier 曲线。查看link 中的 Schneider 算法实现。

3) 使用带有 B 样条的最小二乘拟合来生成单个 B 样条曲线。

从实现的角度来看,方法 1 对您来说可能是最简单的一种,因为您已经知道如何创建内插点列表的贝塞尔曲线。方法 3 实现起来要困难得多,您可能必须将 B 样条曲线转换为贝塞尔曲线,以便在 UI 级别使用它们。详细讨论请参考此SO article

【讨论】:

    猜你喜欢
    • 2018-01-13
    • 2020-06-26
    • 2017-08-20
    • 2023-04-03
    • 2017-01-04
    • 2020-06-06
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多