Как найти пересечение треугольника и прямоугольника по координатам?

Такое решение не всегда дает правильный ответ

# Площадь пересечения треугольника и прямоугольника
def segments_sect(s1, s2): # Длинна пересечения двух отрезков на одной прямой
    a = max(s1[0], s2[0])
    b = min(s1[1], s2[1])
    
    if a < b:
        return b-a
    return 0

def sect(t, r):
    tx_mn, ty_mn = min(t[::2]), min(t[1::2])
    tx_mx, ty_mx = max(t[::2]), max(t[1::2])
    dx = segments_sect([tx_mn, tx_mx], [r[0], r[2]])
    dy = segments_sect([ty_mn, ty_mx], [r[1], r[3]])
    
    return dx, dy

# Координаты
tr = [3,5,6,4,3,4]  # Треугольник
rc = [0,0,4,3] # Прямоугольник - координаты нижнего левого угла и верхнего правого угла

print(sect(tr, rc))
# Если фигуры пересекаются то должно быть dx>0 and dy>0

Ответы (1 шт):

Автор решения: MBo

Если задача состоит в установлении факта пересечения треугольника и прямоугольника, то можно выполнить следующие проверки:

пересекает ли первая сторона треугольника прямоугольник?
пересекает ли вторая сторона треугольника прямоугольник?
пересекает ли третья сторона треугольника прямоугольник?
находится ли первая вершина треугольника внутри прямоугольника?
находится ли первая вершина прямоугольника внутри треугольника?

Если какое-либо из условий выполняется, можно остановить проверки, вернув true

Первые три проверки можно выполнить с помощью алгоритма Коэна — Сазерленда или Лианга — Барски
Следующая элементарная
Последнюю можно сделать с использованием знаков векторных произведений

→ Ссылка