gpt4 book ai didi

Python:点在最接近第三点的线上

转载 作者:行者123 更新时间:2023-12-01 02:27:57 25 4
gpt4 key购买 nike

我在两个 XY 点(p1 和 p2)和线外的第三个 XY 点(p3)之间有一条线/矢量。根据this post我知道如何获得该点到线的距离。但我实际上要寻找的是该线上的一个点(p4),该点与第三点(p3)的最小距离(d)。我发现this post ,但我觉得这不是正确的解决方案。也许 Numpy 或 Python 中包含一些东西?

distance of a point to a line including crossing point

根据@allo,我尝试了以下操作。您可以下载我的代码 Python fileJupyter Notebook (都是Python3)。

points = [[1, 1], [3, 1], [2.5, 2], [2.5, 1]]
import matplotlib.pyplot as plt
%matplotlib inline

fig, ax = plt.subplots()
fig.set_size_inches(6,6)

x, y = zip(*points[:2])
l1, = ax.plot(x,y, color='blue')
scatter1 = ax.scatter(x=x,y=y, color='blue', marker='x', s=80, alpha=1.0)

x, y = zip(*points[2:])
l2, = ax.plot(x,y, color='red')
scatter2 = ax.scatter(x=x,y=y, color='red', marker='x', s=80, alpha=1.0)

p1 = Vector2D(*points[0])
p2 = Vector2D(*points[1])
p3 = Vector2D(*points[2])

p1p2 = p2.sub_vector(p1)
p1p3 = p3.sub_vector(p1)

angle_p1p2_p1p3 = p1p2.get_angle_radians(p1p3)
length_p1p3 = p1p3.get_length()
length_p1p2 = p1p2.get_length()

p4 = p1.add_vector(p1p2.multiply(p1p3.get_length()/p1p2.get_length()).multiply(math.cos(p1p2.get_angle_radians(p1p3))))

#p4 = p1 + p1p2 * length(p1p3)/length(p1p2)*cos(angle(p1p2, p1p3))

p4 = p1.add_vector(p1p2.multiply(length_p1p3/length_p1p2*math.cos(angle_p1p2_p1p3)))
p4

结果是 p4 = (1.8062257748298551, 1.0) 但显然应该是 (2.5, 1.0)

point p4 to line p1p2

最佳答案

解析几何

让我们从指定的线开始,我们根据其上的两个点来定义线 (x1, y1)(x2, y2) .

dx = x2-x1dy = y2-y1我们可以正式地将线上的每个点写为 (x12, y12) = (x1, y1) + a*(dx, dy)哪里a是一个实数。

使用类似的符号表示 (x3, y3) 线上的一个点与指定的垂直的是 (x34, y34) = (x3, y3) + b*(-dy, +dx) .

为了找到交集,我们必须施加 (x12, y12) = (x34, y34)或者 (x1, y1) + a*(dx, dy) = (x3, y3) + b*(-dy, +dx) .

分别写出 x 的方程和y

y1 + a dy - y3 - b dx = 0
x1 + a dx + b dy - x3 = 0

它是a中的线性系统和b其解决方案是

a = (dy y3 - dy y1 + dx x3 - dx x1) / (dy^2 + dx^2)
b = (dy x3 - dy x1 - dx y3 + dx y1) / (dy^2 + dx^2)

距离(x3, y3)最近的点的坐标躺在线上是(x1+a*dx, y1+a*dy) — 您只需要计算系数 a .

从数值上来说,线性系统的行列式是 dx**2+dy**2因此,只有当两个初始点相对于第三点的距离非常接近时,才会出现问题。

Python 实现

我们使用 2-uple float 来表示 2D 点,并定义一个函数,其参数为 3 个 2-uple,表示定义线 ( p1, p2 ) 的点和确定点 ( p3 ) p4的位置在所说的线上。

In [16]: def p4(p1, p2, p3):
...: x1, y1 = p1
...: x2, y2 = p2
...: x3, y3 = p3
...: dx, dy = x2-x1, y2-y1
...: det = dx*dx + dy*dy
...: a = (dy*(y3-y1)+dx*(x3-x1))/det
...: return x1+a*dx, y1+a*dy

为了测试实现,我使用了OP使用的三个点来展示他们对这个问题的看法:

In [17]: p4((1.0, 1.0), (3.0, 1.0), (2.5, 2))
Out[17]: (2.5, 1.0)

看来p4(...)的结果与OP的预期一致。

<小时/>

Matplotlib 示例

enter image description here

import matplotlib.pyplot as plt

def p(p1, p2, p3):
(x1, y1), (x2, y2), (x3, y3) = p1, p2, p3
dx, dy = x2-x1, y2-y1
det = dx*dx + dy*dy
a = (dy*(y3-y1)+dx*(x3-x1))/det
return x1+a*dx, y1+a*dy

p1, p2, p3 = (2, 4), (7, 3), (1, 1)
p4 = p(p1, p2, p3)

fig, ax = plt.subplots()

# if we are after right angles, anything else would be wrong
ax.set_aspect(1)

plt.plot(*zip(p1, p2, p4, p3), marker='*')

关于Python:点在最接近第三点的线上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47177493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com