@no-pasaran

Посчитать многоугольник почему не работает програма?

Не ругайте сильно я новичёк в этом языке. Наскорую накидал програму чтобы проверить является ли набор векторов многоугольником
Поправьте теги если что-то нетак простити

def is_sum_zero_vector(vectors):
    vector_length = len(vectors[0])
    zero_vector = [0] * vector_length

    vector_sum = [sum(values) for values in zip(*vectors)]

    return vector_sum == zero_vector


Что думаете?
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 2
hint000
@hint000
у админа три руки
Например: [(10, 0), (0, 10), (-10, 0), (0, -10)]
Учтите, что код, правильно работающий с целыми числами, будет давать сбои на вещественных числах из-за ошибок округления. Т.е. вы можете получать очень-очень маленькую длинну суммарного вектора (без округления был бы чистый ноль, но компьютер не работает с вещественными числами без округления), из-за этого условие vector_sum == zero_vector не выполнится.
Ответ написан
Комментировать
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Из отрезков заданной длины можно составить многоугольник тогда и только тогда, когда максимальный строго меньше суммы всех остальных. Или, тоже самое: максимальный строго меньше половины суммы всех.

Код проверки будет примерно такой:
def can_construct_polygon(lengths):
  return len(lengths)>0 and max(lengths) < sum(lengths)/2


В списке lengths надо передать длины всех отрезков. Если у вас там вектора на плоскости заданы в vectors, то через map подсчитайте их длины сначала.

Edit:

Раз поворачивать вектора-отрезки нельзя, то действительно, составить многоугольник можно, если по-координатная сумма векторов дает (0, 0).

Все еще остается вопрос, а допускаются ли вырожденные мноугольники? Например, можно ли составить такой из веторов (1,0), (-1,0). Если допускаются, то проверять длины не надо. Если нет, то все еще надо, как я выше указал, сравнить максимальную длину с суммой всех длин.

Еще есть вопрос, а можно ли вектора переставлять. Если нельзя, то можно ли допускать самопересечение многоугольника? Надо ли самопересечениие проверять? Но я думаю, что в задаче это игнорируется и можно стороны переставлять. Тогда можно их отсортировать по углу и получить выпуклый многоугольник без самопересечений. Иначе задача становится весьма сложной геометрической задачкой, где надо проверять пересечение отрезков.

Ваш код вроде бы правильно проверяет на сумму векторов покомпонентно. Попробуйте добавить еще и проверку длин.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы