我正在尝试计算通过一系列xy坐标的类似Bezier的样条曲线。一个示例类似于cscvn
Matlab中的函数的以下输出(example link):
我相信(不再维护)grid
用于执行此操作(grid.xspline
功能?)的软件包,但我无法安装该软件包的存档版本,也找不到与我想要的内容完全相同的任何示例。
该bezier
程序包看起来也很有前途,但速度非常慢,我也无法完全正确:
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]
)
如您所见,除最终值外,它不经过任何点。
我将不胜感激这里的一些指导!
它可能不是最好的方法,但grid
肯定不是不活跃的。它是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
帮助页面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句