如何使 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")
我尝试更改每个节点的形状值但没有成功。
你的问题实际上是两个问题合二为一:
- 曲线(作为数学对象)是否关于 x 轴对称?
- 图片上是这样吗?
回答2
即使答案 1 是 "Yes"(我怀疑,见下文),我认为答案是 "No." 从 documentation 来看,xspline
做了什么是它在许多点评估曲线,然后绘制连接这些点的折线。你可以说服自己:设置draw
为F
,下面应该给你两个数组,一个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 的影响。
一般建议
除非绝对必要,否则不要重复控制点。这往往会对底层参数化产生有趣的影响。通常(在我看来),重复的控制点来自人们混淆控制点和结。
当您想要相对于 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")
我正在尝试使用 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")
我尝试更改每个节点的形状值但没有成功。
你的问题实际上是两个问题合二为一:
- 曲线(作为数学对象)是否关于 x 轴对称?
- 图片上是这样吗?
回答2
即使答案 1 是 "Yes"(我怀疑,见下文),我认为答案是 "No." 从 documentation 来看,xspline
做了什么是它在许多点评估曲线,然后绘制连接这些点的折线。你可以说服自己:设置draw
为F
,下面应该给你两个数组,一个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 的影响。
一般建议
除非绝对必要,否则不要重复控制点。这往往会对底层参数化产生有趣的影响。通常(在我看来),重复的控制点来自人们混淆控制点和结。
当您想要相对于 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")