Jump to content

Правило чет-нечет

Кривая (вверху) заполняется по двум правилам: правилу чет-нечет (слева) и правилу ненулевой обмотки (справа). В каждом случае стрелка показывает луч из точки P, выходящий из кривой. В четно-нечетном случае луч пересекается двумя прямыми четного числа; поэтому делается вывод, что P находится «вне» кривой. Согласно правилу ненулевой обмотки, луч пересекается по часовой стрелке дважды, каждый из которых вносит -1 в счет обмотки: поскольку сумма -2 не равна нулю, считается, что P находится «внутри» кривой.

Правило чет-нечет — это алгоритм, реализованный в программном обеспечении для работы с векторной графикой. [ 1 ] например, язык PostScript и масштабируемая векторная графика (SVG), которая определяет, как будет заполняться графическая фигура с более чем одним замкнутым контуром. В отличие от алгоритма ненулевого правила , этот алгоритм альтернативно раскрашивает и оставляет неокрашенные фигуры, определенные вложенными замкнутыми путями, независимо от их витков.

SVG определяет правило четности-нечета следующим образом:

Это правило определяет «внутренность» точки на холсте, рисуя луч от этой точки до бесконечности в любом направлении и подсчитывая количество сегментов пути от заданной фигуры, которые пересекает луч. Если это число нечетное, точка находится внутри; если даже, то точка находится снаружи.

Это правило можно увидеть в действии во многих программах векторной графики (таких как Freehand или Illustrator ), где пересечение контура с самим собой приводит к странному заполнению фигур.

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

Стандарт компьютерной векторной графики SVG можно настроить на использование правила чет-нечет при рисовании многоугольников, хотя он использует ненулевое правило . по умолчанию [ 2 ]

Выполнение

[ редактировать ]

Ниже приведен частичный пример реализации на Python . [ 3 ] используя луч справа от проверяемой точки:

def is_point_in_path(x: int, y: int, poly: list[tuple[int, int]]) -> bool:
    """Determine if the point is on the path, corner, or boundary of the polygon

    Args:
      x -- The x coordinates of point.
      y -- The y coordinates of point.
      poly -- a list of tuples [(x, y), (x, y), ...]

    Returns:
      True if the point is in the path or is a corner or on the boundary"""
    c = False
    for i in range(len(poly)):
        ax, ay = poly[i]
        bx, by = poly[i - 1]
        if (x == ax) and (y == ay):
            # point is a corner
            return True
        if (ay > y) != (by > y):
            slope = (x - ax) * (by - ay) - (bx - ax) * (y - ay)
            if slope == 0:
                # point is on boundary
                return True
            if (slope < 0) != (by < ay):
                c = not c
    return c

См. также

[ редактировать ]
  1. ^ Дж. Д. Фоли, А. ван Дам, С. К. Фейнер и Дж. Ф. Хьюз. Компьютерная графика: принципы и практика. Системы Серия «Программирование». Аддисон-Уэсли, Ридинг, 2-е издание, 1990 г.
  2. ^ [1] , w3c.org, получено 28 марта 2019 г.
  3. ^ «PNPOLY — Включение точек в тест полигонов — WR Franklin (WRF)» .
[ редактировать ]


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a5d97089e4624c5476b8a65237df1959__1715333700
URL1:https://arc.ask3.ru/arc/aa/a5/59/a5d97089e4624c5476b8a65237df1959.html
Заголовок, (Title) документа по адресу, URL1:
Even–odd rule - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)