Есть массив треугольников, заданных координатами вершин. Как определить номера треугольников, подобных первому? Здравствуйте!
Есть массив треугольников, заданных координатами вершин. Нужно определить номера треугольников, подобных первому. Что я делаю.
1. Нам понадобится формула расстояния между точками: def length(a, b):
return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2)
2. Для определения подобных треугольников я буду пользоваться тем фактом, что отношение периметров таких треугольников равно коэф. подобия, а отношение площадей - квадрату того же числа. Соответственно мне нужно найти их для каждого из треугольников. Вот так:triangles = []
for i in v:
a = length(i[0], i[1])
b = length(i[0], i[2])
c = length(i[1], i[2])
triangle = []
p = (a + b + c)/2
area = math.sqrt(p * (p - a) * (p - b) * (p - c))
triangle.append(p*2)
triangle.append(area)
triangles.append(triangle)
3. Теперь функция, которая будет определять подобные треугольники:def is_sim(sample, triangle):
if int(sample[0]/triangle[0])**2 == int(sample[1]/triangle[1]):
return True
else:
return False
4. И этой функцией побежали по списку треугольниковfor i in range(0, len(triangles) - 1):
if is_sim(triangles[0], triangles[i]):
print str(i+1)
Есть компетентный человек, который утверждает, что результат работы неверен. Но категорически отказывается даже заглядывать в код.
В чем моя ошибка?

21 Авг 2019 в 06:14
156 +1
0
Ответы
1

В вашем коде есть некоторые ошибки. Одна из них в функции is_sim, где вы используете оператор ** для возведения в степень, но не учитываете то, что результат может быть дробным. Вместо этого вам нужно использовать оператор // для целочисленного деления.

Вот исправленный код для функции is_sim:

def is_sim(sample, triangle):
if (sample[0] // triangle[0])**2 == (sample[1] // triangle[1]):
return True
else:
return False

Также обратите внимание, что при вызове функции is_sim вы передаете triangles[0] в качестве образца для сравнения с остальными треугольниками, но это не обязательно первый треугольник в массиве triangles. Вам нужно сравнивать все треугольники с первым треугольником, заданным в вашем исходном массиве v.

Исправьте это в вашем коде, и у вас должна получиться правильная логика определения номеров треугольников, подобных первому.

20 Апр 2024 в 13:21
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир