使用R,如何计算从一个点到一条线的距离?
Using R, how to calculate the distance from one point to a line?
假设我们有三个点,a、b、c。 b 和 c 连接成一条线。如何使用 R 计算从 a 到这条线的距离?有什么功能吗?
必须区分我们处理的是二维还是三维情况。
二维案例
如果问题是二维的,点a
、b
和c
的位置可以用代表点[=17的数字对来定义=] 和 y
坐标。
以下函数可用于计算点 a
与由两点 b
和 c
定义的直线的距离 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
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)
}
计算距离的主函数的调用方式与前面的二维示例相同,唯一的区别是现在点由三个坐标定义,分别代表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
假设我们有三个点,a、b、c。 b 和 c 连接成一条线。如何使用 R 计算从 a 到这条线的距离?有什么功能吗?
必须区分我们处理的是二维还是三维情况。
二维案例
如果问题是二维的,点a
、b
和c
的位置可以用代表点[=17的数字对来定义=] 和 y
坐标。
以下函数可用于计算点 a
与由两点 b
和 c
定义的直线的距离 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
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)
}
计算距离的主函数的调用方式与前面的二维示例相同,唯一的区别是现在点由三个坐标定义,分别代表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