给定(象限 i)中构成直角三角形的三个(x,y)点,求三角形方向

Given three (x,y) points in (quadrant i) that make a right angle triangle, find triangle oriantation

这个问题似乎很简单,但是我的数学不是很好,因此证明具有挑战性。在这一点上,我几乎得出结论,可能没有解决方案,但是我对数学的了解几乎总是对那些更了解情况的人来说似乎总是一个解决方案。

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

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

我已经从这个论坛和其他地方的各种建议中尝试了很多解决方案,目前我正在使用这个解决方案,但它并不完全适合我。

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

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

干杯

第 1 步:确定接近(几乎)直角的三角形角

如果 3 个角是 A、B、C,则构建 dot-product AB*BCAC*CBAB*AC。最低的点积是边接近直角的那个,点积中出现两次的角就是接近直角的角。

第 2 步:现在您知道几乎是直角的角(假设它是 A),计算边 AB 和 AC 在 x 和 y 方向的位移(AB_DeltaX,AB_DeltaY, AC_DeltaX, AC_DeltaY) 并为每一侧保留绝对值最大的一侧。 象限可以这样找到 table:

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