使用python 3在直角三角形中找到角度

时间:2018-09-13 00:40:35

标签: python-3.x math

Question

我设法解决了系统中5个案例中只有1个的问题。我可以肯定我的方法是正确的,但是由于某些原因,在其他情况下无法解决问题。 下面是我的代码

import math 
AB = int(input("Enter a value for side AB: "))
while(AB>100 and AB<=0):
     AB = input("Enter a value for side AB: ")   
BC = int(input("Enter a value for side BC: "))
while(BC>100 and BC<=0):
     BC = input("Enter a value for side BC: ")
hyp = math.sqrt(math.pow(AB,2) + math.pow(BC,2)) #find side AC
mhyp = hyp/2                                     #find side MC
sind = (mhyp/BC)                                 #sin(deg)=opp/hypotenuse
degree = round(((math.asin(sind))/((math.pi)*2))*360,0) #find the angle
print("%d" %(degree) + "°")

对于AC和BC为10的情况,确实产生了45度角。但是,当AC = 1且BC = 100时,由于反正弦不能接受超过1.7弧度的值,因此会产生错误。对于AC = 20和BC = 10以及AC = 100和BC = 1,情况相同。 这个问题可以解决吗?

3 个答案:

答案 0 :(得分:0)

我知道这不完全是您的情况,但仍然可以解释您的问题

Inverse Sine of a Value Greater than One

考虑正弦波或曲线的外观。作为角度 改变,角度的正弦向上和向下,但永远不会 大于1或小于-1。换句话说,正弦没有角度 大于1。

使用正弦键时,您将角度倾斜并找出正弦 那个角度。例如,当您犯罪(30)时,您会发现 正弦为30度,计算器表示为0.5。当您使用 反正弦(shift-sine)您输入正弦值和 计算器会告诉您角度。所以0.5的反正弦是30 因为30度角的正弦值为0.5。

因此,当您要求计算器做1.732的反正弦时, 问它哪个角度的正弦值为1.732。但是正如我们上面所说, 不存在正弦大于1的角度。反正弦或 不存在1.732的反正弦。那就是计算器的意思。

听起来您的问题是要您尝试在a中找到角度B a = 40,b = 80和A = 60度的三角形。尝试构建 这样的三角形,看看会发生什么。我们将角度A标记为80 b边的其中一条光线的单位,然后围绕 结果点C的半径或长度为40,因此其 与另一条射线相交会得到点B。会发生什么?

                B
              /
             /
            /
           /
          /
     c   /                    ooooooooo
        /                 oooo         oooo
       /               ooo \               ooo
      /              oo     \
     /              o        \ a=40
    /              o          \
   /              o            \
  /               o             \
 /60             o               \
A----------------o----------------C-----------
                 b=80

所以计算器是正确的:没有这样的三角形!显然我们 如果边“ a”的长度不足以测量顶部B的角度 完成三角形并形成该角度。

答案 1 :(得分:0)

主要是您的角度以弧度为单位,然后将其转换为度。休息一切,然后就可以了:)

此外,我们可以看到BM等于MC,即中点到斜边的属性,使得三角形MBC为等腰,因此,角度MBC =角度MCB。

import math 
if __name__ == '__main__':
    AB = input()
    assert 0<int(AB)<=100
    BC = input()
    assert 0<int(BC)<=100
    assert (int(AB) >= 0 and float(AB).is_integer() == True) and (int(BC) >= 0 and float(BC).is_integer() == True)
    AC = math.sqrt((int(AB)**2) + (int(BC)**2))
    tan_acb_rad = int(AB)/int(BC)
    acb_rad = math.atan(tan_acb_rad) #the angle comes in radians
    acb_deg = math.degrees(acb_rad) #you have to convert it into degrees
    ang_mbc = acb_deg
    print(str(int(round(ang_mbc,0)))+u"\N{DEGREE SIGN}") #adding the degree symbol at end

答案 2 :(得分:-1)

您在几何图形上犯了错误-BM中位数,而不是AC高度(它们偶然地重合了等距的直角三角形) ,但一般情况下有所不同)。

因此,角度BMC通常是不正确的,您无法以sin(theta)MC的比率得到BC

但是直角三角形有一个众所周知的属性-center of circumcircle位于斜边的中间,因此在这种情况下M的点是外接心。
这个事实立即告诉我们BM=MC(两个半径),BMC三角形是等腰而theta = ACB angle

解决方案非常简单(请注意使用atan

import math
AB = 1
BC = 1
theta = math.atan(AB / BC)
degrees = round(theta * 180 / math.pi)
print(degrees)

>> 45

AB = 3
BC = 4
...
>> 37