Мне удается решить этот вопрос только в 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 .. Решаем ли этот вопрос?
Кроме того, если угол ABC равен 90 градусам, существует нет способ, которым AC
может быть 1, а BC
может быть 100. За исключением случая вырождения, когда AB
равен нулю (который не является треугольником), AC
, безусловно, должен быть больше, чем BC
. Я подозреваю, что когда вы говорите AC
, вы имеете в виду AB
.
Вы пытались нарисовать другие треугольники, чтобы убедиться, что они действительно соединены ребрами ...
Я знаю, что это не совсем ваш случай, но все же может объяснить вашу проблему
Обратный синус значения больше единицы
Подумайте, как выглядит синусоида или кривая. Как углы изменение, синус угла идет вверх и вниз, но никогда не идет выше 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
Это не ваша непосредственная проблема, но посмотрите на
while(AB>100 and AB<=0):
. Я изо всех сил пытаюсь придумать число любой, которое больше 100 и меньше или равно нулю :-) То же самое и дляBC
.