Нахождение треугольника прямоугольного или нет

Эта функция, основанная на Python 3, возвращает значение, если треугольник имеет или не является прямоугольным с заданными длинами сторон x, y и z. У меня проблема с упрощением условного выражения. Должна ли эта функция проверять острый, правый, тупой, разносторонний, равнобедренный и равносторонний углы или есть условия, которые я могу пропустить? Любые отзывы приветствуются.

def right_angled(x, y, z):
    """This function returns if a triangle is or isn't
    right-angled given side lengths x, y, and z."""
    p = x + y + z #triangle perimeter
    a_sym = p / 180 #triangle perimeter divided by 180 
    one = x * a_sym #angle one
    two = y * a_sym #angle two
    three = z * a_sym #angle three
    if one and two or one and three or two and three == 90:
        return "The triangle is right-angled."
    elif one and two and three == 180:
        return "The triangle is right-angled." #next conditional(s)?
    else:
        return "The triangle is not right-angled."

print(right_angled(4, 5, 6))

Всего 2 ответа


Ваша функция полностью неверна.

Вы не можете найти угол как отношение стороны и периметра.

Выражение, if one and two не вычисляют сумму - and здесь есть логический (логический) оператор.

Чтобы определить, является ли прямоугольник правильным, вы можете использовать теорему Пифагора

def right_angled(a, b, c):
    if (a*a+b*b==c*c) or (c*c+b*b==a*a) or (a*a+c*c==b*b) :
        return "The triangle is right-angled." 
    else:
        return "The triangle is not right-angled."

Или просто вернуть логический результат

return (a*a+b*b==c*c) or (c*c+b*b==a*a) or (a*a+c*c==b*b)

Я предлагаю использовать теорему Пифагора для достижения этой цели ( a^2+b^2=c^2 ), протестировав 3 комбинации длин сторон. Чтобы компенсировать неточность с плавающей запятой, сравните в диапазоне:

def right_angled(a, b, c, e):
    return abs(a*a+b*b-c*c)<e or abs(b*b+c*c-a*a)<e or abs(c*c+a*a-b*b)<e

Однако диапазон зависит от масштаба длин сторон, то есть маленькие треугольники проходят испытание легче, чем большие треугольники. Например, любой треугольник с длиной стороны ~0.01 пройдет тест, если e=0.01 . По этой причине безопаснее (но дороже) нормализовать длину сторон, используя формулу (a^2+b^2)/c^2=1

def right_angled(a, b, c, e):
    return c>0 and abs(1-(a*a+b*b)/(c*c))<e or 
           a>0 and abs(1-(b*b+c*c)/(a*a))<e or 
           b>0 and abs(1-(c*c+a*a)/(b*b))<e

Есть идеи?

10000