给定象限i中的三个x,y点,它们组成一个直角三角形,求出三角形的排列

问题描述

这个问题似乎很直接,但是我的数学并不好,因此被证明具有挑战性。在这一点上,我几乎得出的结论是,可能没有解决方案,但是我对数学的一点了解似乎几乎总是为那些知识渊博的人提供的解决方案。

我在2D平面中有三个(x,y)实体,它们形成一个(几乎)直角三角形(即94或87度确实会变化,但是总是有几个度数)。顶点始终在正轴“ Q1”上(我正在处理像素数据)。

我需要找到360度的三角形方向:

  • 所有四个象限的腿(opp和adj)始终靠着(虚构)x,y轴,所以斜边总是朝外
  • 三角形:
    • 我-90度
    • q ii-180度
    • qiii-270度
    • q iv-0度

在此论坛上,我尝试了各种建议中的许多解决方案,但在目前正在使用该解决方案的地方,但是它并不完全对我有用。
https://stackoverflow.com/a/15442539/14398314

任何建议都将不胜感激,使用的语言是python。

编辑:下图表示输入数据和所需的解决方案。 Image of input and output data

欢呼

解决方法

步骤1:确定三角形(几乎)直角附近的角

如果三个角分别是A,B,C,则构建点积AB*BCAC*CBAB*AC。最低的点积是侧面近似为直角的点,而在点积中出现两次的角是近似直角的角。

步骤2:现在您知道了几乎是直角的角(假设它是A),为AB和AC侧计算x和y的位移(AB_DeltaX,AB_DeltaY,AC_DeltaX,AC_DeltaY),并保持在每一侧,只有绝对值最大的那一侧。 可以在此表中找到象限:

90 : deltaX and deltaY are both positive
180: deltaX < 0 and deltaY > 0
270: both negative
0  : deltaY <0,deltaX > 0

这是一个简单的实现:

a = (4.2,0.1)
b = (3.1,4.2)
c = (0.1,3.2)


def get_q(a,b,c):

    #step 1
    ab = (b[0] - a[0],b[1] - a[1])
    ac = (c[0] - a[0],c[1] - a[1])
    ba = (a[0] - b[0],a[1] - b[1])
    bc = (c[0] - b[0],c[1] - b[1])
    ca = (a[0] - c[0],a[1] - c[1])
    cb = (b[0] - c[0],b[1] - c[1])

    dp1 = abs(ab[0] * bc[0] + ab[1] * bc[1])
    dp2 = abs(ac[0] * cb[0] + ac[1] * cb[1])
    dp3 = abs(ab[0] * ac[0] + ab[1] * ac[1])

    # find minimum
    if dp1 < dp2 and dp1 < dp3:
        corner = 'B'
        delta1 = ba
        delta2 = bc
    elif dp2 < dp1 and dp2 < dp3:
        corner = 'C'
        delta1 = ca
        delta2 = cb
    elif dp3 < dp1 and dp3 < dp2:
        corner = 'A'
        delta1 = ab
        delta2 = ac
    else:
        corner = 'unknown'
        delta1 = (0.0,0.0)
        delta2 = (0.0,0.0)

    # Step 2
    if abs(delta1[0]) > abs(delta2[0]):
        deltaX = delta1[0]
    else:
        deltaX = delta2[0]

    if abs(delta1[1]) > abs(delta2[1]):
        deltaY = delta1[1]
    else:
        deltaY = delta2[1]

    if deltaX > 0 and deltaY > 0:
        quadrant = 'Q1'
    elif deltaX < 0 and deltaY < 0:
        quadrant = 'Q3'
    elif deltaX < 0 and deltaY > 0:
        quadrant = 'Q2'
    elif deltaX > 0 and deltaY < 0:
        quadrant = 'Q4'
    else:
        quadrant = 'unknown'

    return quadrant