从点到分段线的最短距离

时间:2014-09-12 15:16:48

标签: geometry line distance point

我有一条分段线,2D中有大约80个点,而P(X / Y)点不在此线上。

我需要知道P'在这一行的哪个位置,它与P的距离最短。

有一种简单的计算方法吗?

编辑:

输入文件:

str(coords)
'data.frame':   80 obs. of  2 variables:
 $ x: num  2140 2162 2169 2167 2158 ...
 $ y: num  1466 1437 1412 1390 1369 ...

str(point)
'data.frame':   1 obs. of  2 variables:
 $ x: num  1778
 $ y: num  1911

输出文件:

指向分段线

1 个答案:

答案 0 :(得分:0)

我现在有解决方案......即使效率不高。 也许有人觉得这很有用。 我改变了P的坐标以获得更好的结果。

distance <- data.frame(dist = NA)
coordinates <- data.frame(x=NA,y=NA)

coords <- data.frame(x=c(2140,2162,2169,2167,2158),y=c(1466,1437,1412,1390,1369))
point <- data.frame(x=2130,y=1400)


for(j in 1:(length(coords[,1]))){
  distance[2*j-1,1] <- sqrt((coords[j,1]-point[1,1])^2+(coords[j,2]-point[1,2])^2)
  coordinates[2*j-1,] <- coords[j,]
}

计算点P的所有垂直距离和点P&#39;的坐标。它们位于分段线上

for(j in 1:(length(coords[,1])-1)){
 d <- abs((coords[j+1,1]-coords[j,1])*(coords[j,2]-point[1,2])-
      (coords[j,1]-point[1,1])*(coords[j+1,2]-coords[j,2]))/
      sqrt((coords[j+1,1]-coords[j,1])^2+(coords[j+1,2]-coords[j,2])^2)

 t <- abs(((point[1,1]-coords[j,1])*(coords[j+1,1]-coords[j,1])+
      (point[1,2]-coords[j,2])*(coords[j+1,2]-coords[j,2]))/
      ((coords[j+1,1]-coords[j,1])^2+(coords[j+1,2]-coords[j,2])^2))
 x <- coords[j,1]+t*(coords[j+1,1]-coords[j,1])
 y <- coords[j,2]+t*(coords[j+1,2]-coords[j,2])

 if(min(coords$x[j],coords$x[j+1]) <= x && x <= max(coords$x[j],coords$x[j+1]) &&
    min(coords$y[j],coords$y[j+1]) <= y && y <= max(coords$y[j],coords$y[j+1])){
  if(coords[j,] != c(x,y) && coords[j+1,] != c(x,y)){
   distance[2*j,1] <- d
   coordinates[2*j,] <- c(x,y)
  }
 }
}

最小距离的位置:

p <- which(distance==min(distance, na.rm=TRUE))
coordinates[p,]