Я пишу код для отслеживания движущихся частиц между статическими узлами.В каждом кадре частицы находят 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 от второго ближайшего узла, что не соответствует действительности.Это просто измерение одного и того же узла дважды.Мне нужно переписать команду расстояний, чтобы сказать «измерить расстояние между этим списком узлов и этим списком частиц по порядку элементов, а не по минутам».Любая помощь приветствуется.