这个问题看起来很简单,但我的数学不太好,因此很有挑战性。在这一点上,我几乎得出了这样的结论,即可能没有解决方案,然而,我对数学所知甚少,似乎总是有一个解决方案适合你们这些更知情的人。
我在2D平面上有三个(x,y(度,它们形成了一个(几乎(直角三角形(即94或87度,这确实会变化,但总是在几度内(。顶点总是在正轴上;Q1";,(我正在处理像素数据(。
我需要的是找到360度三角形的方向:
- 对于所有四个象限,腿(opp&adj(总是相对于(假想的(x,y轴,因此斜边总是朝外
- 三角形:
- q i-90度
- q ii-180度
- q iii-270度
- q iv-0度
我已经尝试了这个论坛上的各种建议中的许多解决方案,目前我正在使用这个解决方案,但它并不完全适用于我。
https://stackoverflow.com/a/15442539/14398314
任何建议都将不胜感激,使用的语言是python。
编辑:下图表示输入数据和所需的解决方案。输入和输出数据的图像
干杯
步骤1:识别三角形靠近(几乎(直角的角
如果3个角是A、B、C,则构建点积AB*BC
、AC*CB
、AB*AC
。最低的点积是边接近直角的点积,点积中出现两次的角是接近直角的角。
第2步:现在你知道了几乎是直角的角(假设它是A(,计算AB和AC边在x和y方向上的位移(AB_DeltaX、AB_Delta y、AC_Delta x和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