Расстояние между точками в двух списках, упорядоченных по элементам, а не по min - PullRequest
1 голос
/ 18 июня 2019

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

 library(rgeos)
 library(ggplot)

 #nonmoving background nodes
 set.seed(5)
 nodes <- data.frame(matrix(nrow=20,ncol=2))
 colnames(nodes) <- c("X","Y")
 nodes$X <- runif(20,0,20)
 nodes$Y <- runif(20,0,20)

 ggplot(data=nodes,aes(x=X,y=Y))+
   geom_point()


 # particles first frame
 particles1 <- c(0,19,5,2,10,10,20,1,15,17)
 particles1 <- matrix(particles1,ncol=2,byrow=T)
 particles1 <- as.data.frame(particles1)

 ggplot(data=nodes,aes(x=X,y=Y))+
   geom_point()+
   geom_point(data=particles1,aes(x=V1,y=V2),col="red")

Итак, мы уже можем видеть, какие узлы будут ближе всего к каким частицам.

 #find 2 closest nodes to each particle
 closestnodes <- t(apply (gDistance (SpatialPoints(nodes), SpatialPoints(particles1) ,byid=T), 1, function(x) order(x,decreasing=F)[1:2]))

 # plot particles in red, closest nodes in orange
 ggplot(data=nodes,aes(x=X,y=Y))+
   geom_point()+
   geom_point(data=particles1,aes(x=V1,y=V2),col="red")+
   geom_point(data=nodes[closestnodes,],aes(x=X,y=Y),col="orange")

 #find distances to first and second closest nodes
 distances<- 
 cbind(apply(gDistance(SpatialPoints(nodes[closestnodes[,1],]),                            
 SpatialPoints(particles1),byid=T),1,min),            
 apply(gDistance(SpatialPoints(nodes[closestnodes[,2],]),
 SpatialPoints(particles1),byid=T),1,min))

Отлично, так что код работает и дает расстояния от каждогоуказывают на два ближайших к нему узла, но проблема возникает, когда точки сближаются или разделяют близкие узлы.

 #new particle df
 particles2 <- c(4,9.7,4,14,10,2,15,13,18,14)
 particles2 <- matrix(particles2,ncol=2,byrow=T)
 particles2 <- as.data.frame(particles2)

 #new closest nodes
 closestnodes2 <- t(apply(gDistance(SpatialPoints(nodes),SpatialPoints(particles2),byid=T),1,function(x) order(x,decreasing=F)[1:2]))

 #new plot of particles in red, close nodes in orange
 #notice some of the closest nodes are shared, so there are only 7 unique closest nodes for the 5 particles
 ggplot(data=nodes,aes(x=X,y=Y))+
  geom_point()+
  geom_point(data=particles2,aes(x=V1,y=V2),col="red")+
  geom_point(data=nodes[closestnodes2,],aes(x=X,y=Y),col="orange")

 #new distances
 distances2 <- 
 cbind(apply(gDistance(SpatialPoints(nodes[closestnodes2[,1],]),                              
 SpatialPoints(particles2),byid=T),1,min),               
 apply(gDistance(SpatialPoints(nodes[closestnodes2[,2],]),
 SpatialPoints(particles2),byid=T),1,min))

         [,1]       [,2]
 1 0.05734493 0.05734493
 2 3.80414471 4.25678464
 3 0.83460359 1.81570764
 4 1.91783811 1.91783811
 5 2.05729381 2.05729381

Поскольку моя команда поиска расстояния просто «сравнивает все узлы со всеми частицами и выбирает минимальное расстояние в строке», она портится, когда ближайший узел к одной частице также является вторым ближайшим узлом кдругая частица.Приведенный выше DF показывает, что частица 1 находится на расстоянии 0,05 от ближайшего узла и 0,05 от второго ближайшего узла, что не соответствует действительности.Это просто измерение одного и того же узла дважды.Мне нужно переписать команду расстояний, чтобы сказать «измерить расстояние между этим списком узлов и этим списком частиц по порядку элементов, а не по минутам».Любая помощь приветствуется.

...