我正在解决此任务:
为您提供了三角形上每一边的长度。你需要 找到这个三角形的所有三个角度。如果给定的边长 无法形成三角形(或形成退化的三角形),那么您必须 返回所有角度为0(零)。
我已经通过使用余弦定律解决了这个问题,现在我正在尝试另一种方法。
想法如下:相对于第三边的两端,一次将两个边旋转一个角度,并将坐标和当前角度存储到单独的列表中。第三面用作第二面在 X 轴上的偏移。然后检查如下:两个列表的坐标是否相同?如果是,则可以从这些侧面构造三角形。
旋转动画:
生成的三角形:
我已经编写了Python解决方案,但无法正常工作。问题是:双方的坐标都不匹配,需要近似值。
例如:将面 b 旋转到90°,坐标为(0.0,4.0),将面 c 旋转到127°,坐标为(-0.009,3.993),所以我需要使用近似值比较这些坐标。在这种情况下,0.01
就足够了。但是另一种情况可能需要0.1
或更多,例如a = 11, b = 20, c = 30
。我试图相对于侧面尺寸调整近似值,但是没有运气。
如何计算更准确的坐标,为什么我的解决方案无法按预期工作?
Python解决方案:
#!/usr/bin/python3
from typing import List
from math import sin, cos, radians
def checkio(a: int, b: int, c: int) -> List[int]:
def coords(side, side_offset):
coord_list = []
for degree in range(0,181):
x = cos(radians(degree)) * side + side_offset
y = sin(radians(degree)) * side
coord_list.append((degree, x, y))
return coord_list
# make two lists with coordinates and degree, by rotating side "b" and side "c"
b_coord_list = coords(b, 0)
# the side "a" is used just as an offset
c_coord_list = coords(c, a)
for b_deg, b_x, b_y in b_coord_list:
for c_deg, c_x, c_y in c_coord_list:
# Approximate comparing
if abs(b_x - c_x) <= 0.01 and abs(b_y - c_y) <= 0.01:
l_angles = [b_deg, c_deg - b_deg, 180 - c_deg]
l_angles.sort()
# if all sides have angle, in other words if the triangle is possible
if all(l_angles):
return sorted(l_angles)
return [0, 0, 0]
### For testing:
#Good triangles
print(checkio(4, 4, 4))
print(checkio(3, 4, 5))
print(checkio(5, 4, 3))
print(checkio(11,20,30))
#Bad triangle
print(checkio(10, 20, 30))