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

Python 给定(象限i)中构成直角三角形的三个(x,y)点,求三角形的方位,python,math,geometry,linear-algebra,trigonometry,Python,Math,Geometry,Linear Algebra,Trigonometry,这个问题看起来很简单,但我的数学不是很好,因此很有挑战性。在这一点上,我几乎得出了一个结论,可能没有一个解决方案,然而,我对数学所知甚少,几乎总是有一个解决方案适合你们中那些更了解情况的人 我在二维平面上有三个(x,y)真值,它们形成一个(几乎)直角三角形(即94度或87度,这确实不同,但总是在几度内变化)。顶点始终位于正轴“Q1”(我正在处理像素数据) 我需要的是找到三角形360度的方向: 对于所有四个象限,腿(opp&adj)总是与(想象的)x,y轴相对,所以斜边总是朝外 三角形在: q

这个问题看起来很简单,但我的数学不是很好,因此很有挑战性。在这一点上,我几乎得出了一个结论,可能没有一个解决方案,然而,我对数学所知甚少,几乎总是有一个解决方案适合你们中那些更了解情况的人

我在二维平面上有三个(x,y)真值,它们形成一个(几乎)直角三角形(即94度或87度,这确实不同,但总是在几度内变化)。顶点始终位于正轴“Q1”(我正在处理像素数据)

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

  • 对于所有四个象限,腿(opp&adj)总是与(想象的)x,y轴相对,所以斜边总是朝外
  • 三角形在:
    • q i-90度
    • q ii-180度
    • q iii-270度
    • q iv-0度
我在这个论坛上尝试了各种建议中的许多解决方案,目前我正在使用这个解决方案,但是它并不完全适合我。

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

编辑:下图表示输入数据和所需的解决方案。


干杯

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

如果三个角是A、B、C,则构建点积
AB*BC
AC*CB
AB*AC
。最低的点积是边接近直角的点积,在点积中出现两次的角是接近直角的角

步骤2:现在你知道了几乎是直角的角(假设它是A),计算AB和AC边在x和y上的位移(AB_DeltaX,AB_DeltaX,AC_DeltaX,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
90:deltaX和deltaY都是正数
180:deltaX<0和deltaY>0
270:都是负数
0:deltaY 0
下面是一个简单的实现:

a=(4.2,0.1)
b=(3.1,4.2)
c=(0.1,3.2)
def get_q(a、b、c):
#第一步
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])
#求最小值
如果dp1abs(delta2[0]):
deltaX=delta1[0]
其他:
deltaX=delta2[0]
如果abs(delta1[1])>abs(delta2[1]):
deltaY=delta1[1]
其他:
deltaY=delta2[1]
如果deltaX>0且deltaY>0:
象限='Q1'
elif deltaX<0和deltaY<0:
象限='Q3'
elif deltaX<0且deltaY>0:
象限='Q2'
elif deltaX>0且deltaY<0:
象限='Q4'
其他:
象限='未知'
返回象限

请解释您所说的“腿(opp&adj)在所有四个象限中始终与(想象的)x,y轴相对”的意思。这不意味着其中一个顶点就是原点吗?当三角形的所有顶点都在Q1中时,它怎么可能在Q2或Q3中?你能举一个三个顶点和预期输出的例子吗?@trentcl谢谢你的回答和耐心,我添加了一个图片试图解决你的问题。直角表示原点,三角形不在Q2、Q3或Q4,它的方向需要表示~0、90、180、270角。谢谢,这太棒了!!并可作为解决方案。然而,在查看您的解决方案时,我意识到我可以用不同的措辞来回答我的问题(一个新犯的错误),您如何用这个等式来表示0-360度之间的三角形方向?i、 e.98或87度,5或350度等等。@thinlizy 1)如果这回答了你原来的问题,请接受答案2)如果你有新问题,你应该问一个新问题3)在你问新问题之前,你应该准确而明确地定义方向——如果问题没有明确说明,你就无法设计出解决问题的算法。谢谢你的建议,我们将努力更好地定义问题,你的贡献已经回答了这个问题。