@Elbro

Как сигнализировать когда объект выходит за границы?

Такой вопрос: есть подвижный объект, который не может выходить за границы. Как сделать так, чтобы условный кружок находясь в квадрате ничего не говорил, а как только вышел- было какое-то событие?

Есть некоторые примеры с коллизией на С++, но это не совсем то. Интересует именно если кружок коснется внутренних стенок квадрата
  • Вопрос задан
  • 148 просмотров
Решения вопроса 2
Vindicar
@Vindicar
RTFM!
Вопрос и впрямь не по питону, алгоритм легко портируется.
Если нужно детектить именно пересечение любой из точек границы, и именно для круга и квадрата, то это очень просто. Уменьши квадрат, сдвинь каждую сторону внутрь на радиус круга.
Например, у тебя был квадрат от (0;0) до (100;100), круг радиусом 10 (диаметром 20). Новый квадрат будет от (10;10) до (90;90).
После этого проверяй, входит ли центр круга внутрь нового квадрата. Если входит - круг внутри исходного квадрата. Если центр на стороне - круг касается стороны исходного квадрата. Если центр вне нового квадрата - круг вышел за границу исходного.
Проверка вхождения точки внутрь ортогонального (стороны параллельны осям координат) прямоугольника выполняется тривиально, сам догадаешься как.

Есть второй способ, базируется на массивах numpy (python-opencv их использует для хранения массивов пикселей изображения).
Делаешь два изображения-маски (одноканальных, одного размера), одно для одного объекта, другое для другого. В твоём случае одно (A) будет содержать белый круг на чёрном фоне, а другое (B) - чёрный квадрат на белом фоне.
Тогда можно будет сделать так:
intersection = numpy.logical_and(A, B)
if intersection.any():
    print('Collision!')

logical_and() вернёт логический массив того же размера, что A и B. Элемент массива будет истиннен только если соотвествующие элементы в A и B будут ненулевыми.
Таким образом, если два объекта пересекаются, то logical_and() вернёт True для пересёкшихся пикселей.
А метод any() вернёт True если любой элемент массива истинен, т.е. если есть хоть один пересёкшийся пиксель.

Этот метод куда более ресурсоёмкий, чем то что я описал в выше,но зато работает для объектов произвольной формы. Только нарисуй их.
Кроме того, можно сделать numpy.count_nonzero(intersection), чтобы узнать, насколько велико пересечение (сколько пикселей в нём). Это тоже может быть полезно если ты хочешь "прощать" небольшие пересечения.
Ответ написан
@NIKROTOS
Начинающий программист.
Ты подразумеваешь, что кружок выходит за границы квадрата, когда одна из его точек за пределами этого квадрата? Или когда его центр за пределами квадрата? Или когда все его точки за пределами квадрата?

"Есть вершины квадрата: (x1,y1), (x2,y2), (x3,y3), (x4,y4). Для определенности и не ограничивая общности допустим, что вершины перечисляются от левой верхней по часовой стрелке. Точка имеет координаты (x0,y0) и попадает в квадрат, если истинно условие:
(x0>x1 И y0>y1 И x0 Вот так, кажется..."
источник(https://forum.na-svyazi.ru/?showtopic=212014)

В зависимости от того, что тебе требуется, нужно проверять данное условие, либо для центра, либо для нескольких точек на границы круга.
Возможно есть специальные формулы для определения пересечения геометрических фигур на плоскости, но я их не знаю, советую сменить тег на соответствующий(геометрия или что-то подобное). По сути, вопрос не по питону.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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