Эти два метода не являются одним и тем же критерием.
В ненулевом или правиле намотки направление сегментов линии имеет значение. Алгоритм проверяет, пересекает ли отрезок линии исходящий луч слева или справа, и подсчитывает, как часто происходит каждый случай. Точка считается противоположной только в том случае, если
число пересечений или четно-нечетное правило просто подсчитывает частоту пересечения линии. Каждый раз, когда вы пересекаете линию, вы go либо изнутри наружу, либо наоборот, так что четное число пересечений означает, что точка находится снаружи.
Если вы go справа от P1 в вашем примере, вы пересекайте две линии, поэтому четно-нечетное правило говорит вам, что P1 не находится в многоугольнике. Но эти две линии имеют одинаковую ориентацию: если ваша общая фигура нарисована по часовой стрелке, обе линии нарисованы сверху вниз. По словам статьи, которую вы связали, многоугольник дважды обматывает P1. Согласно правилу намотки, P1 является частью вашего многоугольника. Ваша программа показывает правильное поведение.
Векторные графические программы и форматы различают guish между этими двумя правилами. Например, SVG имеет атрибут fill-rule
, где вы можете установить поведение. В Postscript есть операторы fill
и eofill
для заполнения путей правилом намотки и четно-нечетным правилом соответственно. По умолчанию обычно используется правило намотки, поэтому разработчики должны позаботиться о правильной ориентации своих путей.