当前位置: 首页 > 知识库问答 >
问题:

从点到分段直线的最短距离

左宁
2023-03-14

我有一条在2D中有80个点的分段线和一个不在这条线上的点P(X/Y)。

我需要知道点P'在这条线上的什么位置,它与点P的距离最短。

有没有一个简单的计算方法

编辑:

输入文件:

str(coords)
'data.frame':   80 obs. of  2 variables:
 $ x: num  2140 2162 2169 2167 2158 ...
 $ y: num  1466 1437 1412 1390 1369 ...

str(point)
'data.frame':   1 obs. of  2 variables:
 $ x: num  1778
 $ y: num  1911

输出文件:

分段线上的点

共有1个答案

司徒高丽
2023-03-14

我现在有了解决方案…尽管它不是很有效。也许有人觉得这很有用。为了得到更好的结果,我改变了P的坐标。

distance <- data.frame(dist = NA)
coordinates <- data.frame(x=NA,y=NA)

coords <- data.frame(x=c(2140,2162,2169,2167,2158),y=c(1466,1437,1412,1390,1369))
point <- data.frame(x=2130,y=1400)


for(j in 1:(length(coords[,1]))){
  distance[2*j-1,1] <- sqrt((coords[j,1]-point[1,1])^2+(coords[j,2]-point[1,2])^2)
  coordinates[2*j-1,] <- coords[j,]
}

计算距点P的所有垂直距离以及位于分段线上的点P'的坐标

for(j in 1:(length(coords[,1])-1)){
 d <- abs((coords[j+1,1]-coords[j,1])*(coords[j,2]-point[1,2])-
      (coords[j,1]-point[1,1])*(coords[j+1,2]-coords[j,2]))/
      sqrt((coords[j+1,1]-coords[j,1])^2+(coords[j+1,2]-coords[j,2])^2)

 t <- abs(((point[1,1]-coords[j,1])*(coords[j+1,1]-coords[j,1])+
      (point[1,2]-coords[j,2])*(coords[j+1,2]-coords[j,2]))/
      ((coords[j+1,1]-coords[j,1])^2+(coords[j+1,2]-coords[j,2])^2))
 x <- coords[j,1]+t*(coords[j+1,1]-coords[j,1])
 y <- coords[j,2]+t*(coords[j+1,2]-coords[j,2])

 if(min(coords$x[j],coords$x[j+1]) <= x && x <= max(coords$x[j],coords$x[j+1]) &&
    min(coords$y[j],coords$y[j+1]) <= y && y <= max(coords$y[j],coords$y[j+1])){
  if(coords[j,] != c(x,y) && coords[j+1,] != c(x,y)){
   distance[2*j,1] <- d
   coordinates[2*j,] <- c(x,y)
  }
 }
}

最小距离的位置:

p <- which(distance==min(distance, na.rm=TRUE))
coordinates[p,]
 类似资料:
  • 圆心o = (0.3501, -0.0881, -4.8466) 圆的法向量n = (0.4163, -0.8326, -0.3653) 圆的半径r=1.34954 直线上两点: a=(3.1932, -0.9005, 0.8082) b=(1.9885, -0.9691, -0.8353) 求圆上一点p,离直线ab的距离最近时的座标 由于圆与直线不共面,垂足f到圆心o的连线到圆的投影不再是最短距

  • 问题内容: 我需要一种算法来找到地图上两点之间的最短路径,其中道路距离用数字表示。 提供的内容:开始城市A目的地城市Z 城市之间的距离清单: A-B:10 F-K:23 R-M:8 K-O:40 Z-P:18 J-K:25 D-B:11 M-A:8 P-R:15 我以为我可以使用Dijkstra的算法,但是它找到所有目的地的最短距离。不只是一个 任何建议表示赞赏。 问题答案: 就像Splinter

  • 这道题是 LeetCode 72 题。 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 动态规划 解决两个字符串的动态规划问题,一般都是用两个指针 i,j 分别指向两个字符串的最后,然后一步步往前走,缩小问题的规模。 定义状态:dp[i][j] 表示 s1、s2 长

  • 我有一些谷歌地图折线。我试图在它们周围画两条折线,这样它们就形成了某种边界: 所以对于原始折线的每一个点,我计算边界线点,从原点算起25米: 在这个例子中,让我们省略折线的第一个和最后一个点。所以我总是看上一个点和下一个点,计算中心点的偏移量。

  • 问题内容: 我正在使用Python + Numpy(也可以使用Scipy)并具有三个2D点 我试图获得从P3垂直到P1和P2之间绘制的直线的距离。设,和 用矢量符号表示这很容易,但是我对python / numpy还是相当陌生,无法获得任何有效的方法(甚至是关闭方法)。 任何提示表示赞赏,谢谢! 问题答案: 尝试使用以下 规范 函数

  • 我需要得到一条三次(2D)bezier曲线B(t)的点Q,其中从点Q到另一个给定点P的直线与bezier曲线垂直相交。 我知道:P,B(t) 我寻找:Q(基本上我想要g的斜率,但当我知道Q时,我可以很容易地计算出来,但g的斜率已经足够了) 注意,我认为这个ansatz是错误的。这只是为了完整性而包括的。 其中B(x)是笛卡尔坐标系下的bezier曲线,B'(x)是(笛卡尔坐标系下的)导数,k是与y