查找海拔与基准相交的点(Python)

时间:2019-03-18 21:49:21

标签: python geometry

仅给出一个锐角三角形顶点的坐标,我如何才能有效而快速地找到某个特定顶点的高度与相反的底点相交的点的坐标?

仅使用数学,numpy或scipy的解决方案将非常有用。

2 个答案:

答案 0 :(得分:1)

考虑在点A,B和C具有顶点的三角形,您希望找到从顶点C延伸的高度与线AB相交的地方。

因此,首先,您可以确定AB行的方程式。您有点A和B(Ax, Ay;和Bx, By)。假设您可以将lope_AB计算为(By-Ay)/(Bx-Ax)

现在,行的格式为Y = MX+B,其中M为刚刚计算的斜率,B为Y截距,因此:Y_intercept_AB = Ay - slope_AB * Ax。因此,AB的等式为Y = slope_AB*X + Y_intercept_AB

好的,所以现在,从C到与直线AB相交的高度的斜率(我们称该点D为高度线CD)是AB斜率的负倒数;所以slope_CD = -(1/slope_AB)

因此,现在,假设您在CD线上有一个点(C)及其斜率,则可以像对AB一样获得CD的等式。首先,找到其Y轴截距:Y_intercept_CD = Cy - slope_CD * Cx

因此CD的等式为Y = slope_CD * X + Y_intercept_CD

所以现在您有了AB行和CD行的方程式:

Y = slope_AB * X + Y_intercept_AB
Y = slope_CD * X + Y_intercept_CD

您的问题被简化为找到这些线相交的位置,即D点。

根据上述等式,由于两个右侧都等于Y,因此我们可以将它们彼此设置为相等:

slope_AB * X + Y_intercept_AB = slope_CD * X + Y_intercept_CD

现在这只是解决X的问题。

slope_AB * X - slope_CD*X = Y_intercept_CD - Y_intercept_AB 
(slope_AB - slope_CD)*X = Y_intercept_CD - Y_intercept_AB
X = (Y_intercept_CD - Y_intercept_AB)/(slope_AB - slope_CD)

这将为您提供D的X值(Dx)。对于Y值,请使用任一线性方程式。让我们将其用于AB:

Dy = slope_AB * Dx + Y_intercept_AB

将它们放在一起,假设一个A=(-4, 2)B=(0, 6)C=(6, -4)的三角形:

#Points A, B,C:
Ax = -4; Ay = 2
Bx =  0; By = 6
Cx =  6; Cy = -4

#Line AB:
slope_AB = (By - Ay)/(Bx - Ax)
Y_intercept_AB = Ay - slope_AB*Ax
print("AB: slope: %s, intercept: %s" % (slope_AB, Y_intercept_AB))

#Line CD:
slope_CD = -(1/slope_AB)
Y_intercept_CD = Cy - slope_CD*Cx
print("CD: slope: %s, intercept: %s" % (slope_CD, Y_intercept_CD))

#Find the intersection of the two lines AB & CD:
Dx = (Y_intercept_CD - Y_intercept_AB)/(slope_AB - slope_CD)
Dy = slope_AB*Dx + Y_intercept_AB
print("Intersection at (%s, %s)" % (Dx, Dy))

打印:

AB: slope: 1.0, intercept: 6.0
CD: slope: -1.0, intercept: 2.0
Intersection at (-2.0, 4.0)

另一件事:这将被零除并在点A和B具有相同X值的地方失败(因为它被Ax-Bx除以零);但这是一个开始。

答案 1 :(得分:1)

需要的点是顶点(例如顶点C)在包含相反面(例如AB)的线上的正交投影。

enter image description here

要找到投影点,请获取AB和AC的向量

 AB = (B - A)    //in coordinates ab.x = b.x-a.x, ab.y = b.y-a.y
 AC = (C - A)

并使用AB和AC的标量积查找参数

t =(AB * AC) / (AB * AB) 
t =((b.x-a.x)*(c.x-a.x) + (b.y-a.y)*(c.y-a.y)) / ((b.x-a.x)*(b.x-a.x) + (b.y-a.y)*(b.y-a.y))

投影点坐标

 P = A + AB * t
 p.x = a.x + (b.x-a.x) * t
 p.y = a.y + (b.y-a.y) * t

仅此而已

def orthoProjection(ax, ay, bx, by, cx, cy):
    abx = bx - ax
    aby = by - ay
    acx = cx - ax
    acy = cy - ay
    t = (abx * acx + aby * acy) / (abx * abx + aby * aby)
    px = ax + t * abx
    py = ay + t * aby
    return px, py

print(orthoProjection(0, 0, 4, 4, -1, 5))
>>(2.0, 2.0)