2016-02-04 28 views
1

假設我們有三點,a,b,c。 b和c鏈接成一條線。如何使用R來計算從a到這條線的距離?有沒有功能? 非常感謝使用R,如何計算從一個點到一條線的距離?

+1

http://stackoverflow.com/questions/6910814/calculate-distance-between-regression-line-and-datapoint可能有答案,特別是第二個答案 – thelatemail

+0

你的意思是從「b」的「線段」 '到'c',還是通過'b'和'c'的無限行? – Spacedman

+0

謝謝你們。我的意思是在二維情況下。點b和c可以確定一條線l。然後從a到l的距離。 –

回答

7

無論我們處理的是二維還是三維的情況,都必須區分。

2D情況

如果問題是二維的,則點abc的位置可通過對代表點xy座標數來定義。 下面的函數可以用來從由所述兩個點bc限定的線計算點a的距離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情況下

在三維中,這個問題是稍微更compli cated。我們可以用以下兩種功能:

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 

在此答案給出的公式中的各種教科書中描述,且可以發現,例如,herehere

相關問題