使用R,如何计算从一点到一条线的距离?

Fen*_*hen 5 r point distance line

假设我们有三个点,a,b,c.b和c链接成一条线.如何用R来计算从a线到这条线的距离?有什么功能吗?非常感谢

RHe*_*tel 12

必须区分我们是处理二维还是三维情况.

2D案例

如果问题是二维的,这些点的位置a,b并且c可以通过对代表点号码来定义xy坐标.以下函数可用于计算da与两点定义的线的距离,b并且c:

dist2d <- function(a,b,c) {
 v1 <- b - c
 v2 <- a - b
 m <- cbind(v1,v2)
 d <- abs(det(m))/sqrt(sum(v1*v1))
} 
Run Code Online (Sandbox Code Playgroud)

这是一个示例,说明如何应用该功能:

## two-dimensional case:
a2 <- c(0,2)
b2 <- c(2,0)
c2 <- c(1,3)
d2 <- dist2d(a2,b2,c2) # distance of point a from line (b,c) in 2D
#> d2
#[1] 1.264911
Run Code Online (Sandbox Code Playgroud)

3D案例

在三个方面,问题稍微复杂一些.我们可以使用以下两个功能:

dist3d <- function(a,b,c) {
  v1 <- b - c
  v2 <- a - b      
  v3 <- cross3d_prod(v1,v2)
  area <- sqrt(sum(v3*v3))/2
  d <- 2*area/sqrt(sum(v1*v1))
}

cross3d_prod <- function(v1,v2){
  v3 <- vector()
  v3[1] <- v1[2]*v2[3]-v1[3]*v2[2]
  v3[2] <- v1[3]*v2[1]-v1[1]*v2[3]
  v3[3] <- v1[1]*v2[2]-v1[2]*v2[1]
  return(v3)
}
Run Code Online (Sandbox Code Playgroud)

计算距离的主要功能可以通过与上一个示例中相同的方式在两个维度中调用,唯一的区别是现在这些点由三个坐标表示x,y并且z,如下例所示:

## three-dimensional case:
a3 <- c(0,0,2)
b3 <- c(1,0,0) 
c3 <- c(2,3,1)
d3 <- dist3d(a3,b3,c3) # distance of point a from line (b,c) in 3D
#> d3
#[1] 2.215647
Run Code Online (Sandbox Code Playgroud)

本答案中使用的等式在各种教科书中描述,并且可以在例如此处此处找到.