且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将B样条曲线拟合到控制路径

更新时间:2022-03-17 03:49:52

总体思路是假设x和y实际上是独立的,从而对其进行独立预测:

The general idea is to predict x and y independently, assuming they are in fact independend:

library(splines)

path <- data.frame(
    x = c(3, 3.5, 4.6875, 9.625, 5.5625, 19.62109375, 33.6796875, 40.546875, 36.59375, 34.5, 33.5, 33),
    y = c(0, 1, 4, 5, 6, 8, 7, 6, 5, 2, 1, 0)
)
# add the time variable
path$time  <- seq(nrow(path))

# fit the models
df  <-  5
lm_x <- lm(x~bs(time,df),path)
lm_y <- lm(y~bs(time,df),path)

# predict the positions and plot them
pred_df  <-  data.frame(x=0,y=0,time=seq(0,nrow(path),length.out=100) )
plot(predict(lm_x,newdata = pred_df),
     predict(lm_y,newdata = pred_df),
     type='l')

您确实需要谨慎定义时间变量,因为路径并非独立于时间选择(即使它们是顺序的),因为样条曲线在预测变量中的点间距也不是不变的空间。例如:

you do need to be careful about defining your time variable, since the path is not independent of choice of times (even when they're sequential) since splines are not invariant on the spacing of points in the predictor space. For example:

plotpath  <-  function(...){
    # add the time variable with random spacing
    path$time  <- sort(runif(nrow(path)))

    # fit the models
    df  <-  5
    lm_x <- lm(x~bs(time,df),path)
    lm_y <- lm(y~bs(time,df),path)

    # predict the positions and plot them
    pred_df  <-  data.frame(x=0,y=0,time=seq(min(path$time),max(path$time),length.out=100) )
    plot(predict(lm_x,newdata = pred_df),
         predict(lm_y,newdata = pred_df),
         type='l',...)
}

par(ask=TRUE); # wait until you click on the figure or hit enter to show the next figure
for(i in 1:5)
    plotpath(col='red')