Нарисуйте параллельную линию в смещении R от линии - PullRequest
0 голосов
/ 10 мая 2018

У меня есть линейная линия, которая представляет собой путешествие по некоторым улицам. Но я хочу на самом деле представить путешествие велосипедистов, которое смещено от линии, то есть они движутся около обочины дороги. Я борюсь с тем, как это сделать. Я сделал воспроизводимый фрагмент кода R для иллюстрации.

## Let's say I have a route along some streets.
library(ggplot2)

## It can be described by this
data          <- data.frame(x = c(1,3,10,5,0,5),
                            y = c(1,3,1,0,5,7),
                            label = c('a', 'b', 'c', 'd', 'e', 'f'))
## Visualised by this
ggplot(data, aes(x, y)) +
  geom_path() +
  geom_text(aes(label=label),hjust=0, vjust=0)

enter image description here

Но то, что я хочу сделать, это модель, как будто кто-то ехал на велосипеде. Допустим, они проходят на расстоянии 0,5 от центральной линии дороги, влево, но, конечно, «влево» относительно направления линии. Начало пути будет выглядеть примерно так. Обратите внимание на «new_x» и «new_y». не математически правильно. Это оценки в иллюстративных целях.

data          <- data.frame(x = c(1,3,10,5,0,5),
                            y = c(1,3,1,0,5,7),
                            new_x = c(0.7, 3, 10.5,NA, NA, NA) ,
                        new_y = c(1.5, 3.5, 1, NA, NA, NA),
                        label = c('a', 'b', 'c', 'd', 'e', 'f'))

## Visualised by this showing the old line and the new line
ggplot(data, aes(x, y)) +
  geom_path() +
  geom_text(aes(label=label),hjust=0, vjust=0) +
  geom_path(data = data, aes(new_x, new_y), colour='red')

enter image description here

Итак, вопрос в том, как правильно рассчитать new_x и new_y, чтобы создать непрерывную линию, представляющую поездку велосипедиста в виде смещения от центра дороги

1 Ответ

0 голосов
/ 10 мая 2018

Существует пакет, который обеспечивает вычисление смещения для сплайнов: https://www.stat.auckland.ac.nz/~paul/Reports/VWline/offset-xspline/offset-xspline.html

Вот несколько очень простых приближений.Я специально оставил повороты, чтобы отрезать их, поскольку это, вероятно, будет лучшим приближением того, как велосипеды повернут за угол.Обратите также внимание, что для расчета «внутреннего» сдвига потребуются дополнительные шаги:

x <-  c(1,3,10,5,0,5)
y <-  c(1,3,1,0,5,7)
d <- 0.5   # distance away from the road


# Given a vector (defined by 2 points) and the distance, 
# calculate a new vector that is distance away from the original 
segment.shift <- function(x, y, d){

  # calculate vector
  v <- c(x[2] - x[1],y[2] - y[1])

  # normalize vector
  v <- v/sqrt((v[1]**2 + v[2]**2))

  # perpendicular unit vector
  vnp <- c( -v[2], v[1] )

  return(list(x =  c( x[1] + d*vnp[1], x[2] + d*vnp[1]), 
              y =  c( y[1] + d*vnp[2], y[2] + d*vnp[2])))

}

plot(x,y, xlim=c(-1,11), ylim=c(-1,11), type="l", main= "Bicycle path" )

# allocate memory for the bike path
xn <- numeric( (length(x) - 1) * 2 )
yn <- numeric( (length(y) - 1) * 2 )

for ( i in 1:(length(x) - 1) ) {
  xs <- c(x[i], x[i+1])
  ys <- c(y[i], y[i+1])
  new.s <- segment.shift( xs, ys, d )
  xn[(i-1)*2+1] <- new.s$x[1] ; xn[(i-1)*2+2] <- new.s$x[2]
  yn[(i-1)*2+1] <- new.s$y[1] ; yn[(i-1)*2+2] <- new.s$y[2]
}

# draw the path
lines(xn, yn, col="brown", lwd =2, lty=2)

enter image description here

...