Нахождение угла в прямоугольном треугольнике с помощью Python 3

Нахождение угла в прямоугольном треугольнике с помощью Python 3

Мне удается решить этот вопрос только в 1 случае из 5 в системе. Я уверен, что мой метод верен, но в других случаях он почему-то не работает. Ниже мой код

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 .. Решаем ли этот вопрос?

Это не ваша непосредственная проблема, но посмотрите на while(AB>100 and AB<=0):. Я изо всех сил пытаюсь придумать число любой, которое больше 100 и меньше или равно нулю :-) То же самое и для BC.

paxdiablo 13.09.2018 02:45

Кроме того, если угол ABC равен 90 градусам, существует нет способ, которым AC может быть 1, а BC может быть 100. За исключением случая вырождения, когда AB равен нулю (который не является треугольником), AC, безусловно, должен быть больше, чем BC. Я подозреваю, что когда вы говорите AC, вы имеете в виду AB.

paxdiablo 13.09.2018 02:51

Вы пытались нарисовать другие треугольники, чтобы убедиться, что они действительно соединены ребрами ...

Any Moose 13.09.2018 02:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
3 330
3

Ответы 3

Я знаю, что это не совсем ваш случай, но все же может объяснить вашу проблему

Обратный синус значения больше единицы

Подумайте, как выглядит синусоида или кривая. Как углы изменение, синус угла идет вверх и вниз, но никогда не идет выше 1 или ниже -1. Другими словами, нет угла с синусом что больше 1.

Когда вы используете синусоидальную клавишу, вы вставляете угол и получаете синус этот угол. Например, когда вы грешите (30), вы обнаруживаете синус 30 градусов, а калькулятор говорит, что это 0,5. Когда вы используете обратный синус (сдвиг-синус) вы вставляете значение синуса и калькулятор подскажет угол. Итак, обратный синус 0,5 равен 30 поскольку угол 30 градусов имеет синус 0,5.

Поэтому, когда вы просите калькулятор вычислить обратный синус 1,732, вы спрашивают, какой угол имеет синус 1,732. Но как мы уже говорили выше, не существует угла с синусом больше 1. Обратный синус или arcsin 1,732 не существует. Так говорит калькулятор.

Похоже, ваша проблема заключается в том, чтобы попытаться найти угол B в треугольник с a = 40, b = 80 и A = 60 градусов. Попробуйте построить такой треугольник, и посмотрим, что получится. Делаем угол А и отмечаем 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

Значит, калькулятор верен: такого треугольника нет! Очевидно мы невозможно измерить угол B вверху, если сторона 'a' недостаточно длинна, чтобы завершите треугольник и сформируйте этот угол.

Вы ошиблись в геометрии - BM - это медиана, а не рост для AC (они случайно совпадают для равнобедренного прямоугольного треугольника, но отличаются в общем случае).

Таким образом, угол BMC в общем случае неправильный, и вы не можете получить sin(theta) как соотношение MC и BC.

Но есть хорошо известное свойство прямоугольного треугольника - центр описанной окружности лежит в середине гипотенузы, поэтому точка 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

В первую очередь, ваш угол выражается в радианах, а затем вы конвертируете его в градусы. Остальное все тогда встанет на свои места :)

Кроме того, мы можем видеть, что BM равно MC, основанному на свойстве медианы к гипотенузе, что делает треугольник MBC равнобедренным и, следовательно, Angle MBC = Angle 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

Другие вопросы по теме