通过使用{x,y}坐标而不是通过余弦定律

时间:2019-06-01 21:56:55

标签: python coordinates trigonometry

我正在解决此任务:

  

为您提供了三角形上每一边的长度。你需要   找到这个三角形的所有三个角度。如果给定的边长   无法形成三角形(或形成退化的三角形),那么您必须   返回所有角度为0(零)。

我已经通过使用余弦定律解决了这个问题,现在我正在尝试另一种方法。

想法如下:相对于第三边的两端,一次将两个边旋转一个角度,并将坐标和当前角度存储到单独的列表中。第三面用作第二面在 X 轴上的偏移。然后检查如下:两个列表的坐标是否相同?如果是,则可以从这些侧面构造三角形。

旋转动画:

  • 每次旋转10度进行演示
  • E 是路径的相交点,如果没有相交,则不可能有三角形。

enter image description here

生成的三角形:

enter image description here

我已经编写了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))

0 个答案:

没有答案