Участник:Liebeann/Принадлежность точки многоугольнику: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Строка 9: Строка 9:
 
'''Обозначения:'''
 
'''Обозначения:'''
 
* <math>int(P)</math> &mdash; множество строго внутренних точек многоугольника <math>P</math>
 
* <math>int(P)</math> &mdash; множество строго внутренних точек многоугольника <math>P</math>
* <math>V(P)</math> &mdash; множество точек, являющихся вершинами многоугольника <math>P</math>
+
* <math>V(P) = \{v_0, v_2, \dots, v_{N - 1} \}</math> &mdash; упорядоченноый набор точек, являющихся вершинами многоугольника <math>P</math>
 
* <math>D(P)</math> &mdash; множество граничных точек многоугольника <math>P</math>, без учета вершин многоугольника.
 
* <math>D(P)</math> &mdash; множество граничных точек многоугольника <math>P</math>, без учета вершин многоугольника.
 
* <math>out(P)</math> &mdash; множество строго внешних по отношению к <math>P</math> точек
 
* <math>out(P)</math> &mdash; множество строго внешних по отношению к <math>P</math> точек
Строка 28: Строка 28:
  
  
Если <math>v \notin V(P)</math>:
+
Если точка не совпадает ни с одной вершиной, то проверим, принадлежит ли <math>X</math> множеству <math>D(P)</math>. Для этого переберем все ребра многоугольника <math>(v_i, v_{i + 1})</math> и посчитаем следующие величины:
  
Пусть порядок вершин в многоугольнике <math>P</math> = <math>\{v_0, v_1, v_2, \dots, v_{N - 1}\}</math>. Посчитаем следующую сумму ориентированных углов:
+
Пусть <math>v_i^l = v_i - X, v_i^r = v_{(i + 1) \% N} - X</math>
 +
<math>s_i = \langle v_i^l, v_i^r \rangle </math> &mdash; скалярное произведение векторов <math>v_i^l, v_i^r</math>
 +
 
 +
<math>t_i = v_i^l \times v_i^r</math> &mdash; модуль вектора, полученного векторным произведением векторов <math>v_i^l, v_i^r</math>
 +
 
 +
Теоретически, точка лежит на ребре (строго, не совпадает ни с одной из вершин ребер), если <math>s_i < 0</math> и <math>d_i =
 +
0</math>.
 +
 
 +
Практически, равенство нулю нужно превратить в <math>|d_i| \leqslant \varepsilon </math>.
 +
 
 +
Если все условия выполнены, то возвращаем 0.
 +
 
 +
Если <math>X \notin V(P)</math> и <math>X \not in D(P)</math>:
 +
 
 +
Посчитаем следующую сумму ориентированных углов:
  
 
<math>S = \sum_{i=0}^{N - 1} angle (v_i - X, v_{(i + 1) \% N} - X)</math>
 
<math>S = \sum_{i=0}^{N - 1} angle (v_i - X, v_{(i + 1) \% N} - X)</math>

Версия 23:37, 29 ноября 2017

Автор статьи: Липкина Анна

1 Свойства и структура алгоритмов

1.1 Общее описание алгоритма

На плоскости дан произвольный многоугольник с [math]N[/math] вершинами и точка [math]X[/math]. Требуется определить положение точки относительно многоугольника: находится ли точка внутри многоугольника, на его границе, совпадает с вершиной или находится вне многоугольника.

1.2 Математическое описание алгоритма

Дано: Многоугольник [math]P[/math]с [math]N[/math] вершинами и точка [math]X[/math]. Каждая вершина многоугольника и точка [math]X[/math] описываются парой координат [math](x, y)[/math].

Обозначения:

  • [math]int(P)[/math] — множество строго внутренних точек многоугольника [math]P[/math]
  • [math]V(P) = \{v_0, v_2, \dots, v_{N - 1} \}[/math] — упорядоченноый набор точек, являющихся вершинами многоугольника [math]P[/math]
  • [math]D(P)[/math] — множество граничных точек многоугольника [math]P[/math], без учета вершин многоугольника.
  • [math]out(P)[/math] — множество строго внешних по отношению к [math]P[/math] точек
  • [math]\delta_{\varepsilon}(X)[/math][math]\varepsilon[/math]-окрестность точки [math]X[/math], или это следующее множество точек: [math]\{x \in \mathbb{R}^2 | \rho(x, X) \leqslant \varepsilon \}[/math], где [math]\rho(A, B) = \sqrt{(A_x - B_x)^2 + (A_y - B_y) ^ 2}[/math] — Евклидово расстояние между точками [math]A[/math] и [math]B[/math], а [math]A = (A_x, A_y)[/math] — точка, задающаяся своими координатами по осям.

Выход: вывести:

  • 1, если [math]X \in int(P)[/math]
  • 2, если [math]X \in V(P)[/math]
  • 0, если [math]X \in D(P)[/math]
  • -1, если [math]X \in out(P)[/math]

Алгоритм: Сначала проверим, принадлежит ли [math]X[/math] множеству [math]V(P)[/math]. Для этого достаточно перебрать все вершины [math]V(P)[/math] и для каждой проверить, лежит ли [math]X[/math] в маленькой [math]\varepsilon[/math]-окрестности текущей вершины многоугольника. Более формально:

для всех v принадлежащих V(P):
   если X принадлежит епсилон-окрестности v:
        вернуть 2


Если точка не совпадает ни с одной вершиной, то проверим, принадлежит ли [math]X[/math] множеству [math]D(P)[/math]. Для этого переберем все ребра многоугольника [math](v_i, v_{i + 1})[/math] и посчитаем следующие величины:

Пусть [math]v_i^l = v_i - X, v_i^r = v_{(i + 1) \% N} - X[/math] [math]s_i = \langle v_i^l, v_i^r \rangle [/math] — скалярное произведение векторов [math]v_i^l, v_i^r[/math]

[math]t_i = v_i^l \times v_i^r[/math] — модуль вектора, полученного векторным произведением векторов [math]v_i^l, v_i^r[/math]

Теоретически, точка лежит на ребре (строго, не совпадает ни с одной из вершин ребер), если [math]s_i \lt 0[/math] и [math]d_i = 0[/math].

Практически, равенство нулю нужно превратить в [math]|d_i| \leqslant \varepsilon [/math].

Если все условия выполнены, то возвращаем 0.

Если [math]X \notin V(P)[/math] и [math]X \not in D(P)[/math]:

Посчитаем следующую сумму ориентированных углов:

[math]S = \sum_{i=0}^{N - 1} angle (v_i - X, v_{(i + 1) \% N} - X)[/math]

где [math]angle(a, b)[/math] — ориентированный угол между векторами [math]a[/math] и [math]b[/math].

Есть следующие три варианта:

  • [math]|S| \lt \varepsilon \Rightarrow X \in out(P) [/math]
  • [math]|S| \in \delta_{\varepsilon}(\pi) \Rightarrow X \in D(P)[/math]
  • [math]|S| \in \delta_{\varepsilon}(2 \pi) \Rightarrow X \in int(P)[/math]

Замечание: здесь вводятся [math]\varepsilon[/math] - окрестности из-за того, что работа происходит с вещественными числами.

1.3 Вычислительное ядро алгоритма

1.4 Макроструктура алгоритма

1.5 Схема реализации последовательного алгоритма

1.6 Последовательная сложность алгоритма

1.7 Информационный граф

1.8 Ресурс параллелизма алгоритма

1.9 Входные и выходные данные алгоритма

1.10 Свойства алгоритма

2 Программная реализация алгоритма

2.1 Особенности реализации последовательного алгоритма

2.2 Локальность данных и вычислений

2.3 Возможные способы и особенности параллельной реализации алгоритма

2.4 Масштабируемость алгоритма и его реализации

2.5 Динамические характеристики и эффективность реализации алгоритма

2.6 Выводы для классов архитектур

2.7 Существующие реализации алгоритма

3 Литература

http://ru-wiki.org/wiki/Задача_о_принадлежности_точки_многоугольнику https://habrahabr.ru/post/301102/ http://neerc.ifmo.ru/wiki/index.php?title=Принадлежность_точки_выпуклому_и_невыпуклому_многоугольникам http://www.e-maxx-ru.1gb.ru/algo/pt_in_polygon