Первоначальный плакат хотел определить пересечение отрезка и многоугольника. Не было необходимости НАЙТИ пересечение, если оно есть. Если вы это и имели в виду, вы можете выполнять меньше работы, чем Лян-Барский или Коэн-Сазерленд:
Пусть конечными точками сегмента являются p1 = (x1 y1) и p2 = (x2 y2).
Пусть углы прямоугольника будут (xBL yBL) и (xTR yTR).
Тогда все, что вам нужно сделать, это
A. Проверьте, все ли четыре угла прямоугольника находятся на одной стороне линии.
Неявное уравнение для линии, проходящей через p1 и p2:
F (x y) = (y2-y1) * x + (x1-x2) * y + (x2 * y1-x1 * y2)
Если F (x y) = 0, (x y) находится на линии.
Если F (x y)> 0, (x y) «выше» линии.
Если F (x y) <0, (x y) находится «ниже» линии. </p>
Подставьте все четыре угла в F (x y). Если они все отрицательные или все положительные, пересечения нет. Если некоторые из них положительные, а некоторые отрицательные, перейдите к шагу B.
B. Спроецируйте конечную точку на ось x и проверьте, пересекает ли тень сегмента тень многоугольника. Повторите по оси Y:
Если (x1> xTR и x2> xTR), пересечения нет (линия находится справа от прямоугольника).
Если (x1
Если (y1> yTR и y2> yTR), пересечения нет (линия находится над прямоугольником).
Если (y1
иначе есть пересечение. Сделайте Коэн-Сазерленд или любой другой код, упомянутый в других ответах на ваш вопрос.
Можно, конечно, сначала сделать B, потом A.
Алехо