为了账号安全,请及时绑定邮箱和手机立即绑定

找到高度与基地相交的点(Python)

找到高度与基地相交的点(Python)

繁华开满天机 2021-12-09 10:22:11
仅给定锐角三角形顶点的坐标,我如何有效且快速地找到特定顶点的高度与相反底相交的点的坐标?仅使用数学、numpy 或 scipy 的解决方案将非常有用。
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

需要的点是顶点(比如顶点 C)到包含对边的直线(比如 AB)上的正交投影。

//img1.sycdn.imooc.com//61b1686d0001d0c702540194.jpg

要找到投影点,请获取 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)


查看完整回答
反对 回复 2021-12-09
?
慕侠2389804

TA贡献1719条经验 获得超6个赞

考虑顶点位于 A、B 和 C 点的三角形,您希望找到从顶点 C 延伸的高度与线 AB 相交的位置。


因此,首先,您可以确定直线 AB 的方程。您有 A 点和 B 点(Ax, Ay; 和Bx, By)。鉴于您可以将slope_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 ( Dx)的 X 值。对于 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,这将为零);但这是一个开始。


查看完整回答
反对 回复 2021-12-09
  • 2 回答
  • 0 关注
  • 208 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信