11

xy 座標のシーケンスを通過するベジエのようなスプライン曲線を計算しようとしています。例はcscvn、Matlab の関数からの次の出力のようになります ( example link )。

ここに画像の説明を入力

(もうメンテナンスされていない)gridパッケージがこれを行うために使用されていたと思います ( grid.xsplinefunction?) が、アーカイブされたバージョンのパッケージをインストールできず、私が望むものと正確に一致する例が見つかりません.

パッケージも有望に見えますが、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]
)

ここに画像の説明を入力

ご覧のとおり、終了値以外のポイントを通過していません。

ここでいくつかのガイダンスをいただければ幸いです。

4

3 に答える 3

12

本当に使う必要はありませgridん。パッケージxsplineからアクセスできます。graphics

あなたのコードとshape@mrflick から:

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)

追加の行が 1 つだけ必要です。

xspline(x, y, shape = c(0,rep(-1, 10-2),0), border="red")

ここに画像の説明を入力

于 2015-01-22T21:56:40.253 に答える
4

これを手伝ってくれたすべての人に感謝します。学んだ教訓とその他のいくつかの側面を要約しています。

Catmull-Rom スプラインと 3 次 B スプライン

関数内の負の形状値は、xsplineスプラインが xy ポイントを通過する Catmull-Rom タイプのスプラインを返します。正の値は、3 次 B タイプ スプラインを返します。ゼロの値は鋭角を返します。単一の形状値が指定されている場合、これがすべてのポイントに使用されます。終点の形状は常に鋭い角 (形状 = 0) のように扱われ、他の値は終点で結果として得られるスプラインに影響しません。

# Catmull-Rom spline vs. cubic B-spline
plot(p, xlim=extendrange(x, f=0.2), ylim=extendrange(y, f=0.2))
text(p, labels=seq(n), pos=3)
# Catmull-Rom spline (-1)
xspline(p, shape = -1, border="red", lwd=2) 
# Catmull-Rom spline (-0.5)
xspline(p, shape = -0.5, border="orange", lwd=2) 
# cubic B-spline (0.5)
xspline(p, shape = 0.5, border="green", lwd=2) 
# cubic B-spline (1)
xspline(p, shape = 1, border="blue", lwd=2)
legend("bottomright", ncol=2, legend=c(-1,-0.5), title="Catmull-Rom spline", col=c("red", "orange"), lty=1)
legend("topleft", ncol=2, legend=c(1, 0.5), title="cubic B-spline", col=c("blue", "green"), lty=1)

ここに画像の説明を入力

xspline外部プロット用のからの結果の抽出

これにはいくらかの検索が必要でしたが、秘訣は引数draw=FALSEをに適用することxsplineです。

# Extract xy values
plot(p, xlim=extendrange(x, f=0.1), ylim=extendrange(y, f=0.1))
text(p, labels=seq(n), pos=3)
spl <- xspline(x, y, shape = -0.5, draw=FALSE) 
lines(spl)
arrows(x0=(spl$x[length(spl$x)-0.01*length(spl$x)]), y0=(spl$y[length(spl$y)-0.01*length(spl$y)]),
       x1=(spl$x[length(spl$x)]), y1=(spl$y[length(spl$y)])
)

ここに画像の説明を入力

于 2015-01-23T15:08:39.423 に答える