我试图通过SO上的两个单独的问题来处理我的一般问题:Specify clamped knot vector in bs-call和Fit a B spline to a control path。对这些问题的回应使我重新解决了我现在发布的更大问题。
我想要完成的是(在R中),给定一组(非单调的)控制点,如何沿着控制点给出的路径绘制b样条。 b样条必须夹在两端。这纯粹是出于图形目的。
注意:我不是试图根据控制点预测值。使用Fit a B spline to a control path中建议的predict
,lm
和bs
的组合会导致尝试通过控制点的ab样条(这不是重点) - 尤其是如果设置df
或knots
以便压紧样条曲线,则此方法会导致过度拟合,样条曲线将通过每个控制点。
最后,该方法将应用于100或1000个独立的控制点集,因此算法效率是一个因素,尽管目前我只是在寻找一种方法来完成它。
玩具数据(与链接问题相同):
path <- data.frame(
x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
)
所有这些都是为了计算R中的Hierarchical Edge Bundles。
修改
好的,所以我似乎无法访问底层使用的底层b样条实现(或者我没有努力尝试)。无论如何,我最终根据Jason Yu-Tseh Chi的de Boor算法制作了自己的基于Rcpp的实现。这样做的好处是我可以使其矢量化,因此可以一次构建多条路径。这将是即将推出的CRAN软件包(hierarchicalSets)的一部分,但我很乐意与在此期间表达兴趣的任何人分享(太长,无法发布)...
更新
对于对此感兴趣的任何人,样条绘图将作为ggforce扩展包中ggplot2的geom / stat扩展实现