Рассмотрим прямоугольный треугольник, который обладает свойствами
- Гипотенуза (сторона)
- Смежный (боковой)
- Противоположность (сторона)
- Область
Учитывая любые 2 из этих свойств, всегда можно вычислить значение другого 2. Мой вопрос касается того, каков наиболее эффективный / элегантный способ сделать это.
В настоящее время единственный способ сделать это, о котором я могу подумать, - это использовать (4C2) * 2 = 12 операторов case, каждое из которых относится к возможной комбинации входных данных, которые могут быть предоставлены.
Например, используя python, вы можете получить что-то вроде
class RightAngleTriangle():
def __init__(this, propertyType1, propertyValue1, propertyType2, propertyValue2):
this.adjacent = 0
this.opposite = 0
this.hypotenuse = 0
this.area = 0
if (propertyType1 == "adjacent" and propertyType2 == "opposite"):
this.adjacent = propertyValue1
this.opposite = propertyValue2
this.hypotenuse = (propertyValue1**2 + propertyValue2**2)**0.5
this.area = (propertyValue1 * propertyValue2)/2
elif (propertyType1 == "opposite" and propertyType2 == "adjacent"):
this.adjacent = propertyValue2
this.opposite = propertyValue1
this.hypotenuse = (propertyValue1**2 + propertyValue2**2)**0.5
this.area = (propertyValue1 * propertyValue2)/2
elif (propertyType1 == "adjacent" and propertyType2 == "hypotenuse"):
this.adjacent = propertyValue1
this.hypotenuse = propertyValue2
this.opposite = (propertyValue2**2 + propertyValue1**2)**0.5
this.area = (this.opposite * this.adjacent)/2
... и так далее ...
Затем вы можете создать свой треугольный объект и распечатать его четыре свойства, используя код (в данном случае python), как показано ниже.
t1 = RightAngleTriangle("adjacent", 10, "opposite", 12)
print(t1.adjacent)
print(t1.opposite)
print(t1.hypotenuse)
print(t1.area)
Это отвратительно. Есть ли более подходящее решение этой проблемы?