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

7

假设我们有三个点,a、b、c。b和c连接成一条直线。如何使用R计算从a到该直线的距离?是否有任何函数可以实现?


1
https://dev59.com/eGw05IYBdhLWcg3w_Gqw 可能有答案,尤其是第二个回答。 - thelatemail
你是指从 bc 的“线段”,还是通过 bc 的无限直线? - Spacedman
谢谢大家。我指的是二维情况。点B和C可以确定一条线L。然后求出A到L的距离。 - Feng Chen
1个回答

16

需要区分我们处理的是二维情况还是三维情况。

2D 情况

如果问题是二维的,点 abc 的位置可以用一对数字来表示,这些数字代表点的 xy 坐标。以下函数可用于计算点 a 与由两点 bc 定义的直线之间的距离 d:

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

这里是一个示例,展示了如何应用该函数:

## 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

三维情况

在三维空间中,问题会更加复杂。我们可以使用以下两个函数:

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)
}

主要用于计算距离的函数可以使用与前面二维示例中相同的方式调用,唯一的区别在于现在点由代表xyz的三个坐标定义,如下例所示:

## 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

这个答案中使用的方程式在各种教科书中进行了描述,可以在此处此处找到。


有没有一种简单的方法获得点最接近的直线上的点的坐标? - crazjo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接