如何使 R 中的 xspline 曲线对称?

How do I make an xspline curve symmetric in R?

我正在尝试使用 R 中的 xspline 函数绘制形状。 使用一组控制点,我可以获得形状,但它是不对称的,即使点和形状值都是对称的。

如何对称地绘制这个形状?

这画出了大致的形状,但线条显示了它是如何不对称的。

curve <- data.frame(x=c(-0.1,-0.1,-0.1,-0.1,0.1,0.1,0.1,0.1,0.1,0.1,-0.1,-0.1,-0.1),y=c(0.1,0.1,0.1,0.3,0.3,0.1,0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
plot(curve)
xspline(curve,shape=1,open=F)
lines(x=c(-0.15,0.15),y=c(0.15,0.15),col="red")
lines(x=c(-0.15,0.15),y=c(-0.15,-0.15),col="red")

我尝试更改每个节点的形状值但没有成功。

你的问题实际上是两个问题合二为一:

  1. 曲线(作为数学对象)是否关于 x 轴对称?
  2. 图片上是这样吗?

回答2

即使答案 1 是 "Yes"(我怀疑,见下文),我认为答案是 "No." 从 documentation 来看,xspline 做了什么是它在许多点评估曲线,然后绘制连接这些点的折线。你可以说服自己:设置drawF,下面应该给你两个数组,一个x-和一个y-值。

curve <- data.frame(x=c(-0.1,-0.1,-0.1,-0.1,0.1,0.1,0.1,0.1,0.1,0.1,-0.1,-0.1,-0.1),y=c(0.1,0.1,0.1,0.3,0.3,0.1,0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
plot(curve)
pts=xspline(curve,shape=1,open=F,draw=F)
pts

我认为没有任何方法可以控制评估点的数量或密度。所以即使你的曲线(作为数学对象,蓝色)是对称的,它的折线渲染(黑色)也不一定是:

仅此一项就可以解释与@Mike 评论的细微差异。

回答 1

我们不知道 R 是如何强制关闭曲线的。根据文档,

For open X-splines, the start and end control points must have a shape of 0 (and non-zero values are silently converted to zero).

我想它在最后添加了另一个控制点,使它等于第一个并将它们的 shape 设置为零。但这与图片右侧的控制点不同!你的控制点 (0.1, 0.1) 重复了两次(不像 (-0.1, 0.1) 那样重复了三次)并且它的形状是 1,而不是 0(注意:控制点被重复了三次,也许这没有任何影响;我们将不得不检查文档中链接的论文)。

我已经对此进行了调整并绘制了曲线及其镜像版本,以便我们看到差异。

curve <- data.frame(
  x=c(-0.1,-0.1,-0.1,-0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1,-0.1,-0.1,-0.1),
  y=c( 0.1, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))
xswap <- data.frame(
  x=c( 0.1, 0.1, 0.1, 0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1,-0.1, 0.1, 0.1, 0.1),
  y=c( 0.1, 0.1, 0.1, 0.3, 0.3, 0.1, 0.1, 0.1,-0.1,-0.1,-0.3,-0.3,-0.1,-0.1))

plot(curve)
xspline(curve,shape=c(0,1,1,1,1,1,1,0,1,1,1,1,1,1),open=F)
xspline(xswap,shape=c(0,1,1,1,1,1,1,0,1,1,1,1,1,1),open=F)
lines(x=c(-0.15,0.15),y=c(0.15,0.15),col="red")
lines(x=c(-0.15,0.15),y=c(-0.15,-0.15),col="red")

对我来说,它们似乎非常重叠,尤其是考虑到答案 2 的影响。

一般建议

  1. 除非绝对必要,否则不要重复控制点。这往往会对底层参数化产生有趣的影响。通常(在我看来),重复的控制点来自人们混淆控制点和结。

  2. 当您想要相对于 x 轴对称时,将第一个(也是最后一个)控制点放在上面。那么你就不用担心找不到对应的控制点shape你必须设置为0.

例如,

curve <- data.frame(
x=c(0,  1,  1,  0, -1, -1),
y=c(1,  1, -1, -1, -1,  1))
curve_x_swapped <- data.frame(
x=c(0, -1, -1,  0,  1,  1),
y=c(1,  1, -1, -1, -1,  1))
plot(curve)
xspline(curve,          shape=1,open=F)
xspline(curve_x_swapped,shape=1,open=F,border="red")