【问题标题】:Curve fitting a series of line segments曲线拟合一系列线段
【发布时间】:2011-08-27 00:21:50
【问题描述】:

关于 SO 有很多曲线拟合问题,但我似乎找不到一个能解决我正在寻找的问题的问题。

场景很简单:我在平板电脑屏幕上捕捉 X/Y 点。我想将生成的线段绘制为平滑曲线而不是一系列线段。许多应用程序都这样做,例如:Penultimate (sketching demo at 0:36) 或 Autodesk Sketchbook

Bezier 曲线算法采用固定数量的点来绘制曲线,并且似乎不适用于多个点。谁能指出一个做得很好的算法?

【问题讨论】:

    标签: drawing line curve


    【解决方案1】:

    Fit-Curve 实际上是样条曲线,而不是贝塞尔曲线。但是,您可以制作贝塞尔曲线,使其看起来像样条曲线(样条曲线没有控制点)。我在这个问题上进行了很多搜索,并向自己介绍/实现了很多过于复杂的算法,最后我发现这项任务比我想象的要容易得多(我确实觉得必须这样做,我发誓:))

    Here is 最好的描述,我会从这篇文章中摘录:

    在大多数实现中,Bezier Curve 绘制函数将两个控制点和一个点本身(对于一个段)作为参数,所以您需要的只是迭代地找到新段的控制点(我认为最好更新最后一段,并在曲线的末端为每个新点绘制一个新的):

    这里是 JavaScript 代码(t 最简单的情况是曲线的恒定平滑度):

    function getControlPoints(x0,y0,x1,y1,x2,y2,t){
        var d01=Math.sqrt(Math.pow(x1-x0,2)+Math.pow(y1-y0,2));
        var d12=Math.sqrt(Math.pow(x2-x1,2)+Math.pow(y2-y1,2));
        var fa=t*d01/(d01+d12);
        var fb=t*d12/(d01+d12);
        var p1x=x1-fa*(x2-x0);
        var p1y=y1-fa*(y2-y0);
        var p2x=x1+fb*(x2-x0);
        var p2y=y1+fb*(y2-y0);  
        return [p1x,p1y,p2x,p2y];
    }
    

    请务必阅读并理解文章,我认为这是一篇最好、最短、最清晰的文章。

    【讨论】:

      【解决方案2】:

      检查样条曲线。它们基本上将一组控制点作为输入并输出一组三次曲线,其中每条曲线都与前一条曲线相切,从而给出平滑的轮廓。

      看到这个:http://en.wikipedia.org/wiki/Cubic_Hermite_spline

      【讨论】:

        猜你喜欢
        • 2012-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-19
        • 2020-06-26
        • 2015-03-02
        • 2018-07-23
        • 1970-01-01
        相关资源
        最近更新 更多