r - 如何找到点到线的距离(知道所有点)?
问题描述
我有一条由两个点 BA 和一个点 P 组成的线。我想找到从 P 到 BA 的垂线和到 BA 的平行线的距离。你知道在R或Matlab中是否有任何功能区域吗?我附上一张图片,以便更容易理解。
解决方案
从教科书公式中可以直接看出函数编码。
dist_point2line <- function(P, A, B){
dx <- B[1] - A[1]
dy <- B[2] - A[2]
numer <- abs(dy*P[1] - dx*P[2] + B[1]*A[2] - B[2]*A[1])
denom <- sqrt(dx^2 + dy^2)
d <- numer/denom
inv_cos_ang <- if(dy == 0) 1 else sqrt(1 + (dx/dy)^2)
p <- d*inv_cos_ang
list(dist = d, parallel = p)
}
用从原点到经过(0, 1)
和的线的距离进行测试(1, 0)
。结果是sqrt(2)/2
,平行于 x 轴的距离是1
。
sqrt(2)/2
#[1] 0.7071068
dist_point2line(c(0, 0), c(1, 0), c(0, 1))
#$dist
#[1] 0.7071068
#
#$parallel
#[1] 1
另一个例子,取自@ThomasIsCoding的回答。注意结果不一样,这个是对的。
A <- c(1, 3)
B <- c(5, 10)
P <- c(7, 7)
dist_point2line(P, A, B)
#$dist
#[1] 3.224903
#
#$parallel
#[1] 3.714286
要知道这个是正确的,只需注意从 P 到平行于 x 轴的线段的距离明显在 3 左右,而不是 0.8。
plot(1, type = "n", xlim = c(0, 8), ylim = c(0, 11))
points(P[1], P[2], col = "red")
points(A[1], A[2])
points(B[1], B[2])
segments(A[1], A[2], B[1], B[2])
abline(h = P[2])
编辑
在 OP 请求让函数计算平行于 y 轴的距离之后,这里是上述函数的新版本。
dist_point2line <- function(P, A, B){
dx <- B[1] - A[1]
dy <- B[2] - A[2]
numer <- abs(dy*P[1] - dx*P[2] + B[1]*A[2] - B[2]*A[1])
denom <- sqrt(dx^2 + dy^2)
d <- numer/denom
inv_cos_ang <- if(dy == 0) 1 else sqrt(1 + (dx/dy)^2)
inv_sin_ang <- if(dx == 0) 1 else sqrt(1 + (dy/dx)^2)
px <- d*inv_cos_ang
py <- d*inv_sin_ang
list(dist = d, parallel = c(xdist = px, ydist = py))
}
推荐阅读
- gitlab - 不确定如何将 rstudio 与 gitlab 连接?
- javascript - 从 Jquery UI Datepicker 中的 dtes 范围获取差异
- java - 服务器 tomcat 9.0 启动失败
- bash - 在“then”附近抨击意外令牌
- sql - 从 Django 中的多个数据库表返回结果
- php - 我这里的代码太多了,想缩短这个
- javascript - 如何获取 JavaScript 对象的键的字符串值?
- ruby - 如何关联不同类型的角色(代理和客户)
- php - 直到 n 可被 A 或 B 整除但不能被 C 整除的数字列表
- java - 如何在 ubuntu 中使用 Intellij 的 jre