Изменения

Перейти к: навигация, поиск
Нет описания правки
=== Получение выпуклой оболочки ===
Научимся восстанавливать выпуклую оболочку по дереву, описанному выше. Для этого рассмотрим более общую задачу: для данной вершины дерева <tex>v</tex> и отрезка <tex>[l, r]</tex> найти выпуклую оболочку часть выпуклой оболочки, состоящей из точек поддерева с корнем в <tex>v</tex>, ординаты которых лежат в этом отрезке. Это можно сделать следующим обходом:
get_hull(answer, v, l, r)
'''if''' (l < a)
get_hull(answer, v.left, l, min(a, r))
'''if''' (l <= a '''and ''' b <= r)
'''if''' (answer.empty())
answer = answer ++ v.bridge.left
=== Принадлежность точки выпуклой оболочке ===
 
По аналогии с предыдущим пунктом, сведем запрос к более общему запросу: для данной вершины дерева <tex>v</tex> и отрезка <tex>[l, r]</tex> проверить, принадлежит ли точка <tex>p</tex> части выпуклой оболочки, состоящей из точек поддерева с корнем в <tex>v</tex>, ординаты которых лежат в этом отрезке. Тогда принадлежность точки проверяется вызовом in_hull(p, root, <tex>-\infty</tex>, <tex>+\infty</tex>)
 
in_hull(p, v, l, r)
'''if''' (v.leaf)
'''return''' '''false'''
a = v.bridge.left.y
b = v.bridge.right.y
'''if''' (l <= a and b <= r)
'''if''' (v.bridge.left == p '''or''' v.bridge.right == p)
'''return''' '''true'''
'''if''' (l < a '''and''' p.y < a)
'''return''' in_hull(p, v.left, l, min(a, r))
'''if''' (b < r '''and''' b < p.y)
'''return''' in_hull(p, v.right, max(l, b), r)
'''return''' '''false'''
=== Вставка точки ===
73
правки

Навигация