计算R中的2D样条曲线

我试图计算一个通过一系列x-y坐标的贝塞尔样样条曲线.一个例子就像Matlab( example link)中的cscvn函数的以下输出:

我相信(不再维护)网格包用于做这个(grid.xspline函数?),但是我没有能够安装一个归档版本的包,并没有找到任何例子,我想要什么

贝塞尔包也看起来很有前途,但它非常慢,我也不能很正确的:

library(bezier)

set.seed(1)
n <- 10
x <- runif(n)
y <- runif(n)
p <- cbind(x,y)
xlim <- c(min(x) - 0.1*diff(range(x)), c(max(x) + 0.1*diff(range(x))))
ylim <- c(min(y) - 0.1*diff(range(y)), c(max(y) + 0.1*diff(range(y))))
plot(p, xlim=xlim, ylim=ylim)
text(p, labels=seq(n), pos=3)

bp <- pointsOnBezier(cbind(x,y), n=100)
lines(bp$points)
arrows(bp$points[nrow(bp$points)-1,1], bp$points[nrow(bp$points)-1,2],
  bp$points[nrow(bp$points),1], bp$points[nrow(bp$points),2]
)

你可以看到,除了最终值之外,它不会通过任何点.

我非常感谢这里的一些指导!

它可能不是最好的方法,位网格肯定不是不活动的.它作为默认包与R安装一起被包含.它是用于绘制像格和ggplot这样的库的底层图形引擎.你不需要安装它,你应该可以加载它.以下是我可以将您的代码翻译成grid.xpline的方法

set.seed(1)
n <- 10
x <- runif(n)
y <- runif(n)
xlim <- c(min(x) - 0.1*diff(range(x)), c(max(x) + 0.1*diff(range(x))))
ylim <- c(min(y) - 0.1*diff(range(y)), c(max(y) + 0.1*diff(range(y))))

library(grid)
grid.newpage()
pushViewport(viewport(xscale=xlim, yscale=ylim))
grid.points(x, y, pch=16, size=unit(2, "mm"), 
    default.units="native")
grid.text(seq(n), x,y, just=c("center","bottom"), 
    default.units="native")
grid.xspline(x, y, shape=c(0,rep(-1, 10-2),0), open=TRUE, 
    default.units="native")
popViewport()

这导致

请注意,网格是相当低级别的,所以它不是很容易使用,但它允许你更多地控制你在哪里和在哪里绘制.

如果要沿曲线提取点,而不是绘制点,请查看?xsplinePoints帮助页面.

相关文章
相关标签/搜索