UNPKG

clay-core

Version:

Provide a more friendly web-side drawing interface!

88 lines (84 loc) 3.95 kB
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <link rel="stylesheet" href="../../libs/easycss-1.3.1.min.css"> <link rel="stylesheet" href="../../libs/prettify.css"> <link rel="stylesheet" href="../../doc.css"> <script src="../../libs/prettify.js"></script> </head> <body onload="prettyPrint()"> <header> 曲线插值 </header> <p> 给定若干个不连续的点,在这些点之间插入足够的点,来使得这些点连接起来可以反映最初那些点的走势。 </p> <h2> Hermite </h2> <p> hermite三次插值是在确定二个点和二个点的斜率前提下,用一个y=ax <sup>3</sup>+bx <sup>2</sup>+cx+d的三次多项式来求解出插值函数。 </p> <pre class='prettyprint lang-js'>var interFun=$$.hermite();</pre> <p> 上面获取了这个插值函数,你可以参考下面的方法修改或采用默认的配置: </p> <pre class='prettyprint lang-js'>interFun.setU(t);</pre> <p> 设置张弛系数,应该在点的位置设置前设置。该参数用于调整曲线走势,默认数值t=0,分水岭t=-1,|t-(-1)|的值越大,曲线走势调整的越严重。返回插值函数。 </p> <pre class='prettyprint lang-js'>interFun.setP(x1, y1, x2, y2, s1, s2);</pre> <p> 设置已经确定的二个点和二个点的斜率,必须设置。返回插值函数。 </p> <p> 配置好需要配置的选项后,interFun就是所求的插值函数,比如你现在想知道点x3(x1&lt;=x3&lt;=x2)处的y值: </p> <pre class='prettyprint lang-js'>y=interFun(x3);</pre> <h2> Cardinal </h2> <p> 当插值点数量增加的时候,很容易带来收敛困难,也就是Runge现象,因此在大多数情况下,三次插值已经足够用了。在需要插值的点的个数比较多的时候,我们提供了下面的分段Hermite法,也就是Cardinal插值法。 </p> <pre class='prettyprint lang-js'>var interFun=$$.cardinal();</pre> <p> 第一步依旧是获取插值函数,你可以调用下面的方法修改或采用默认的配置: </p> <pre class='prettyprint lang-js'>interFun.setU(t);</pre> <p> setU方法和Hermite中一样,不再赘述。 </p> <pre class='prettyprint lang-js'>interFun.setP(points);</pre> <p> setP表示设置若干个需要插值的点,points是一个数组,长度不小于2,里面的成员应该是一个数组,下面看看几个例子: </p> <pre class="prettyprint lang-js error">interFun.setP([1, 2])、interFun.setP([[1, 2]])</pre> <pre class="prettyprint lang-js bingo">interFun.setP([[1, 2], [3, 4]])、interFun.setP([[1, 2], [3, 4], [5, 6]])</pre> <p> 配置好以后,比如x=a,其中a在需要插值的点之间(边界也可以),你可以这样求解出y值: </p> <pre class='prettyprint lang-js'>y=interFun(a);</pre> <h2> catmull-rom </h2> <p> 上面两种情况,都是基于函数的情况,有时候,我们需要支持非函数的情况。 </p> <p> 给定四个点p0,p1,p2,p3,计算出p1,p2之间的插值,其中的p0,p3为控制点,对于这四个点,没有特殊要求。 </p> <pre class='prettyprint lang-js'>var interFun=clay.catmullRom() // 设置四个点 .setD(p1, p2, p3, p4);</pre> <p> 和前面两个插值方法不同的是,获取插值坐标不是通过x求出y,而是提供一个偏移量deep(范围是[0, 1])来求解插入的坐标(x, y),因为不是函数,这样应该是容易理解的: </p> <pre class='prettyprint lang-js'>p=interFun(deep);</pre> </body> </html>