2015-11-06 2 views
1

Я понимаю, что существует много вопросов и ответов об использовании B-сплайнов в R, но мне еще предстоит найти ответ на этот (казалось бы, простой) вопрос.Установите сплайн B на путь управления

Учитывая набор точек, описывающих траекторию управления, как вы вписываете в него кривую B-сплайна и извлекаете заданное количество точек (скажем, 100) вдоль кривой для построения графика. Улов в том, что путь не является монотонным ни в x, ни в y.

тракту контрольный пример:

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) 
) 

я в основном смотрел на splines пакет, но опять же, большинство примеров было относительно подгонки гладкой кривой к данным. Для контекста, я смотрю на реализацию hierarchical edge bundling в R.

ответ

2

Общая идея состоит в том, чтобы предсказать, х и у независимо друг от друга, при условии, что они на самом деле зависимы друг от друга:

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') 

вы должны быть осторожны, об определении ваша переменная времени, поскольку путь не зависит от выбора времени (даже если они являются последовательными), поскольку сплайны не являются инвариантными по расстоянию между точками в пространстве предсказателя. Например:

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') 
+0

Что касается «правильности», если переменная времени отражает расстояние между точками или это выравнивается? – ThomasP85

+0

См. Обновленный ответ. – Jthorpe

+0

См. Http://stackoverflow.com/questions/33609538/specify-clamped-knot-vector-in-bs-call для последующего ... – ThomasP85

Смежные вопросы