<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tiss93</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Tiss93"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Tiss93"/>
		<updated>2026-05-19T14:44:02Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45298</id>
		<title>Компьютерные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45298"/>
				<updated>2015-04-03T15:07:20Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Блок 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Блок 1=&lt;br /&gt;
* [[Коммутация на канальном уровне]]&lt;br /&gt;
* [[Сети с общей средой передачи данных (подуровень MAC, протоколы)]]&lt;br /&gt;
* [[Физическое кодирование]]&lt;br /&gt;
* [[Канальный уровень]]&lt;br /&gt;
* [[Физический уровень]]&lt;br /&gt;
* [[Ethernet]]&lt;br /&gt;
* [[Bluetooth]]&lt;br /&gt;
* [[Виртуальные локальные сети]]&lt;br /&gt;
* [[Протоколы стандарта 802.11]]&lt;br /&gt;
&lt;br /&gt;
=Блок 2=&lt;br /&gt;
* [[Сетевой уровень]]&lt;br /&gt;
* [[Мультикаст. Мультикаст маршрутизация]]&lt;br /&gt;
* [[IPv4]]&lt;br /&gt;
* [[Управляющие протоколы Internet]]&lt;br /&gt;
* [[Протоколы внешнего и внутреннего шлюза]]&lt;br /&gt;
* [[IPv6]]&lt;br /&gt;
* [[Транспортный уровень]]&lt;br /&gt;
* [[Протоколы транспортного уровеня(TCP, UDP, SCTP)]]&lt;br /&gt;
&lt;br /&gt;
=Блок 3=&lt;br /&gt;
* [[Служба DNS. Пространство имен в Internet]]&lt;br /&gt;
* [[Служба электронной почты]]&lt;br /&gt;
* [[WWW. HTTP. Основы и развитие]]&lt;br /&gt;
* [[FTP. Telnet. SSH]]&lt;br /&gt;
* [[Авторизация. Аутентификация. Аудит. Radius. Diameter]]&lt;br /&gt;
* [[Шифрование]]&lt;br /&gt;
* [[TLS. IPsec. Основы, отличия. IPv6 и шифрование]]&lt;br /&gt;
* [[Протоколы аутентификации]]&lt;br /&gt;
* [[Firewall. Концепция, примеры]]&lt;br /&gt;
* [[SIP. Телефония поверх IP]]&lt;br /&gt;
* [[Одноранговые сети]]&lt;br /&gt;
* [[Сетевые атаки. Классификация, описания]]&lt;br /&gt;
* [[Мультимедиа поверх IP. RTSP]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45297</id>
		<title>Компьютерные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45297"/>
				<updated>2015-04-03T15:06:49Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Блок 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Блок 1=&lt;br /&gt;
* [[Коммутация на канальном уровне]]&lt;br /&gt;
* [[Сети с общей средой передачи данных (подуровень MAC, протоколы)]]&lt;br /&gt;
* [[Физическое кодирование]]&lt;br /&gt;
* [[Канальный уровень]]&lt;br /&gt;
* [[Физический уровень]]&lt;br /&gt;
* [[Ethernet]]&lt;br /&gt;
* [[Bluetooth]]&lt;br /&gt;
* [[Виртуальные локальные сети]]&lt;br /&gt;
* [[Протоколы стандарта 802.11]]&lt;br /&gt;
&lt;br /&gt;
=Блок 2=&lt;br /&gt;
* [[Сетевой уровень]]&lt;br /&gt;
* [[Мультикаст. Мультикаст маршрутизация]]&lt;br /&gt;
* [[IPv4]]&lt;br /&gt;
* [[Управляющие протоколы Internet]]&lt;br /&gt;
* [[Протоколы внешнего и внутреннего шлюза]]&lt;br /&gt;
* [[IPv6]]&lt;br /&gt;
* [[Транспортный уровень]]&lt;br /&gt;
* [[Протоколы транспортного уровня(TCP, UDP, SCTP)]]&lt;br /&gt;
&lt;br /&gt;
=Блок 3=&lt;br /&gt;
* [[Служба DNS. Пространство имен в Internet]]&lt;br /&gt;
* [[Служба электронной почты]]&lt;br /&gt;
* [[WWW. HTTP. Основы и развитие]]&lt;br /&gt;
* [[FTP. Telnet. SSH]]&lt;br /&gt;
* [[Авторизация. Аутентификация. Аудит. Radius. Diameter]]&lt;br /&gt;
* [[Шифрование]]&lt;br /&gt;
* [[TLS. IPsec. Основы, отличия. IPv6 и шифрование]]&lt;br /&gt;
* [[Протоколы аутентификации]]&lt;br /&gt;
* [[Firewall. Концепция, примеры]]&lt;br /&gt;
* [[SIP. Телефония поверх IP]]&lt;br /&gt;
* [[Одноранговые сети]]&lt;br /&gt;
* [[Сетевые атаки. Классификация, описания]]&lt;br /&gt;
* [[Мультимедиа поверх IP. RTSP]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Tiss93&amp;diff=45295</id>
		<title>Участник:Tiss93</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Tiss93&amp;diff=45295"/>
				<updated>2015-04-03T14:46:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Серока Арсений. Гр *538&lt;br /&gt;
&lt;br /&gt;
ars.seroka@gmail.com&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_DNS._%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%B8%D0%BC%D1%91%D0%BD_%D0%B2_Internet&amp;diff=45294</id>
		<title>Служба DNS. Пространство имён в Internet</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_DNS._%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%B8%D0%BC%D1%91%D0%BD_%D0%B2_Internet&amp;diff=45294"/>
				<updated>2015-04-03T14:40:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Domain Name System''' - это сервис для преобразования доменных имен в ip адреса.&lt;br /&gt;
Система DNS это, по сути сеть в сети. Тк если один dns сервер не знает правильного ip, то он спрашивает у другого и так далее, пока не получит ответ.&lt;br /&gt;
Распределённая база данных DNS поддерживается с помощью иерархии DNS-серверов, взаимодействующих по определённому протоколу.&lt;br /&gt;
&lt;br /&gt;
dns :: DomainName -&amp;gt; IpAddress&lt;br /&gt;
&lt;br /&gt;
=== Характеристики ===&lt;br /&gt;
DNS обладает следующими характеристиками:&lt;br /&gt;
&lt;br /&gt;
* Распределённость администрирования. Ответственность за разные части иерархической структуры несут разные люди или организации.&lt;br /&gt;
* Распределённость хранения информации. Каждый узел сети в обязательном порядке должен хранить только те данные, которые входят в его зону ответственности, и (возможно) адреса корневых DNS-серверов.&lt;br /&gt;
* Кеширование информации. Узел может хранить некоторое количество данных не из своей зоны ответственности для уменьшения нагрузки на сеть.&lt;br /&gt;
* Иерархическая структура, в которой все узлы объединены в дерево, и каждый узел может или самостоятельно определять работу нижестоящих узлов, или делегировать (передавать) их другим узлам.&lt;br /&gt;
* Резервирование. За хранение и обслуживание своих узлов (зон) отвечают (обычно) несколько серверов, разделённые как физически, так и логически, что обеспечивает сохранность данных и продолжение работы даже в случае сбоя одного из узлов.&lt;br /&gt;
&lt;br /&gt;
=== Термины ===&lt;br /&gt;
* '''Домeн''' (англ. domain — область) — узел в дереве имён, вместе со всеми подчинёнными ему узлами (если таковые имеются), то есть именованная ветвь или поддерево в дереве имен. Структура доменного имени отражает порядок следования узлов в иерархии; доменное имя читается слева направо от младших доменов к доменам высшего уровня (в порядке повышения значимости): вверху находится корневой домен (не имеющий идентификатора), ниже идут домены первого уровня (доменные зоны), затем — домены второго уровня, третьего и т. д. (например, для адреса ru.wikipedia.org. домен первого уровня — org, второго wikipedia, третьего ru). На практике точку перед корневым доменом часто опускают (&amp;quot;ru.wikipedia.org&amp;quot; вместо &amp;quot;ru.wikipedia.org.&amp;quot;), но она бывает важна в случаях разделения между относительными доменами и FQDN (англ. Fully Qualifed Domain Name, полностью определённое имя домена).&lt;br /&gt;
* '''Ресурсная запись''' — единица хранения и передачи информации в DNS. Каждая ресурсная запись имеет имя (то есть привязана к определенному Доменному имени, узлу в дереве имен), тип и поле данных, формат и содержание которого зависит от типа.&lt;br /&gt;
* '''DNS-сервер''' — специализированное ПО для обслуживания DNS, а также компьютер, на котором это ПО выполняется. DNS-сервер может быть ответственным за некоторые зоны и/или может перенаправлять запросы вышестоящим серверам.&lt;br /&gt;
* '''DNS-клиент''' — специализированная библиотека (или программа) для работы с DNS. В ряде случаев DNS-сервер выступает в роли DNS-клиента.&lt;br /&gt;
* '''DNS-запрос''' (англ. DNS query) — запрос от клиента (или сервера) серверу. Запрос может быть рекурсивным или нерекурсивным.&lt;br /&gt;
* '''Зона''' — часть дерева доменных имен (включая ресурсные записи), размещаемая как единое целое на некотором сервере доменных имен (DNS-сервере, см. ниже), а чаще — одновременно на нескольких серверах (см. ниже). Целью выделения части дерева в отдельную зону является передача ответственности (см. ниже) за соответствующий домен другому лицу или организации. Это называется делегированием (см. ниже). Как связная часть дерева, зона внутри тоже представляет собой дерево. Если рассматривать пространство имен DNS как структуру из зон, а не отдельных узлов/имен, тоже получается дерево; оправданно говорить о родительских и дочерних зонах, о старших и подчиненных. На практике большинство зон 0-го и 1-го уровня ('.', ru, com, …) состоят из единственного узла, которому непосредственно подчиняются дочерние зоны. В больших корпоративных доменах (2-го и более уровней) иногда встречается образование дополнительных подчиненных уровней без выделения их в дочерние зоны.&lt;br /&gt;
* '''Делегирование''' — операция передачи ответственности за часть дерева доменных имен другому лицу или организации. За счет делегирования в DNS обеспечивается распределенность администрирования и хранения. Технически делегирование выражается в выделении этой части дерева в отдельную зону, и размещении этой зоны на DNS-сервере (см. ниже), управляемом этим лицом или организацией. При этом в родительскую зону включаются «склеивающие» ресурсные записи (NS и А), содержащие указатели на DNS-сервера дочерней зоны, а вся остальная информация, относящаяся к дочерней зоне, хранится уже на DNS-серверах дочерней зоны.&lt;br /&gt;
&lt;br /&gt;
См [https://ru.wikipedia.org/wiki/DNS вики]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_DNS._%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%B8%D0%BC%D1%91%D0%BD_%D0%B2_Internet&amp;diff=45293</id>
		<title>Служба DNS. Пространство имён в Internet</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B1%D0%B0_DNS._%D0%9F%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%BE_%D0%B8%D0%BC%D1%91%D0%BD_%D0%B2_Internet&amp;diff=45293"/>
				<updated>2015-04-03T14:37:19Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: Новая страница: «Domain Name System - это сервис для преобразования доменных имен в ip адреса. Система DNS это, по сут...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Domain Name System - это сервис для преобразования доменных имен в ip адреса.&lt;br /&gt;
Система DNS это, по сути сеть в сети. Тк если один dns сервер не знает правильного ip, то он спрашивает у другого и так далее, пока не получит ответ.&lt;br /&gt;
Распределённая база данных DNS поддерживается с помощью иерархии DNS-серверов, взаимодействующих по определённому протоколу.&lt;br /&gt;
&lt;br /&gt;
dns :: DomainName -&amp;gt; IpAddress&lt;br /&gt;
&lt;br /&gt;
=== Характеристики ===&lt;br /&gt;
DNS обладает следующими характеристиками:&lt;br /&gt;
&lt;br /&gt;
* Распределённость администрирования. Ответственность за разные части иерархической структуры несут разные люди или организации.&lt;br /&gt;
* Распределённость хранения информации. Каждый узел сети в обязательном порядке должен хранить только те данные, которые входят в его зону ответственности, и (возможно) адреса корневых DNS-серверов.&lt;br /&gt;
* Кеширование информации. Узел может хранить некоторое количество данных не из своей зоны ответственности для уменьшения нагрузки на сеть.&lt;br /&gt;
* Иерархическая структура, в которой все узлы объединены в дерево, и каждый узел может или самостоятельно определять работу нижестоящих узлов, или делегировать (передавать) их другим узлам.&lt;br /&gt;
* Резервирование. За хранение и обслуживание своих узлов (зон) отвечают (обычно) несколько серверов, разделённые как физически, так и логически, что обеспечивает сохранность данных и продолжение работы даже в случае сбоя одного из узлов.&lt;br /&gt;
&lt;br /&gt;
=== Термины ===&lt;br /&gt;
* '''Домeн''' (англ. domain — область) — узел в дереве имён, вместе со всеми подчинёнными ему узлами (если таковые имеются), то есть именованная ветвь или поддерево в дереве имен. Структура доменного имени отражает порядок следования узлов в иерархии; доменное имя читается слева направо от младших доменов к доменам высшего уровня (в порядке повышения значимости): вверху находится корневой домен (не имеющий идентификатора), ниже идут домены первого уровня (доменные зоны), затем — домены второго уровня, третьего и т. д. (например, для адреса ru.wikipedia.org. домен первого уровня — org, второго wikipedia, третьего ru). На практике точку перед корневым доменом часто опускают (&amp;quot;ru.wikipedia.org&amp;quot; вместо &amp;quot;ru.wikipedia.org.&amp;quot;), но она бывает важна в случаях разделения между относительными доменами и FQDN (англ. Fully Qualifed Domain Name, полностью определённое имя домена).&lt;br /&gt;
* '''Ресурсная запись''' — единица хранения и передачи информации в DNS. Каждая ресурсная запись имеет имя (то есть привязана к определенному Доменному имени, узлу в дереве имен), тип и поле данных, формат и содержание которого зависит от типа.&lt;br /&gt;
* '''DNS-сервер''' — специализированное ПО для обслуживания DNS, а также компьютер, на котором это ПО выполняется. DNS-сервер может быть ответственным за некоторые зоны и/или может перенаправлять запросы вышестоящим серверам.&lt;br /&gt;
* '''DNS-клиент''' — специализированная библиотека (или программа) для работы с DNS. В ряде случаев DNS-сервер выступает в роли DNS-клиента.&lt;br /&gt;
* '''DNS-запрос''' (англ. DNS query) — запрос от клиента (или сервера) серверу. Запрос может быть рекурсивным или нерекурсивным.&lt;br /&gt;
* '''Зона''' — часть дерева доменных имен (включая ресурсные записи), размещаемая как единое целое на некотором сервере доменных имен (DNS-сервере, см. ниже), а чаще — одновременно на нескольких серверах (см. ниже). Целью выделения части дерева в отдельную зону является передача ответственности (см. ниже) за соответствующий домен другому лицу или организации. Это называется делегированием (см. ниже). Как связная часть дерева, зона внутри тоже представляет собой дерево. Если рассматривать пространство имен DNS как структуру из зон, а не отдельных узлов/имен, тоже получается дерево; оправданно говорить о родительских и дочерних зонах, о старших и подчиненных. На практике большинство зон 0-го и 1-го уровня ('.', ru, com, …) состоят из единственного узла, которому непосредственно подчиняются дочерние зоны. В больших корпоративных доменах (2-го и более уровней) иногда встречается образование дополнительных подчиненных уровней без выделения их в дочерние зоны.&lt;br /&gt;
* '''Делегирование''' — операция передачи ответственности за часть дерева доменных имен другому лицу или организации. За счет делегирования в DNS обеспечивается распределенность администрирования и хранения. Технически делегирование выражается в выделении этой части дерева в отдельную зону, и размещении этой зоны на DNS-сервере (см. ниже), управляемом этим лицом или организацией. При этом в родительскую зону включаются «склеивающие» ресурсные записи (NS и А), содержащие указатели на DNS-сервера дочерней зоны, а вся остальная информация, относящаяся к дочерней зоне, хранится уже на DNS-серверах дочерней зоны.&lt;br /&gt;
&lt;br /&gt;
См [https://ru.wikipedia.org/wiki/DNS вики]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45292</id>
		<title>Участник:Shersh/Билеты к экзамену по сетям</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45292"/>
				<updated>2015-04-03T14:17:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: Содержимое страницы заменено на «= Ищите конспекты тут [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Ищите конспекты тут [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8 Компьютерные сети] =&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45291</id>
		<title>Виртуальные локальные сети</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D0%BB%D0%BE%D0%BA%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8&amp;diff=45291"/>
				<updated>2015-04-03T14:17:23Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: Новая страница: «Тут всё понятно написано: [http://xgu.ru/wiki/VLAN Xgu.ru {{---}} VLAN]  Ещё ссылка: [http://www.intuit.ru/studies/courses/3591/833/...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Тут всё понятно написано: [http://xgu.ru/wiki/VLAN Xgu.ru {{---}} VLAN]&lt;br /&gt;
&lt;br /&gt;
Ещё ссылка: [http://www.intuit.ru/studies/courses/3591/833/lecture/14258 intuit.ru {{---}} VLAN]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45290</id>
		<title>Участник:Shersh/Билеты к экзамену по сетям</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45290"/>
				<updated>2015-04-03T14:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Пишите конспекты тут [http://neerc.ifmo.ru/wiki/index.php?title=%D0%9A%D0%BE%D0%BC%D0%BF%D1%8C%D1%8E%D1%82%D0%B5%D1%80%D0%BD%D1%8B%D0%B5_%D1%81%D0%B5%D1%82%D0%B8 Компьютерные сети] =&lt;br /&gt;
&lt;br /&gt;
== Блок 1. ==&lt;br /&gt;
=== 1. Коммутация на канальном уровне. ===&lt;br /&gt;
=== 2. Сети с общей средой передачи данных (подуровень MAC, протоколы). ===&lt;br /&gt;
=== 3. Физическое кодирование. ===&lt;br /&gt;
=== 4. Модель OSI. Канальный уровень (сервисы, подуровни). ===&lt;br /&gt;
=== 5. Модель OSI. Канальный уровень (протоколы). ===&lt;br /&gt;
&amp;lt;b&amp;gt;Перенесено.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. Модель OSI. Канальный уровень (контроль и исправление ошибок). ===&lt;br /&gt;
=== 7. Модель OSI. Канальный уровень (мосты). ===&lt;br /&gt;
=== 8. Модель OSI. Физический уровень (введение). ===&lt;br /&gt;
=== 9. Модель OSI. Физический уровень (проводные сети). ===&lt;br /&gt;
=== 10. Модель OSI. Физический уровень (оптоволоконные сети). ===&lt;br /&gt;
=== 11. Ethernet. ===&lt;br /&gt;
=== 12. Bluetooth. ===&lt;br /&gt;
=== 13. Виртуальные локальные сети. ===&lt;br /&gt;
Тут всё понятно написано: [http://xgu.ru/wiki/VLAN Xgu.ru {{---}} VLAN]&lt;br /&gt;
&lt;br /&gt;
Ещё ссылка: [http://www.intuit.ru/studies/courses/3591/833/lecture/14258 intuit.ru {{---}} VLAN]&lt;br /&gt;
&lt;br /&gt;
=== 14. Протоколы стандарта 802.11*. ===&lt;br /&gt;
&lt;br /&gt;
== Блок 2. ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Модель OSI. Сетевой уровень (введение, сервисы). ===&lt;br /&gt;
&amp;lt;b&amp;gt;Перенесено&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Модель OSI. Сетевой уровень (алгоритмы маршрутизации). ===&lt;br /&gt;
=== 3. Модель OSI. Сетевой уровень (алгоритмы борьбы с перегрузкой). ===&lt;br /&gt;
=== 4. Модель OSI. Сетевой уровень (качество обслуживания). ===&lt;br /&gt;
=== 5. Модель OSI. Сетевой уровень (объединение сетей). ===&lt;br /&gt;
=== 6. Мультикаст. Мультикаст маршрутизация. ===&lt;br /&gt;
=== 7. IPv4. Основы. ===&lt;br /&gt;
=== 8. IPv4. Маршрутизация. ===&lt;br /&gt;
=== 9. Управляющие протоколы Internet. ===&lt;br /&gt;
=== 10. Протоколы внешнего и внутреннего шлюза. ===&lt;br /&gt;
=== 11. IPv6. ===&lt;br /&gt;
=== 12. Модель OSI. Транспортный уровень (сервисы, примитивы, элементы транспортных протоколов). ===&lt;br /&gt;
=== 13. TCP/IP. UDP. ===&lt;br /&gt;
=== 14. TCP/IP. TCP (принцип работы, основы). ===&lt;br /&gt;
=== 15. TCP/IP. TCP (модификации). Производительность транспортного уровня. ===&lt;br /&gt;
=== 16. SCTP (основы, свойства, отличия). ===&lt;br /&gt;
&lt;br /&gt;
== Блок 3. ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Служба DNS. Пространство имен в Internet. ===&lt;br /&gt;
=== 2. Служба электронной почты. ===&lt;br /&gt;
=== 3. WWW. HTTP. Основы и развитие. ===&lt;br /&gt;
&lt;br /&gt;
=== 4. FTP. Telnet. SSH. ===&lt;br /&gt;
=== 5. Авторизация. Аутентификация. Аудит. Radius. Diameter. ===&lt;br /&gt;
=== 6. Шифрование. Алгоритмы с симметричным ключом. ===&lt;br /&gt;
=== 7. Шифрование. Алгоритмы с открытым ключом. ===&lt;br /&gt;
=== 8. Шифрование. Цифровые подписи. ===&lt;br /&gt;
=== 9. Шифрование. Системы управления открытыми ключами. ===&lt;br /&gt;
=== 10. TLS. IPsec. Основы, отличия. IPv6 и шифрование. === &lt;br /&gt;
=== 11. Протоколы аутентификации. ===&lt;br /&gt;
=== 12. Firewall. Концепция, примеры. ===&lt;br /&gt;
=== 13. SIP. Телефония поверх IP. ===&lt;br /&gt;
=== 14. Одноранговые сети. ===&lt;br /&gt;
=== 15. Сетевые атаки. Классификация, описания. ===&lt;br /&gt;
=== 16. Мультимедиа поверх IP. RTSP. ===&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45289</id>
		<title>Участник:Shersh/Билеты к экзамену по сетям</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:Shersh/%D0%91%D0%B8%D0%BB%D0%B5%D1%82%D1%8B_%D0%BA_%D1%8D%D0%BA%D0%B7%D0%B0%D0%BC%D0%B5%D0%BD%D1%83_%D0%BF%D0%BE_%D1%81%D0%B5%D1%82%D1%8F%D0%BC&amp;diff=45289"/>
				<updated>2015-04-03T14:15:58Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* 3. WWW. HTTP. Основы и развитие. */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Блок 1. ==&lt;br /&gt;
=== 1. Коммутация на канальном уровне. ===&lt;br /&gt;
=== 2. Сети с общей средой передачи данных (подуровень MAC, протоколы). ===&lt;br /&gt;
=== 3. Физическое кодирование. ===&lt;br /&gt;
=== 4. Модель OSI. Канальный уровень (сервисы, подуровни). ===&lt;br /&gt;
=== 5. Модель OSI. Канальный уровень (протоколы). ===&lt;br /&gt;
&amp;lt;b&amp;gt;Перенесено.&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. Модель OSI. Канальный уровень (контроль и исправление ошибок). ===&lt;br /&gt;
=== 7. Модель OSI. Канальный уровень (мосты). ===&lt;br /&gt;
=== 8. Модель OSI. Физический уровень (введение). ===&lt;br /&gt;
=== 9. Модель OSI. Физический уровень (проводные сети). ===&lt;br /&gt;
=== 10. Модель OSI. Физический уровень (оптоволоконные сети). ===&lt;br /&gt;
=== 11. Ethernet. ===&lt;br /&gt;
=== 12. Bluetooth. ===&lt;br /&gt;
=== 13. Виртуальные локальные сети. ===&lt;br /&gt;
Тут всё понятно написано: [http://xgu.ru/wiki/VLAN Xgu.ru {{---}} VLAN]&lt;br /&gt;
&lt;br /&gt;
Ещё ссылка: [http://www.intuit.ru/studies/courses/3591/833/lecture/14258 intuit.ru {{---}} VLAN]&lt;br /&gt;
&lt;br /&gt;
=== 14. Протоколы стандарта 802.11*. ===&lt;br /&gt;
&lt;br /&gt;
== Блок 2. ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Модель OSI. Сетевой уровень (введение, сервисы). ===&lt;br /&gt;
&amp;lt;b&amp;gt;Перенесено&amp;lt;/b&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Модель OSI. Сетевой уровень (алгоритмы маршрутизации). ===&lt;br /&gt;
=== 3. Модель OSI. Сетевой уровень (алгоритмы борьбы с перегрузкой). ===&lt;br /&gt;
=== 4. Модель OSI. Сетевой уровень (качество обслуживания). ===&lt;br /&gt;
=== 5. Модель OSI. Сетевой уровень (объединение сетей). ===&lt;br /&gt;
=== 6. Мультикаст. Мультикаст маршрутизация. ===&lt;br /&gt;
=== 7. IPv4. Основы. ===&lt;br /&gt;
=== 8. IPv4. Маршрутизация. ===&lt;br /&gt;
=== 9. Управляющие протоколы Internet. ===&lt;br /&gt;
=== 10. Протоколы внешнего и внутреннего шлюза. ===&lt;br /&gt;
=== 11. IPv6. ===&lt;br /&gt;
=== 12. Модель OSI. Транспортный уровень (сервисы, примитивы, элементы транспортных протоколов). ===&lt;br /&gt;
=== 13. TCP/IP. UDP. ===&lt;br /&gt;
=== 14. TCP/IP. TCP (принцип работы, основы). ===&lt;br /&gt;
=== 15. TCP/IP. TCP (модификации). Производительность транспортного уровня. ===&lt;br /&gt;
=== 16. SCTP (основы, свойства, отличия). ===&lt;br /&gt;
&lt;br /&gt;
== Блок 3. ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Служба DNS. Пространство имен в Internet. ===&lt;br /&gt;
=== 2. Служба электронной почты. ===&lt;br /&gt;
=== 3. WWW. HTTP. Основы и развитие. ===&lt;br /&gt;
&lt;br /&gt;
=== 4. FTP. Telnet. SSH. ===&lt;br /&gt;
=== 5. Авторизация. Аутентификация. Аудит. Radius. Diameter. ===&lt;br /&gt;
=== 6. Шифрование. Алгоритмы с симметричным ключом. ===&lt;br /&gt;
=== 7. Шифрование. Алгоритмы с открытым ключом. ===&lt;br /&gt;
=== 8. Шифрование. Цифровые подписи. ===&lt;br /&gt;
=== 9. Шифрование. Системы управления открытыми ключами. ===&lt;br /&gt;
=== 10. TLS. IPsec. Основы, отличия. IPv6 и шифрование. === &lt;br /&gt;
=== 11. Протоколы аутентификации. ===&lt;br /&gt;
=== 12. Firewall. Концепция, примеры. ===&lt;br /&gt;
=== 13. SIP. Телефония поверх IP. ===&lt;br /&gt;
=== 14. Одноранговые сети. ===&lt;br /&gt;
=== 15. Сетевые атаки. Классификация, описания. ===&lt;br /&gt;
=== 16. Мультимедиа поверх IP. RTSP. ===&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=WWW._HTTP._%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B8_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D0%B5&amp;diff=45288</id>
		<title>WWW. HTTP. Основы и развитие</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=WWW._HTTP._%D0%9E%D1%81%D0%BD%D0%BE%D0%B2%D1%8B_%D0%B8_%D1%80%D0%B0%D0%B7%D0%B2%D0%B8%D1%82%D0%B8%D0%B5&amp;diff=45288"/>
				<updated>2015-04-03T13:54:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: Новая страница: «Всемирная паутина(англ. World Wide Web) — распределенная система, предоставляющая доступ к свя...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Всемирная паутина(англ. World Wide Web) — распределенная система, предоставляющая доступ к связанным между собой документам, расположенным на различных компьютерах, подключенных к Интернету.&lt;br /&gt;
&lt;br /&gt;
Всемирную паутину образуют миллионы веб-серверов сети Интернет, расположенных по всему миру. Веб-сервер является программой, запускаемой на подключённом к сети компьютере и использующей протокол HTTP для передачи данных. Для идентификации ресурсов (зачастую файлов или их частей) во Всемирной паутине используются единообразные идентификаторы ресурсов URI (англ. Uniform Resource Identifier). Для определения местонахождения ресурсов в сети единообразные локаторы ресурсов URL Resource Locator). Такие URL-локаторы сочетают в себе технологию идентификации URI и систему доменных имён DNS (англ. Domain Name System) — доменное имя (или непосредственно IP-адрес в числовой записи) входит в состав URL для обозначения компьютера (точнее — одного из его сетевых интерфейсов), который исполняет код нужного веб-сервера.&lt;br /&gt;
&lt;br /&gt;
==== URL ====&lt;br /&gt;
Браузер находит веб-страницы и отдельные объекты по адресам специального формата, называемым URL (Uniform Resource Locator —унифицированный указатель ресурса). URL-адрес может выглядеть, например, так: http://www.olifer.co.uk/books/books.htm.&lt;br /&gt;
&lt;br /&gt;
В URL-адресе можно выделить три части:&lt;br /&gt;
* Тип протокола доступа. Начальная часть URL (http://) указывает на то, какой протокол должен быть использован для доступа к данным, расположение которых определяется оставшейся частью URL. Помимо HTTP, здесь могут быть указаны и другие протоколы, такие как FTP, telnet, также позволяющие осуществлять удаленный доступ к файлам или компьютерам.&lt;br /&gt;
* DNS-имя сервера. Имя сервера, на котором хранится нужная страница. В нашем случае —это имя сайта www.olifer.co.uk.&lt;br /&gt;
* Путь к объекту. Обычно это составное имя файла (объекта) относительно главного каталога веб-сервера, предлагаемого по умолчанию. В нашем случае путем к объекту является /books/books.htm. По расширению файла мы можем сделать вывод о том, что это HTML-файл.&lt;br /&gt;
&lt;br /&gt;
==== Протокол HTTP ====&lt;br /&gt;
HTTP (HyperText Transfer Protocol — протокол передачи гипертекста) — это протокол прикладного уровня, во многом аналогичный протоколам FTP и SMTP. В настоящее время используются две версии протокола HTTP 1.0 и HTTP 1.1&lt;br /&gt;
Обмен сообщениями идет по обычной схеме «запрос-ответ». Клиент и сервер обмениваются текстовыми сообщениями стандартного формата, то есть каждое сообщение представляет собой нескольких строк обычного текста в кодировке ASCII.&lt;br /&gt;
Для транспортировки HTTP-сообщений служит протокол TCP. При этом ТСР-соединения могут использоваться двумя разными способами:&lt;br /&gt;
* Долговременное соединение — передача в одном TCP-соединении нескольких объектов, причем время существования соединения определяется при конфигурировании веб- службы.&lt;br /&gt;
* Кратковременное соединение — передача в рамках одного ТСР-соединения только одного объекта.&lt;br /&gt;
Долговременное соединение, в свою очередь, может быть использовано двумя способами:&lt;br /&gt;
* Последовательная передача запросов с простоями — новый запрос посылается только после получения ответа.&lt;br /&gt;
* Конвейерная передача — это более эффективный способ, в котором следующий за- прос посылается до прибытия ответа на один или несколько предыдущих запросов (напоминает метод скользящего окна). Обычно по умолчанию степень параллелизма устанавливается на уровне 5-10, но у пользователя имеется возможность изменять этот параметр при конфигурировании клиента.&lt;br /&gt;
&lt;br /&gt;
В HTTP 1.1 по умолчанию применяются постоянные соединения и конвейерный режим.&lt;br /&gt;
&lt;br /&gt;
==== Таненбаум 5 издание ====&lt;br /&gt;
* 685 - 692 www, архитектура, клиентская часть, &lt;br /&gt;
* 695 - 698 серверная часть&lt;br /&gt;
* 724 - 727 http&lt;br /&gt;
* 731 - 733 кеширование&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Bluetooth&amp;diff=45276</id>
		<title>Bluetooth</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Bluetooth&amp;diff=45276"/>
				<updated>2015-04-03T12:13:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: Новая страница: «=== Описание === Беспроводная персональная сеть (PAN). Радиус действия приблизительно 100 метр...»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=== Описание ===&lt;br /&gt;
Беспроводная персональная сеть (PAN). Радиус действия приблизительно 100 метров (класс I). Название дано в честь датского короля. &lt;br /&gt;
Принцип действия основан на использовании радиоволн. Радиосвязь Bluetooth осуществляется в ISM-диапазоне (Industry, Science and Medicine), который используется в различных бытовых приборах и беспроводных сетях (свободный от лицензирования диапазон 2,4-2,4835 ГГц). В Bluetooth применяется метод расширения спектра со скачкообразной перестройкой частоты (англ. Frequency Hopping Spread Spectrum, FHSS). Метод FHSS прост в реализации, обеспечивает устойчивость к широкополосным помехам, а оборудование недорого.&lt;br /&gt;
&lt;br /&gt;
Протокол Bluetooth поддерживает не только соединение «point-to-point», но и соединение «point-to-multipoint».&lt;br /&gt;
&lt;br /&gt;
=== Алгоритм FHSS ===&lt;br /&gt;
Согласно алгоритму FHSS, в Bluetooth несущая частота сигнала скачкообразно меняется 1600 раз в секунду. Последовательность переключения между частотами для каждого соединения является псевдослучайной и известна только передатчику и приёмнику, которые каждые 625 мкс (один временной слот) синхронно перестраиваются с одной несущей частоты на другую. Таким образом, если рядом работают несколько пар приёмник-передатчик, то они не мешают друг другу. Этот алгоритм является также составной частью системы защиты конфиденциальности передаваемой информации: переход происходит по псевдослучайному алгоритму и определяется отдельно для каждого соединения. При передаче цифровых данных и аудиосигнала (64 кбит/с в обоих направлениях) используются различные схемы кодирования: аудиосигнал не повторяется (как правило), а цифровые данные в случае утери пакета информации будут переданы повторно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36335</id>
		<title>Пересечение прямоугольника с множеством прямоугольников (PST)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36335"/>
				<updated>2014-03-28T20:22:32Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Вычислительная геометрия]]&lt;br /&gt;
== Определение == &lt;br /&gt;
Priority Search Tree позволяет решать следующую задачу. Даны &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; точек, а также запросы. Каждый запрос характеризуется отрезком по одной координате &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt;, а также числом &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt; по другой координате. Для каждого запроса структура возвращает все точки, которые находятся в отрезке &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt; по одной координате, и имеют другую координату не больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;. На каждый запрос дерево отвечает за &amp;lt;tex&amp;gt;O(\log\,n + k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в ответе.&lt;br /&gt;
== Как строится? ==&lt;br /&gt;
Дерево строится рекурсивно. Выберем точку с наименьшей &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-координатой (если таких несколько, то из них выберем с наименьшим &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;). Все остальные точки отсортируем по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и разобьем на две равные (количество может отличаться на один) части. Далее будем считать, что все точки первой части имеют координату &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; меньше всех точек второй части (с одинаковыми &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; поступаем как обычно {{---}} сравниваем по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;). Для каждого из двух множеств, если оно не пусто, построим дерево рекурсивно.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
PST занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
|proof=&lt;br /&gt;
Каждая точка будет корнем ровно одного дерева. Количество деревьев не превышает количества точек. В сумме &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Максимальная глубина PST &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
При рекурсивном вызове количество точек уменьшается как минимум в два раза.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Построение PST работает за &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
|proof=&lt;br /&gt;
Необходимо отсортировать точки по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} для этого необходимо &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;. Построение каждого дерева требует &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в дереве, чтобы найти минимальную по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; точку, а также для построения новых списков точек для сыновей. На каждом уровне &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; точек, уровней &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;, значит, в сумме тоже &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
== Как отвечать на запрос? ==&lt;br /&gt;
Если &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; корня больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;, то никакие точки дерева не могут быть в ответе. Будем хранить также минимальную и максимальную по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; точки, которые лежат в поддереве. Тогда, если отрезок запроса по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с отрезком по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; всех точек поддерева, то также никакие точки из дерева не должны быть добавлены в ответ. Если корень дерева лежит в нужном интервале, добавим его в ответ. Вызовем рекурсивно поиск ответа для двух сыновей.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Будет получен правильный ответ на запрос.&lt;br /&gt;
|proof=&lt;br /&gt;
Вроде бы очевидно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Ответ на запрос работает за &amp;lt;tex&amp;gt;O(\log\,n+k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} размер ответа.&lt;br /&gt;
|proof=&lt;br /&gt;
Тут все сложнее. Представим, что мы ищем &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y_2&amp;lt;/tex&amp;gt; (из запроса) в PST как в обычном дереве поиска по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Рассмотрим все точки, которые лежат между двумя путями поиска. Среди них рассмотрим точки с &amp;lt;tex&amp;gt;x &amp;lt;= x_q&amp;lt;/tex&amp;gt;. Ровно эти точки и есть ответ. Разобьем все вершины на три группы. Первая {{---}} вершины, которые лежат хотя бы на одном из двух путей. Их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Вторая {{---}} вершины, которые находятся между двумя путями. Третья {{---}} все остальные. Время обработки вершин первой группы не превышает &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Как только мы зашли в вершину третей группы, сразу поймем, что отрезок по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с запросом и выйдем. А зайти в них мы можем только из вершин, которые лежат на двух путях (а их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;). Отлично! Зайдя в вершину второй группы, мы либо ее добавим в ответ и продолжим, либо выйдем, так как единственная причина, почему корень не подошел {{---}} его &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; слишком большой, а, значит, и все вершины поддерева не подходят. В итоге их обработка занимает &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;. В сумме все хорошо!&lt;br /&gt;
}}&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  struct PST &lt;br /&gt;
    point root&lt;br /&gt;
    point min_y, max_y&lt;br /&gt;
    PST *down, *up&lt;br /&gt;
&lt;br /&gt;
  // pts sorted by y&lt;br /&gt;
  PST * build_PST(vector&amp;lt;point&amp;gt; pts)&lt;br /&gt;
    if (pts.size() == 0)&lt;br /&gt;
      return NULL&lt;br /&gt;
    min_y = max_ y = root = min_element(pts) // by x&lt;br /&gt;
    remove_element(pts, root)&lt;br /&gt;
    int mid = pts.size() / 2&lt;br /&gt;
    vector&amp;lt;point&amp;gt; down_pts = pts[0..mid]&lt;br /&gt;
    vector&amp;lt;point&amp;gt; up_pts = pts[mid+1..pts.size() - 1]&lt;br /&gt;
    down = build_PST(down_pts)&lt;br /&gt;
    up = build_PST(up_pts)&lt;br /&gt;
    if (down != NULL)&lt;br /&gt;
      min_y = min(min_y, down-&amp;gt;min_y)&lt;br /&gt;
    if (up != NULL)&lt;br /&gt;
      max_y = max(max_y, up-&amp;gt;max_y)&lt;br /&gt;
&lt;br /&gt;
  void req(PST * tree, int y1, int y2, int x_max, vector&amp;lt;point&amp;gt; &amp;amp; ans)&lt;br /&gt;
    if (tree == NULL)&lt;br /&gt;
      return&lt;br /&gt;
    if (x_max &amp;lt; tree-&amp;gt;root.x)&lt;br /&gt;
      return&lt;br /&gt;
    if (y1 &amp;gt; tree-&amp;gt;max_y || y2 &amp;lt; tree-&amp;gt;min_y)&lt;br /&gt;
      return&lt;br /&gt;
    if (tree-&amp;gt;root in [y1..y2]x[-inf;x_max])&lt;br /&gt;
      answer.push_back(tree-&amp;gt;root)&lt;br /&gt;
    req(tree-&amp;gt;down, y1, y2, x_max, ans)&lt;br /&gt;
    req(tree-&amp;gt;up, y1, y2, x_max, ans)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Причем тут пересечение прямоугольника с множеством прямоугольников? ==&lt;br /&gt;
[[Файл:PSTVIEW.png|400px|thumb|left]]&lt;br /&gt;
Задача решается следующим образом. Будем находить ответ тремя разными способами, а их объединение и будет настоящим ответом. Будем считать, что объединение множеств можно делать за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} суммарное количество элементов в них. &lt;br /&gt;
&lt;br /&gt;
'''Первый способ.''' Найдем все прямоугольники, в которых прямоугольник из запроса лежит полностью. Для этого нужно решать такую задачу. Дано множество прямоугольников, для заданной точки найти все прямоугольники, в которых она лежит. Это точно можно решать за &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; с помощью двухмерного [[Дерево интервалов (interval_tree) и пересечение точки с множеством интервалов | дерева интервалов]]. А может можно и проще.&lt;br /&gt;
&lt;br /&gt;
'''Второй способ.''' Найдем все прямоугольники, которые полностью лежат внутри заданного в запросе. Для этого воспользуемся [[Перечисление_точек_в_произвольном_прямоугольнике_за_n_*_log_%5E(d_-_1)_n_(range_tree) | range tree]]. Просто для каждого прямоугольника добавим в range tree его левый верхний угол. Задав запрос в виде нашего прямоугольника, мы получим то, что и нужно. &lt;br /&gt;
&lt;br /&gt;
'''Третий способ.''' Найдем все прямоугольники, хотя бы одна сторона которого пересекает заданный в запросе. Для этого воспользуемся [[Пересечение_прямоугольника_с_множеством_непересекающихся_отрезков_(segment_tree) | деревом отрезков]]. В структуру добавим все стороны всех прямоугольников и зададим запрос в виде нашего прямоугольника.&lt;br /&gt;
&lt;br /&gt;
Утверждается, что все прямоугольники, которые нам нужны {{---}} объединение ответов, полученных тремя способами. Оценивать асимтотику всего этого мне совсем не хочется, но, наверное, это &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; времени на запрос. &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; памяти из-за range tree и &amp;lt;tex&amp;gt;O(n\log^2\,n)&amp;lt;/tex&amp;gt; на построение. Но, возможно, я что-то забыл или что-то можно сделать более эффективно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36334</id>
		<title>Пересечение прямоугольника с множеством прямоугольников (PST)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36334"/>
				<updated>2014-03-28T20:21:08Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Вычислительная геометрия]]&lt;br /&gt;
== Определение == &lt;br /&gt;
Priority Search Tree позволяет решать следующую задачу. Даны &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; точек, а также запросы. Каждый запрос характеризуется отрезком по одной координате &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt;, а также числом &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt; по другой координате. Для каждого запроса структура возвращает все точки, которые находятся в отрезке &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt; по одной координате, и имеют другую координату не больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;. На каждый запрос дерево отвечает за &amp;lt;tex&amp;gt;O(\log\,n + k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в ответе.&lt;br /&gt;
== Как строится? ==&lt;br /&gt;
Дерево строится рекурсивно. Выберем точку с наименьшей &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-координатой (если таких несколько, то из них выберем с наименьшим &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;). Все остальные точки отсортируем по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и разобьем на две равные (количество может отличаться на один) части. Далее будем считать, что все точки первой части имеют координату &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; меньше всех точек второй части (с одинаковыми &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; поступаем как обычно {{---}} сравниваем по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;). Для каждого из двух множеств, если оно не пусто, построим дерево рекурсивно.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
PST занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
|proof=&lt;br /&gt;
Каждая точка будет корнем ровно одного дерева. Количество деревьев не превышает количества точек. В сумме &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Максимальная глубина PST &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
При рекурсивном вызове количество точек уменьшается как минимум в два раза.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Построение PST работает за &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
|proof=&lt;br /&gt;
Необходимо отсортировать точки по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} для этого необходимо &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;. Построение каждого дерева требует &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в дереве, чтобы найти минимальную по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; точку, а также для построения новых списков точек для сыновей. На каждом уровне &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; точек, уровней &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;, значит, в сумме тоже &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
== Как отвечать на запрос? ==&lt;br /&gt;
Если &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; корня больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;, то никакие точки дерева не могут быть в ответе. Будем хранить также минимальную и максимальную по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; точки, которые лежат в поддереве. Тогда, если отрезок запроса по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с отрезком по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; всех точек поддерева, то также никакие точки из дерева не должны быть добавлены в ответ. Если корень дерева лежит в нужном интервале, добавим его в ответ. Вызовем рекурсивно поиск ответа для двух сыновей.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Будет получен правильный ответ на запрос.&lt;br /&gt;
|proof=&lt;br /&gt;
Вроде бы очевидно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Ответ на запрос работает за &amp;lt;tex&amp;gt;O(\log\,n+k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} размер ответа.&lt;br /&gt;
|proof=&lt;br /&gt;
Тут все сложнее. Представим, что мы ищем &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y_2&amp;lt;/tex&amp;gt; (из запроса) в PST как в обычном дереве поиска по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Рассмотрим все точки, которые лежат между двумя путями поиска. Среди них рассмотрим точки с &amp;lt;tex&amp;gt;x &amp;lt;= x_q&amp;lt;/tex&amp;gt;. Ровно эти точки и есть ответ. Разобьем все вершины на три группы. Первая {{---}} вершины, которые лежат хотя бы на одном из двух путей. Их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Вторая {{---}} вершины, которые находятся между двумя путями. Третья {{---}} все остальные. Время обработки вершин первой группы не превышает &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Как только мы зашли в вершину третей группы, сразу поймем, что отрезок по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с запросом и выйдем. А зайти в них мы можем только из вершин, которые лежат на двух путях (а их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;). Отлично! Зайдя в вершину второй группы, мы либо ее добавим в ответ и продолжим, либо выйдем, так как единственная причина, почему корень не подошел {{---}} его &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; слишком большой, а, значит, и все вершины поддерева не подходят. В итоге их обработка занимает &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;. В сумме все хорошо!&lt;br /&gt;
}}&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  struct PST &lt;br /&gt;
    point root&lt;br /&gt;
    point min_y, max_y&lt;br /&gt;
    PST *down, *up&lt;br /&gt;
&lt;br /&gt;
  // pts sorted by y&lt;br /&gt;
  PST * build_PST(vector&amp;lt;point&amp;gt; pts)&lt;br /&gt;
    if (pts.size() == 0)&lt;br /&gt;
      return NULL&lt;br /&gt;
    min_y = max_ y = root = min_element(pts) // by x&lt;br /&gt;
    remove_element(pts, root)&lt;br /&gt;
    int mid = pts.size() / 2&lt;br /&gt;
    vector&amp;lt;point&amp;gt; down_pts = pts[0..mid]&lt;br /&gt;
    vector&amp;lt;point&amp;gt; up_pts = pts[mid+1..pts.size() - 1]&lt;br /&gt;
    down = build_PST(down_pts)&lt;br /&gt;
    up = build_PST(up_pts)&lt;br /&gt;
    if (down != NULL)&lt;br /&gt;
      min_y = min(min_y, down-&amp;gt;min_y)&lt;br /&gt;
    if (up != NULL)&lt;br /&gt;
      max_y = max(max_y, up-&amp;gt;max_y)&lt;br /&gt;
&lt;br /&gt;
  void req(PST * tree, int y1, int y2, int x_max, vector&amp;lt;point&amp;gt; &amp;amp; ans)&lt;br /&gt;
    if (tree == NULL)&lt;br /&gt;
      return&lt;br /&gt;
    if (x_max &amp;lt; tree-&amp;gt;root.x)&lt;br /&gt;
      return&lt;br /&gt;
    if (y1 &amp;gt; tree-&amp;gt;max_y || y2 &amp;lt; tree-&amp;gt;min_y)&lt;br /&gt;
      return&lt;br /&gt;
    if (tree-&amp;gt;root in [y1..y2]x[-inf;x_max])&lt;br /&gt;
      answer.push_back(tree-&amp;gt;root)&lt;br /&gt;
    req(tree-&amp;gt;down, y1, y2, x_max, ans)&lt;br /&gt;
    req(tree-&amp;gt;up, y1, y2, x_max, ans)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Причем тут пересечение прямоугольника с множеством прямоугольников? ==&lt;br /&gt;
[[Файл:PSTVIEW.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
Задача решается следующим образом. Будем находить ответ тремя разными способами, а их объединение и будет настоящим ответом. Будем считать, что объединение множеств можно делать за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} суммарное количество элементов в них. &lt;br /&gt;
&lt;br /&gt;
'''Первый способ.''' Найдем все прямоугольники, в которых прямоугольник из запроса лежит полностью. Для этого нужно решать такую задачу. Дано множество прямоугольников, для заданной точки найти все прямоугольники, в которых она лежит. Это точно можно решать за &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; с помощью двухмерного [[Дерево интервалов (interval_tree) и пересечение точки с множеством интервалов | дерева интервалов]]. А может можно и проще.&lt;br /&gt;
&lt;br /&gt;
'''Второй способ.''' Найдем все прямоугольники, которые полностью лежат внутри заданного в запросе. Для этого воспользуемся [[Перечисление_точек_в_произвольном_прямоугольнике_за_n_*_log_%5E(d_-_1)_n_(range_tree) | range tree]]. Просто для каждого прямоугольника добавим в range tree его левый верхний угол. Задав запрос в виде нашего прямоугольника, мы получим то, что и нужно. &lt;br /&gt;
&lt;br /&gt;
'''Третий способ.''' Найдем все прямоугольники, хотя бы одна сторона которого пересекает заданный в запросе. Для этого воспользуемся [[Пересечение_прямоугольника_с_множеством_непересекающихся_отрезков_(segment_tree) | деревом отрезков]]. В структуру добавим все стороны всех прямоугольников и зададим запрос в виде нашего прямоугольника.&lt;br /&gt;
&lt;br /&gt;
Утверждается, что все прямоугольники, которые нам нужны {{---}} объединение ответов, полученных тремя способами. Оценивать асимтотику всего этого мне совсем не хочется, но, наверное, это &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; времени на запрос. &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; памяти из-за range tree и &amp;lt;tex&amp;gt;O(n\log^2\,n)&amp;lt;/tex&amp;gt; на построение. Но, возможно, я что-то забыл или что-то можно сделать более эффективно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSTVIEW.png&amp;diff=36333</id>
		<title>Файл:PSTVIEW.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSTVIEW.png&amp;diff=36333"/>
				<updated>2014-03-28T20:20:08Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36330</id>
		<title>Пересечение прямоугольника с множеством прямоугольников (PST)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%B0_%D1%81_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%BE%D0%BC_%D0%BF%D1%80%D1%8F%D0%BC%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PST)&amp;diff=36330"/>
				<updated>2014-03-28T20:14:05Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Категория: Вычислительная геометрия]]&lt;br /&gt;
== Определение == &lt;br /&gt;
Priority Search Tree позволяет решать следующую задачу. Даны &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; точек, а также запросы. Каждый запрос характеризуется отрезком по одной координате &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt;, а также числом &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt; по другой координате. Для каждого запроса структура возвращает все точки, которые находятся в отрезке &amp;lt;tex&amp;gt;[y_1, y_2]&amp;lt;/tex&amp;gt; по одной координате, и имеют другую координату не больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;. На каждый запрос дерево отвечает за &amp;lt;tex&amp;gt;O(\log\,n + k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в ответе.&lt;br /&gt;
== Как строится? ==&lt;br /&gt;
Дерево строится рекурсивно. Выберем точку с наименьшей &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;-координатой (если таких несколько, то из них выберем с наименьшим &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;). Все остальные точки отсортируем по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; и разобьем на две равные (количество может отличаться на один) части. Далее будем считать, что все точки первой части имеют координату &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; меньше всех точек второй части (с одинаковыми &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; поступаем как обычно {{---}} сравниваем по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;). Для каждого из двух множеств, если оно не пусто, построим дерево рекурсивно.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
PST занимает &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; памяти.&lt;br /&gt;
|proof=&lt;br /&gt;
Каждая точка будет корнем ровно одного дерева. Количество деревьев не превышает количества точек. В сумме &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Максимальная глубина PST &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
При рекурсивном вызове количество точек уменьшается как минимум в два раза.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Построение PST работает за &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; времени.&lt;br /&gt;
|proof=&lt;br /&gt;
Необходимо отсортировать точки по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; {{---}} для этого необходимо &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;. Построение каждого дерева требует &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} количество точек в дереве, чтобы найти минимальную по &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; точку, а также для построения новых списков точек для сыновей. На каждом уровне &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt; точек, уровней &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;, значит, в сумме тоже &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
== Как отвечать на запрос? ==&lt;br /&gt;
Если &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; корня больше &amp;lt;tex&amp;gt;x_q&amp;lt;/tex&amp;gt;, то никакие точки дерева не могут быть в ответе. Будем хранить также минимальную и максимальную по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; точки, которые лежат в поддереве. Тогда, если отрезок запроса по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с отрезком по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; всех точек поддерева, то также никакие точки из дерева не должны быть добавлены в ответ. Если корень дерева лежит в нужном интервале, добавим его в ответ. Вызовем рекурсивно поиск ответа для двух сыновей.&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Будет получен правильный ответ на запрос.&lt;br /&gt;
|proof=&lt;br /&gt;
Вроде бы очевидно.&lt;br /&gt;
}}&lt;br /&gt;
{{Теорема&lt;br /&gt;
|statement=&lt;br /&gt;
Ответ на запрос работает за &amp;lt;tex&amp;gt;O(\log\,n+k)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;k&amp;lt;/tex&amp;gt; {{---}} размер ответа.&lt;br /&gt;
|proof=&lt;br /&gt;
Тут все сложнее. Представим, что мы ищем &amp;lt;tex&amp;gt;y_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;y_2&amp;lt;/tex&amp;gt; (из запроса) в PST как в обычном дереве поиска по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt;. Рассмотрим все точки, которые лежат между двумя путями поиска. Среди них рассмотрим точки с &amp;lt;tex&amp;gt;x &amp;lt;= x_q&amp;lt;/tex&amp;gt;. Ровно эти точки и есть ответ. Разобьем все вершины на три группы. Первая {{---}} вершины, которые лежат хотя бы на одном из двух путей. Их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Вторая {{---}} вершины, которые находятся между двумя путями. Третья {{---}} все остальные. Время обработки вершин первой группы не превышает &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;. Как только мы зашли в вершину третей группы, сразу поймем, что отрезок по &amp;lt;tex&amp;gt;y&amp;lt;/tex&amp;gt; не пересекается с запросом и выйдем. А зайти в них мы можем только из вершин, которые лежат на двух путях (а их &amp;lt;tex&amp;gt;O(\log\,n)&amp;lt;/tex&amp;gt;). Отлично! Зайдя в вершину второй группы, мы либо ее добавим в ответ и продолжим, либо выйдем, так как единственная причина, почему корень не подошел {{---}} его &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; слишком большой, а, значит, и все вершины поддерева не подходят. В итоге их обработка занимает &amp;lt;tex&amp;gt;O(k)&amp;lt;/tex&amp;gt;. В сумме все хорошо!&lt;br /&gt;
}}&lt;br /&gt;
== Немного псевдокода ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  struct PST &lt;br /&gt;
    point root&lt;br /&gt;
    point min_y, max_y&lt;br /&gt;
    PST *down, *up&lt;br /&gt;
&lt;br /&gt;
  // pts sorted by y&lt;br /&gt;
  PST * build_PST(vector&amp;lt;point&amp;gt; pts)&lt;br /&gt;
    if (pts.size() == 0)&lt;br /&gt;
      return NULL&lt;br /&gt;
    min_y = max_ y = root = min_element(pts) // by x&lt;br /&gt;
    remove_element(pts, root)&lt;br /&gt;
    int mid = pts.size() / 2&lt;br /&gt;
    vector&amp;lt;point&amp;gt; down_pts = pts[0..mid]&lt;br /&gt;
    vector&amp;lt;point&amp;gt; up_pts = pts[mid+1..pts.size() - 1]&lt;br /&gt;
    down = build_PST(down_pts)&lt;br /&gt;
    up = build_PST(up_pts)&lt;br /&gt;
    if (down != NULL)&lt;br /&gt;
      min_y = min(min_y, down-&amp;gt;min_y)&lt;br /&gt;
    if (up != NULL)&lt;br /&gt;
      max_y = max(max_y, up-&amp;gt;max_y)&lt;br /&gt;
&lt;br /&gt;
  void req(PST * tree, int y1, int y2, int x_max, vector&amp;lt;point&amp;gt; &amp;amp; ans)&lt;br /&gt;
    if (tree == NULL)&lt;br /&gt;
      return&lt;br /&gt;
    if (x_max &amp;lt; tree-&amp;gt;root.x)&lt;br /&gt;
      return&lt;br /&gt;
    if (y1 &amp;gt; tree-&amp;gt;max_y || y2 &amp;lt; tree-&amp;gt;min_y)&lt;br /&gt;
      return&lt;br /&gt;
    if (tree-&amp;gt;root in [y1..y2]x[-inf;x_max])&lt;br /&gt;
      answer.push_back(tree-&amp;gt;root)&lt;br /&gt;
    req(tree-&amp;gt;down, y1, y2, x_max, ans)&lt;br /&gt;
    req(tree-&amp;gt;up, y1, y2, x_max, ans)&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Причем тут пересечение прямоугольника с множеством прямоугольников? ==&lt;br /&gt;
Задача решается следующим образом. Будем находить ответ тремя разными способами, а их объединение и будет настоящим ответом. Будем считать, что объединение множеств можно делать за &amp;lt;tex&amp;gt;O(n)&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; {{---}} суммарное количество элементов в них. &lt;br /&gt;
&lt;br /&gt;
'''Первый способ.''' Найдем все прямоугольники, в которых прямоугольник из запроса лежит полностью. Для этого нужно решать такую задачу. Дано множество прямоугольников, для заданной точки найти все прямоугольники, в которых она лежит. Это точно можно решать за &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; с помощью двухмерного [[Дерево интервалов (interval_tree) и пересечение точки с множеством интервалов | дерева интервалов]]. А может можно и проще.&lt;br /&gt;
&lt;br /&gt;
'''Второй способ.''' Найдем все прямоугольники, которые полностью лежат внутри заданного в запросе. Для этого воспользуемся [[Перечисление_точек_в_произвольном_прямоугольнике_за_n_*_log_%5E(d_-_1)_n_(range_tree) | range tree]]. Просто для каждого прямоугольника добавим в range tree его левый верхний угол. Задав запрос в виде нашего прямоугольника, мы получим то, что и нужно. &lt;br /&gt;
&lt;br /&gt;
'''Третий способ.''' Найдем все прямоугольники, хотя бы одна сторона которого пересекает заданный в запросе. Для этого воспользуемся [[Пересечение_прямоугольника_с_множеством_непересекающихся_отрезков_(segment_tree) | деревом отрезков]]. В структуру добавим все стороны всех прямоугольников и зададим запрос в виде нашего прямоугольника.&lt;br /&gt;
&lt;br /&gt;
Утверждается, что все прямоугольники, которые нам нужны {{---}} объединение ответов, полученных тремя способами. Оценивать асимтотику всего этого мне совсем не хочется, но, наверное, это &amp;lt;tex&amp;gt;O(\log^2\,n+answer)&amp;lt;/tex&amp;gt; времени на запрос. &amp;lt;tex&amp;gt;O(n\log\,n)&amp;lt;/tex&amp;gt; памяти из-за range tree и &amp;lt;tex&amp;gt;O(n\log^2\,n)&amp;lt;/tex&amp;gt; на построение. Но, возможно, я что-то забыл или что-то можно сделать более эффективно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36329</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36329"/>
				<updated>2014-03-28T20:13:38Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекают ребра из другого графа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
Во-первых, скопировать doubly­ connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф. Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить за &amp;lt;tex&amp;gt;O(n\ *\ log n\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая. По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36328</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36328"/>
				<updated>2014-03-28T19:43:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекают ребра из другого графа.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
Во-первых, скопировать doubly­ connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф. Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36327</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36327"/>
				<updated>2014-03-28T19:39:13Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
Во-первых, скопировать doubly­ connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф. Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36326</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36326"/>
				<updated>2014-03-28T19:38:41Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­ connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф. Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36325</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36325"/>
				<updated>2014-03-28T19:30:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф.&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
&lt;br /&gt;
Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36324</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36324"/>
				<updated>2014-03-28T19:29:32Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф.&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
&lt;br /&gt;
Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge e должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36323</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36323"/>
				<updated>2014-03-28T19:27:33Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф.&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
&lt;br /&gt;
Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;е&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36322</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36322"/>
				<updated>2014-03-28T19:25:02Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф.&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
&lt;br /&gt;
Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;е&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;е&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36321</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36321"/>
				<updated>2014-03-28T19:16:34Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
===Формально===&lt;br /&gt;
&lt;br /&gt;
Определим объединение двух pslg &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, чтобы получился граф &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, такой, что существует &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, тогда и только тогда есть &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; f1 и f2 в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; соответственно, что &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; является максимально связанным подмножеством &amp;lt;tex&amp;gt;f1 \cap f2&amp;lt;/tex&amp;gt;. Требуется чтобы каждый &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; был отмечен с помощью label of the &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, который содержит их. Таким образом мы получаем доступ к информации хранящейся на этих &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
&lt;br /&gt;
====Первоначальное слияние====&lt;br /&gt;
&lt;br /&gt;
Для начала посмотрим, как можно больше информации от doubly connected edge lists для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; мы можем повторно использовать в doubly connected edge lists для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Рассмотрим сеть ребер и вершин S1. Эта сеть разделена на кусочки краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Эти кусочки в большинстве своем могут использоваться повторно, все, за исключением тех, которые отделены краями &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Такие нужно обновлять. Если ориентация &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; изменится, нам придется менять информацию в этих записях. Половинки ребра ориентированы таким образом, что &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, которым они связаны лежит слева; форма &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; может изменяться в наложении, но он будет оставаться в той же стороне &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;. Следовательно, мы можем повторно использовать &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records, соответствующие краям, которые не пересекаются ребра из другой карты. Иными словами, есть только &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; records в &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, которые мы не можем заимствовать из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; или &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, ими являются те, которые попадают на пересечение между краями из разных карт.&lt;br /&gt;
Это предлагает следующие подходы. Во-первых, скопировать doubly­connected edge lists &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; в один новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Новый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; не является допустимым &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, т.к. он еще не представляет собой плоский подграф.&lt;br /&gt;
&lt;br /&gt;
====Объединения графов====&lt;br /&gt;
&lt;br /&gt;
Это задача алгоритма заметающей прямой: он должен трансформировать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; в допустимый &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; путем вычисления пересечения между двумя сетями ребер, и связывая воедино соответствующие части из двух &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;. Мы применяем этот алгоритм на множестве сегментов, что является объединением множеств ребер двух подграфов &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. Напомним, что алгоритм поддерживается двумя структурами данных: очереди событий &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, в котором хранятся точки событий, и структура состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt;, которой является бинарное дерево храненящее сегменты, пересекающие линии развертки, расположенные слева направо. Мы теперь также должны поддерживать &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. Первоначально &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; содержит копию &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;. В плоскости развертки преобразуем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; к правильному &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Мы держим перекрестные указатели между ребер в структуре состояния &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и половина текущих записей в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которые соответствуют им. Таким образом мы можем получить доступ к части &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, которая должна быть изменена, когда мы сталкиваемся с точкой пересечения. &lt;br /&gt;
&lt;br /&gt;
В другом случае, мы поддерживаем то, что в любое время в течение развертки, часть выше линии развертки наложения будет считаться правильной. Теперь что мы должны делать, когда мы достигнем точки событий. Прежде всего, мы обновляем &amp;lt;tex&amp;gt;T&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Q&amp;lt;/tex&amp;gt;, как и в алгоритме заметающей прямой. Если событие включает в себя только ребра из одного из двух подграфов, это все, точка событие является вершиной, которые могут быть использованы повторно. Если событие включает края с двух подграфов, мы должны сделать локальные изменения в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; -- связать doubly­ connected edge list двух оригинальных подграфов в точке пересечения.&lt;br /&gt;
&lt;br /&gt;
Рассмотри один из 2 возможных случаев, а именно, когда edge &amp;lt;tex&amp;gt;е&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; проходит через вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, (см. Рисунок) edge &amp;lt;tex&amp;gt;е&amp;lt;/tex&amp;gt; должно быть заменено двумя edges обозначим &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. В &amp;lt;tex&amp;gt;DCEL&amp;lt;/tex&amp;gt;, два &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е должны превратиться в четыре. Мы создаем два новых &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, с &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в нуле. Два существующих &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для е содержат конечные точки &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;, как их происхождения. Тогда мы объединяем попарно существующие &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; с новыми &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, устанавливая их указатели twin'ов. Так &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; представлен одним новым и одним существующим частично edge, и то же самое для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. Теперь мы должны установить ряд &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt;. &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; двух новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; являются копией &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; старого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;, не имеющего пары. В &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, в которые эти указатели точки должны обновлять свои &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; и установливать его на новых &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;. Далее мы должны установить &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; представляющих &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;, и из четырех &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; инциденого &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Мы размещаем эти четыре &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, проверяя, где &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt; должны быть в циклическом порядке вершин вокруг вершины &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Есть четыре пары &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt;, которые связанны между собой &amp;lt;tex&amp;gt;Next&amp;lt;/tex&amp;gt; с одним и &amp;lt;tex&amp;gt;Prev&amp;lt;/tex&amp;gt; с другим. &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; должен быть привязан к первому &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; по часовой стрелке с началом в &amp;lt;tex&amp;gt;v.&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;e'&amp;lt;/tex&amp;gt; с началом в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; должен быть связан с первым против часовой стрелки &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; с окончанием в &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Точно также и для &amp;lt;tex&amp;gt;e''&amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
====Время работы объединения====&lt;br /&gt;
&lt;br /&gt;
Большинство из шагов в приведенном выше описании принимать только константное время. Есть случаи на которые потребуется дополнительное время, О(M), где M­число ребер, точки событий. Это означает, что обновление &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; не увеличивает время работы алгоритма заметащей прямой асимптотически. Любое пересечение, которое мы находим является вершиной наложения. Из этого следует, что вершина record и &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; record doubly­ connected edge list для &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; можно вычислить в &amp;lt;tex&amp;gt;O(N\ *\ log N\ +\ k\ *\ log\ n)&amp;lt;/tex&amp;gt; время, где &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; обозначает сумму сложностей &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, а k является сложностью наложения.&lt;br /&gt;
&lt;br /&gt;
====Воссоздание &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt;====&lt;br /&gt;
После того, как все сделано, осталось вычислить информацию о &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;. Точнее, мы должны создать &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; record для каждого &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; е в &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt;, мы должны сделать &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt;) указывают на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на внешней границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, и мы должны сделать список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;) из указателей на &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на связанных областях пробелов внутри &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Кроме того, мы должны установить &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; () поля времени &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; на границе &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt; так, что они указывают на лицевые записи &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Наконец, каждый из новых &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; должны быть помечены именами &amp;lt;tex&amp;gt;faces&amp;lt;/tex&amp;gt; в старых подграфах, которые содержат его. Рассмотрим два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; цикла, свойственных &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Т.к. мы знаем, что incident &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; лежит слева, мы можем вычислить угол который эти два &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; образуют внутри &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Если этот угол f меньше, чем 180◦ то циклом является внешняя граница, и в противном случае это граница дыры. Это свойство имеет место для левой вершины цикла, но не обязательно для других вершин этого цикла.&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Напомним, что в алгоритме развертки плоскости для отрезка пересечения мы всегда искали сегменты сразу слева от точки событий. (Они должны были быть проверены на пересечении с крайнего левого края через точку событий.) Таким образом, информация, при помощи которой мы должны построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; определяется в плоскости развертки. Таким образом, чтобы построить &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, мы сначала делаем узел для каждого цикла. Чтобы найти дуги &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, рассмотрим левую вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; для каждого цикла, ограничивающую отверстие. Если &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; сразу же выходит из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt;, то мы добавляем дугу между двумя узлами в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющих цикл, содержащий  е и цикл у которого &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; является самой левой вершиной. Чтобы найти эти узлы в &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; мы должны указатели от каждого &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; записать в узел &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, представляющего цикл этот. Так информация o &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в doubly­connected edge list может быть установлена в &amp;lt;tex&amp;gt;О(n\ +\ k)&amp;lt;/tex&amp;gt; времени, после плоскости развертки. Каждая грань &amp;lt;tex&amp;gt;e&amp;lt;/tex&amp;gt; в наложении должна быть помечена с именами &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; в старых графах, которые содержали его. Чтобы найти эти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;, надо рассмотреть произвольную вершину &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; является пересечением &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;е2&amp;lt;/tex&amp;gt; от &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, то мы можем решить, какие &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; содержат &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, глядя на &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; указатель соответствующих &amp;lt;tex&amp;gt;half-edges&amp;lt;/tex&amp;gt; соответствующих &amp;lt;tex&amp;gt;e1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;e2&amp;lt;/tex&amp;gt;. Если &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt; не пересечение, но вершина, скажем, S1, то мы знаем только &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; S1, содержащей &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Чтобы найти &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; , содержащий &amp;lt;tex&amp;gt;F&amp;lt;/tex&amp;gt;, мы должны определить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt;, которое содержит &amp;lt;tex&amp;gt;v&amp;lt;/tex&amp;gt;. Другими словами, если бы мы знали для каждой вершины &amp;lt;tex&amp;gt;S1&amp;lt;/tex&amp;gt;, в котором &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;S2&amp;lt;/tex&amp;gt; находился, и наоборот, то мы могли бы обозначить &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; &amp;lt;tex&amp;gt;O(S1, S2)&amp;lt;/tex&amp;gt; правильно.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Итог==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG2.png&amp;diff=36320</id>
		<title>Файл:PSLG2.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG2.png&amp;diff=36320"/>
				<updated>2014-03-28T19:13:40Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: загружена новая версия «Файл:PSLG2.png»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36240</id>
		<title>ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36240"/>
				<updated>2014-03-10T18:38:04Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Файл:DCEL.png|400px|thumb|left|Представление плоского графа с помощью РСДС]]&lt;br /&gt;
[[Файл:DCEL2.png|200px|thumb|right|Плоский граф, ребрам которого придана произвольная ориентация для представления его с помощью РСДС. Стрелки вокруг вершин соответствуют указателям (P1, P2)]]&lt;br /&gt;
[[Файл:DCEL3.png|200px|thumb|right|(а) РСДС, (б) входы по вершинам head_V [1..n] и (в) входы по граням head_F[1..l]]]&lt;br /&gt;
&lt;br /&gt;
'''ППЛГ''' {{---}} Плоский прямолинейный граф.&lt;br /&gt;
&lt;br /&gt;
'''РСДС''' {{---}} Реберный список с двойными связями.&lt;br /&gt;
&lt;br /&gt;
==ППЛГ==&lt;br /&gt;
[[Укладка графа на плоскости|Планарный граф]], уложенный на плоскости, принято называть ''плоским''.&lt;br /&gt;
'''Плоская укладка планарного графа''' &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;  {{---}} это отображение каждой вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в точку на плоскости, а каждого ребра из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; в простую линию, соединяющую пару образов концевых вершин этого ребра так, чтобы образы ребер пересекались только в своих концевых точках. Хорошо известно, что любой планарный граф можно уложить на плоскости так, чтобы все ребра отобразились в прямолинейные отрезки.&lt;br /&gt;
&lt;br /&gt;
==РСДС==&lt;br /&gt;
===Формальное описание===&lt;br /&gt;
Реберный список с двойными связями особенно удобен для представления ППЛГ.&lt;br /&gt;
Пусть задан граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V = \{v_1, v_2... v_n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E = \{e_1, e_2... e_n\}&amp;lt;/tex&amp;gt;. Главная компонента РСДС для планарного графа это ''реберный узел''. Между ребрами графа и реберными узлами РСДС существует взаимно однозначное соответствие, т.е. каждое ребро представлено в РСДС ровно один раз. Реберный узел РСДС, соответствующий ребру графа, например, &amp;lt;tex&amp;gt;e_k = \{v_1, v_2\} &amp;lt;/tex&amp;gt; имеет 4 поля (&amp;lt;tex&amp;gt;V1, V2, F1, F2&amp;lt;/tex&amp;gt;) и 2 указателя (&amp;lt;tex&amp;gt;P1, P2&amp;lt;/tex&amp;gt;). Поле &amp;lt;tex&amp;gt;V1&amp;lt;/tex&amp;gt; содержит начало ребра, а поле &amp;lt;tex&amp;gt;V2&amp;lt;/tex&amp;gt; содержит его конец (так изначально неориентированное ребро получает условную ориентацию). Поля &amp;lt;tex&amp;gt;F1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F2&amp;lt;/tex&amp;gt; содержат имена граней, лежащих слева и справа от ориентированного ребра (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;). Указатель &amp;lt;tex&amp;gt;P1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;P2&amp;lt;/tex&amp;gt;) задает реберный узел, содержащий первое ребро, встречаемое вслед за ребром (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;), при повороте от него против часовой стрелки вокруг &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:DCEL4.png|300px|thumb|right|Ко второму описанию]]&lt;br /&gt;
===Неформальное описание===&lt;br /&gt;
РСДС состоит из 3 компонент:&lt;br /&gt;
*''Vertex'' {{---}} это точка сочленения. Содержит координаты точки. А также указатель на инцидентное ребро.&lt;br /&gt;
*''Face'' {{---}} содержит указатель на наружную компоненту (некоторое ребро на его границе). Для неограниченных поверхностей это nil. Так же содержит внутреннюю компоненту, которая есть указатель на некое ребро, с которого можно начать описывать внутреннюю область (опять же, может быть nil).&lt;br /&gt;
*''Half-edge'' {{---}} это ребро. Содержит указатели на точку, откуда исходит (origin), указатель на ребро близнец (twin)(направленное в другую сторону), инцидентную поверхность (incident_face), и указатели на следующее и предыдущие ребра.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct vertex {&lt;br /&gt;
    x, y;&lt;br /&gt;
    half_edge *rep;  /* rep-&amp;gt;origin == this */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct face {&lt;br /&gt;
    outer_component *out;&lt;br /&gt;
    inner_components *in; (список какой-нибудь)&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct half_edge {&lt;br /&gt;
    half_edge *prev;     /* prev-&amp;gt;next == this */&lt;br /&gt;
    half_edge *next;     /* next-&amp;gt;prev == this */&lt;br /&gt;
    half_edge *twin;     /* twin-&amp;gt;twin == this */&lt;br /&gt;
    vertex *origin;      /* twin-&amp;gt;next-&amp;gt;origin == origin &amp;amp;&amp;amp;&lt;br /&gt;
                            prev-&amp;gt;twin-&amp;gt;origin == origin */&lt;br /&gt;
    face *incident_face; /* prev-&amp;gt;incident_face == incident_face &amp;amp;&amp;amp; &lt;br /&gt;
                            next-&amp;gt;incident_face == incident_face */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Построение РСДС множества прямых==&lt;br /&gt;
{|align=&amp;quot;right&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|[[Файл:before.png|200px|thumb|right|Было]]&lt;br /&gt;
|[[Файл:next.png|400px|thumb|right|Добавляем жирную прямую. [a+b] это ребро, которое было в начальном face]]&lt;br /&gt;
|}&lt;br /&gt;
У нас есть множество прямых. Мы хотим представить это множество в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Будем добавлять прямые по одной. Изначально у нас есть фэйс, который представляет собой всю плоскость. Алгоритм будет такой:&lt;br /&gt;
* Локализовать рандомную точку прямой в face&lt;br /&gt;
* Найти half-edge'и, которые пересекает эта прямая(их будет не больше 2, если считать пересечение в точке за одно ребро)&lt;br /&gt;
* Разбить текущий face на два face1 и face2&lt;br /&gt;
** Если пересечение не в точке, разбиваем ребра на два {{---}} a, b и c, d, так как пересечения два&lt;br /&gt;
** Создаем два half-edge {{---}} отрезок прямой, попадающий в фэйс&lt;br /&gt;
** Перекидываем ссылки этих half-edgeй как надо&lt;br /&gt;
** Не забываем поменять у half-edgeй исходного face поле incident_face на face1 и face2 соответственно&lt;br /&gt;
* Мы знаем куда(в какие фэйсы {{---}} edge-&amp;gt;twin-&amp;gt;incident_face) пошла наша прямая. Запускаемся от них и разбиваем их аналогично. Если пересечение было в точке, перебираем faceы(next_face = edge-&amp;gt;prev-&amp;gt;twin-&amp;gt;incident_face), пока не найдем нужный. Если фэйс бесконечный {{---}} идем только в одну сторону&lt;br /&gt;
&lt;br /&gt;
Вот эти ссылки надо не забыть поменять:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
half_edge1-&amp;gt;origin = A;&lt;br /&gt;
half_edge2-&amp;gt;origin = B;&lt;br /&gt;
&lt;br /&gt;
half_edge1-&amp;gt;twin = half_edge2;&lt;br /&gt;
half_edge2-&amp;gt;twin = half_edge1;&lt;br /&gt;
half_edge1-&amp;gt;incident_face = face1;&lt;br /&gt;
half_edge2-&amp;gt;incident_face = face2;&lt;br /&gt;
&lt;br /&gt;
half_edge1-&amp;gt;next = b;&lt;br /&gt;
b-&amp;gt;prev = half_edge1;&lt;br /&gt;
half_edge1-&amp;gt;prev = d;&lt;br /&gt;
d-&amp;gt;next = half_edge1;&lt;br /&gt;
&lt;br /&gt;
half_edge2-&amp;gt;next = c;&lt;br /&gt;
c-&amp;gt;prev = half_edge2;&lt;br /&gt;
half_edge2-&amp;gt;prev = a;&lt;br /&gt;
a-&amp;gt;next = half_edge2;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==См. также==&lt;br /&gt;
[http://cs.stackexchange.com/a/18167 Источник.]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36155</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=36155"/>
				<updated>2014-02-21T20:29:31Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Input &amp;lt;tex&amp;gt;\Rightarrow&amp;lt;/tex&amp;gt; Output]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Постановка задачи==&lt;br /&gt;
Даны два [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|ППЛГ]], требуется построить их объединение в виде [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]]. При этом создав новые &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt; и обновив старые.&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)''' &amp;lt;tex&amp;gt;:&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;, то есть строим из него [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]].&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный [[ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых|РСДС]], но без информации о &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'ах.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;. То есть обновляем этот граф. Пока только добавляя в него ребра (&amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt;'ы соответственно).&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt; (о нем ниже), в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры (&amp;lt;tex&amp;gt;hole&amp;lt;/tex&amp;gt;, это внутренний цикл &amp;lt;tex&amp;gt;face&amp;lt;/tex&amp;gt;'a), а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
5.1. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем &amp;lt;tex&amp;gt;outer\_component&amp;lt;/tex&amp;gt; в какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список &amp;lt;tex&amp;gt;inner\_components&amp;lt;/tex&amp;gt;, состоящий из указателей на какой-нибудь &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; из каждого цикла. А так же пусть &amp;lt;tex&amp;gt;incident\_face&amp;lt;/tex&amp;gt; в каждом &amp;lt;tex&amp;gt;half-edge&amp;lt;/tex&amp;gt; будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
*'''Копирование РСДС'''&lt;br /&gt;
Просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
*'''Как из пересечения ребер сделать новую компоненту РСДС'''&lt;br /&gt;
См рисунок.&lt;br /&gt;
&lt;br /&gt;
*'''Сколько будет faces?'''&lt;br /&gt;
Столько же, сколько &amp;lt;tex&amp;gt;outer\_boudaries&amp;lt;/tex&amp;gt; + 1.&lt;br /&gt;
&lt;br /&gt;
*'''Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем?''' &lt;br /&gt;
Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
*'''Что за граф и для чего он нужен? (Граф &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; из 5 пункта)'''&lt;br /&gt;
См рисунок. Из него мы сможем понять, какие циклы принадлежат одному и тому же face. Например, в рисунке мы видим, что C2, C3 и C6 являются циклами одного face. Из предыдущего вопроса мы понимаем, что C2 есть внешняя граница.&lt;br /&gt;
&lt;br /&gt;
Подробнее:&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|about=&lt;br /&gt;
К предыдущему вопросу&lt;br /&gt;
|statement=&lt;br /&gt;
Каждая компонента графа отвечает за множество циклов инцидентных одному face.&lt;br /&gt;
|proof= Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в face &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же face. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
*'''Как построить этот граф?'''&lt;br /&gt;
Вспоминаем, что во время работы алгоритма заметающей прямой, мы смотрели на отрезки левее от event point. Из этого получаем, что информацию для постройки нашего графа мы получаем из этого алгоритма. То есть для начала мы делаем узел для каждого цикла, затем для создания ребер мы смотри на самые левые вершины циклов. Если есть half-edge слева от вершины, то создаем ребро между циклами (в котором вершина и в котором half-edge).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Visibility_graph_%D0%B8_motion_planning&amp;diff=36119</id>
		<title>Visibility graph и motion planning</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Visibility_graph_%D0%B8_motion_planning&amp;diff=36119"/>
				<updated>2014-02-14T10:57:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Visibility graph */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ВНИМАНИЕ!!!''' Данная статья написана исключительно по-пацански и обладает повышенной чёткостью.&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/199256/ Здесь написано примерно всё по теме и достаточно понятно]&lt;br /&gt;
&lt;br /&gt;
== Visibility graph ==&lt;br /&gt;
[[Файл:trap.png|200px|thumb|left|Путь с препятствиями через трапецоидную карту]]&lt;br /&gt;
[[Файл:notShort.png|300px|thumb|right|Такой путь не самый короткий]]&lt;br /&gt;
&lt;br /&gt;
В общем, когда мы ищем путь от точки &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с препятствиями (надо уточнить, что двигаем мы точку, а не какой-то полигон), можно построить [[Трапецоидная карта | трапецоидную карту]], соединить ребрами середины вертикальных сторон с центрами трапецоидов и в этом графе [[Алгоритм Дейкстры | Дейкстрой]] найти путь от &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. Но этот путь не будет кратчайшим(кэп).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Любой кратчайший путь от &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с полигональными препятствиями представляет собой ломаную, вершины которой {{---}} вершины полигонов.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:short.png|150px|thumb|right|Ну в общем тут все очевидно]]&lt;br /&gt;
Пусть путь проходит(в смысле вершины) через какую-то другую точку. Рассмотрим окрестность этой точки. По неравенству треугольника мы сможем немножко, да срезать. Значит этот путь не кратчайший. Противоречие, значит лемма доказана и все офигенно.&lt;br /&gt;
}}&lt;br /&gt;
Так же, что бы уменьшить объем финального графа, следует удалить из него ребра, по которым точно не пройдет путь.&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Если у ребра на предыдущю точку от данной левый поворот, а на следующую, от данной, правый - то ребро, идущее к текущей точке может быть удалено.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:edgeToDelete.jpg|150px|thumb|right|Удаляем &amp;lt;tex&amp;gt;BD&amp;lt;/tex&amp;gt;]]&lt;br /&gt;
Очевидно, что путь проходящий через ребро &amp;lt;tex&amp;gt;BD&amp;lt;/tex&amp;gt; будет длинее, чем через соседей точки &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;. Тк по неравенству треугольника &amp;lt;tex&amp;gt;AB + BD&amp;lt;/tex&amp;gt; &amp;lt; &amp;lt;tex&amp;gt;AD&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
По этому сосздадим visibility graph. Его вершины {{---}} вершины полигонов. Между вершинами &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; существует ребро, если из &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; &amp;lt;i&amp;gt; видна &amp;lt;/i&amp;gt;(mutually visible) &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; (ребра полигонов тоже входят в этот граф). Теперь, если мы добавим к множеству вершин &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; (и ребра в видимые вершины), у нас получится граф, в котором опять же Дейкстрой находим кратчайший путь. По лемме любое ребро кратчайшего пути {{---}} ребро visibility графа, так что мы нашли то, что нужно. &lt;br /&gt;
&lt;br /&gt;
=== Построение visibility графа ===&lt;br /&gt;
==== Наивный алгоритм. &amp;lt;tex&amp;gt; O(n ^ 3) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
Если делать наивно, т. е. для каждой пары вершин проверять можно ли добавить ли такое ребро(нет ли пересечений с полигонами), будет &amp;lt;tex&amp;gt; O(n^3) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:search.png|400px|thumb|right|Дерево поиска пересекаемых ребер]]&lt;br /&gt;
&lt;br /&gt;
==== Lee’s Algorithm. &amp;lt;tex&amp;gt; O(n ^ 2 \log n) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
[[Файл:zam.png|400px|thumb|left|Заметание плоскости вращающимся лучом]]&lt;br /&gt;
[[Файл:zamrefr1.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
[[Файл:zamrefr2.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
[[Файл:zamrefr3.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
Однако можно это сделать за &amp;lt;tex&amp;gt; O(n ^ 2 \log  n) &amp;lt;/tex&amp;gt;. Для каждой вершины найдём все видимые из неё вершины при помощи метода плоского заметания. Нам нужно решить следующую задачу: на плоскости дано множество отрезков (рёбер препятствий) и точка &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Найти все концы отрезков, видимые из точки &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Будем заметать плоскость вращающимся лучом с началом в точке &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Статусом заметающей прямой будет отрезки, которые её пересекают, упорядоченные по возрастанию расстояния от точки &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; до точки пересечения. Точками событий будут концы отрезков. Итак, первым делом вершины &amp;lt;tex&amp;gt; w \in W &amp;lt;/tex&amp;gt; сортируются по углу между лучом &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt; и вертикальной полуосью, проходящей через &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Затем происходит инициализация множества видимых вершин (по умолчанию, такое множество пустое). Далее начинается заметание плоскости. В порядке сортировки вершин для каждой из них выполняется проверка: видна ли вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Поскольку такая проверка означает наличие пересечений, которые хранятся в сбалансированном дереве, она может быть выполнена за &amp;lt;tex&amp;gt; O(\log n) &amp;lt;/tex&amp;gt;. Если вершина видима, необходимо добавить её в список видимых вершин. И, наконец, вне зависимости от видимости вершины, необходимо изменить статус заметающей прямой. Для этого, для текущей вершины &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; необходимо удалить из списка текущих пересечений все рёбра (отрезки), которые заканчиваются в этой вершине (лежат слева от прямой &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt;) и добавить все рёбра (отрезки), которые в ней начинаются (лежат справа от прямой &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вершин у нас &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt;, сортим за &amp;lt;tex&amp;gt; O(n \log n) &amp;lt;/tex&amp;gt; плюс запросы в дереве за &amp;lt;tex&amp;gt; O(n) * O(\log n) &amp;lt;/tex&amp;gt;. Итого что хотели.&lt;br /&gt;
&lt;br /&gt;
==== Overmars and Welzl’s Algorithm &amp;lt;tex&amp;gt; O(n ^ 2) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
[http://igitur-archive.library.uu.nl/math/2006-1214-201604/overmars_88_new_methods.pdf visibility graph при помощи rotation tree]&lt;br /&gt;
&lt;br /&gt;
Ковалев сказал что это можно рассказывать по желанию.&lt;br /&gt;
&lt;br /&gt;
Каким-то магическим образом, можно избавиться и от логарифма в асимптотике. Это делается с помощью [http://bit.ly/1eEqTzk rotation tree]. Про него рассказывал Антон Ков., но как-то мутно и не очень понятно. Суть такова, что мы обходим вершины в таком хитром порядке, что почти не просматриваем лишнее и получаем асимптотику {{---}} квадрат.&lt;br /&gt;
&lt;br /&gt;
Короче тут мы делаем то же самое, что и н2логн, только сортим не для каждой вершины отдельно, а рассматриваем все одновременно. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;The idea is simple: for each vertex, a scanline is kept which runs from &amp;lt;tex&amp;gt; -\pi / 2 &amp;lt;/tex&amp;gt; to &amp;lt;tex&amp;gt; \pi / 2 &amp;lt;/tex&amp;gt; hopping from vertex to vertex in its path. During the main loop, it appears that all of the scanlines are proceeding simultaneously. In fact, there are exact rules about determining the next vertex to process, and some vertices may finish their scan before others. To understand the rules about finding the next vertex, the rotation tree must be understood. A rotation tree is a rooted planar tree where each vertex is a node and points to its parent. There are two special nodes: &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt;. Initially, all vertices point to &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt; as their parent and &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt; points to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;. Also stored is the rightmost child (if a node is a parent), and its right and left siblings (if they exist). The ordering of children is by slope: the one with the smallest slope is the leftmost. The loop that examines all pairs simply takes the rightmost leftmost leaf as the next segment to process and then reattaches it to the tree (while maintaining the property of being a rotation tree). It can reattach to the left of its parent or to the tangent of the chain above it. When a vertex attaches to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, it is finished. The loop continues when all points have attached to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
/*мне лень это переводить, и так понятно/непонятно*/&lt;br /&gt;
&lt;br /&gt;
== Motion planning ==&lt;br /&gt;
[[Файл:mink.png|200px|thumb|left|Раздуваем препятствия]]&lt;br /&gt;
[[Файл:mink2.png|400px|thumb|right|Логично же]]&lt;br /&gt;
В общем тут все очевидно. Тут мы просто двигаем не точку, а произвольный выпуклый полигон. Если мы его не можем вращать, просто &amp;quot;обводим&amp;quot;  препятствия нашим полигоном (запиливаем [[Сумма Минковского (определение, вычисление)|сумму Минковского]] препятствий и полигона, сдвинутого в начало координат какой-нибудь точкой) и получаем другие препятствия, но зато теперь мы двигаем точку. А это мы уже научились делать выше.&lt;br /&gt;
&lt;br /&gt;
Если же этот полигон можно вращать, то делаем примерно то же самое, только как-то по-хитрому. Нам про это, кажется, не рассказывали(или рассказывали так же:))&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars (2008), Computational Geometry: Algorithms and Applications (3rd edition), Springer-Verlag, ISBN 978-3-540-77973-5 Chapter 15 page 324-331&lt;br /&gt;
* [http://www.academia.edu/2845047/3D_Visibility_Graph not_bad.jpg статья про visibility graphs]&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:EdgeToDelete.jpg&amp;diff=36118</id>
		<title>Файл:EdgeToDelete.jpg</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:EdgeToDelete.jpg&amp;diff=36118"/>
				<updated>2014-02-14T10:48:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=Visibility_graph_%D0%B8_motion_planning&amp;diff=36117</id>
		<title>Visibility graph и motion planning</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=Visibility_graph_%D0%B8_motion_planning&amp;diff=36117"/>
				<updated>2014-02-14T10:35:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Наивный алгоритм.  O(n ^ 3)  */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''ВНИМАНИЕ!!!''' Данная статья написана исключительно по-пацански и обладает повышенной чёткостью.&lt;br /&gt;
&lt;br /&gt;
[http://habrahabr.ru/post/199256/ Здесь написано примерно всё по теме и достаточно понятно]&lt;br /&gt;
&lt;br /&gt;
== Visibility graph ==&lt;br /&gt;
[[Файл:trap.png|200px|thumb|left|Путь с препятствиями через трапецоидную карту]]&lt;br /&gt;
[[Файл:notShort.png|300px|thumb|right|Такой путь не самый короткий]]&lt;br /&gt;
&lt;br /&gt;
В общем, когда мы ищем путь от точки &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с препятствиями (надо уточнить, что двигаем мы точку, а не какой-то полигон), можно построить [[Трапецоидная карта | трапецоидную карту]], соединить ребрами середины вертикальных сторон с центрами трапецоидов и в этом графе [[Алгоритм Дейкстры | Дейкстрой]] найти путь от &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt;. Но этот путь не будет кратчайшим(кэп).&lt;br /&gt;
&lt;br /&gt;
{{Лемма&lt;br /&gt;
|statement=&lt;br /&gt;
Любой кратчайший путь от &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; до &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; с полигональными препятствиями представляет собой ломаную, вершины которой {{---}} вершины полигонов.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Файл:short.png|150px|thumb|right|Ну в общем тут все очевидно]]&lt;br /&gt;
Пусть путь проходит(в смысле вершины) через какую-то другую точку. Рассмотрим окрестность этой точки. По неравенству треугольника мы сможем немножко, да срезать. Значит этот путь не кратчайший. Противоречие, значит лемма доказана и все офигенно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
По этой лемме запилим visibility graph. Его вершины {{---}} вершины полигонов. Между вершинами &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; существует ребро, если из &amp;lt;tex&amp;gt; u &amp;lt;/tex&amp;gt; &amp;lt;i&amp;gt; видна &amp;lt;/i&amp;gt;(mutually visible) &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt; (ребра полигонов тоже входят в этот граф). Теперь, если мы добавим к множеству вершин &amp;lt;tex&amp;gt; S &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; T &amp;lt;/tex&amp;gt; (и ребра в видимые вершины), у нас получится граф, в котором опять же Дейкстрой находим кратчайший путь. По лемме любое ребро кратчайшего пути {{---}} ребро visibility графа, так что мы нашли то, что нужно. &lt;br /&gt;
&lt;br /&gt;
=== Построение visibility графа ===&lt;br /&gt;
==== Наивный алгоритм. &amp;lt;tex&amp;gt; O(n ^ 3) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
Если делать наивно, т. е. для каждой пары вершин проверять можно ли добавить ли такое ребро(нет ли пересечений с полигонами), будет &amp;lt;tex&amp;gt; O(n^3) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
[[Файл:search.png|400px|thumb|right|Дерево поиска пересекаемых ребер]]&lt;br /&gt;
&lt;br /&gt;
==== Lee’s Algorithm. &amp;lt;tex&amp;gt; O(n ^ 2 \log n) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
[[Файл:zam.png|400px|thumb|left|Заметание плоскости вращающимся лучом]]&lt;br /&gt;
[[Файл:zamrefr1.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
[[Файл:zamrefr2.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
[[Файл:zamrefr3.png|400px|thumb|right|Обновление статуса заметающей прямой]]&lt;br /&gt;
Однако можно это сделать за &amp;lt;tex&amp;gt; O(n ^ 2 \log  n) &amp;lt;/tex&amp;gt;. Для каждой вершины найдём все видимые из неё вершины при помощи метода плоского заметания. Нам нужно решить следующую задачу: на плоскости дано множество отрезков (рёбер препятствий) и точка &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Найти все концы отрезков, видимые из точки &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Будем заметать плоскость вращающимся лучом с началом в точке &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Статусом заметающей прямой будет отрезки, которые её пересекают, упорядоченные по возрастанию расстояния от точки &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt; до точки пересечения. Точками событий будут концы отрезков. Итак, первым делом вершины &amp;lt;tex&amp;gt; w \in W &amp;lt;/tex&amp;gt; сортируются по углу между лучом &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt; и вертикальной полуосью, проходящей через &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Затем происходит инициализация множества видимых вершин (по умолчанию, такое множество пустое). Далее начинается заметание плоскости. В порядке сортировки вершин для каждой из них выполняется проверка: видна ли вершина &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; из вершины &amp;lt;tex&amp;gt; v &amp;lt;/tex&amp;gt;. Поскольку такая проверка означает наличие пересечений, которые хранятся в сбалансированном дереве, она может быть выполнена за &amp;lt;tex&amp;gt; O(\log n) &amp;lt;/tex&amp;gt;. Если вершина видима, необходимо добавить её в список видимых вершин. И, наконец, вне зависимости от видимости вершины, необходимо изменить статус заметающей прямой. Для этого, для текущей вершины &amp;lt;tex&amp;gt; w &amp;lt;/tex&amp;gt; необходимо удалить из списка текущих пересечений все рёбра (отрезки), которые заканчиваются в этой вершине (лежат слева от прямой &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt;) и добавить все рёбра (отрезки), которые в ней начинаются (лежат справа от прямой &amp;lt;tex&amp;gt; vw &amp;lt;/tex&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Вершин у нас &amp;lt;tex&amp;gt; O(n) &amp;lt;/tex&amp;gt;, сортим за &amp;lt;tex&amp;gt; O(n \log n) &amp;lt;/tex&amp;gt; плюс запросы в дереве за &amp;lt;tex&amp;gt; O(n) * O(\log n) &amp;lt;/tex&amp;gt;. Итого что хотели.&lt;br /&gt;
&lt;br /&gt;
==== Overmars and Welzl’s Algorithm &amp;lt;tex&amp;gt; O(n ^ 2) &amp;lt;/tex&amp;gt; ====&lt;br /&gt;
[http://igitur-archive.library.uu.nl/math/2006-1214-201604/overmars_88_new_methods.pdf visibility graph при помощи rotation tree]&lt;br /&gt;
&lt;br /&gt;
Ковалев сказал что это можно рассказывать по желанию.&lt;br /&gt;
&lt;br /&gt;
Каким-то магическим образом, можно избавиться и от логарифма в асимптотике. Это делается с помощью [http://bit.ly/1eEqTzk rotation tree]. Про него рассказывал Антон Ков., но как-то мутно и не очень понятно. Суть такова, что мы обходим вершины в таком хитром порядке, что почти не просматриваем лишнее и получаем асимптотику {{---}} квадрат.&lt;br /&gt;
&lt;br /&gt;
Короче тут мы делаем то же самое, что и н2логн, только сортим не для каждой вершины отдельно, а рассматриваем все одновременно. &lt;br /&gt;
&lt;br /&gt;
&amp;quot;The idea is simple: for each vertex, a scanline is kept which runs from &amp;lt;tex&amp;gt; -\pi / 2 &amp;lt;/tex&amp;gt; to &amp;lt;tex&amp;gt; \pi / 2 &amp;lt;/tex&amp;gt; hopping from vertex to vertex in its path. During the main loop, it appears that all of the scanlines are proceeding simultaneously. In fact, there are exact rules about determining the next vertex to process, and some vertices may finish their scan before others. To understand the rules about finding the next vertex, the rotation tree must be understood. A rotation tree is a rooted planar tree where each vertex is a node and points to its parent. There are two special nodes: &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt; and &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt;. Initially, all vertices point to &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt; as their parent and &amp;lt;tex&amp;gt; -\infty &amp;lt;/tex&amp;gt; points to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;. Also stored is the rightmost child (if a node is a parent), and its right and left siblings (if they exist). The ordering of children is by slope: the one with the smallest slope is the leftmost. The loop that examines all pairs simply takes the rightmost leftmost leaf as the next segment to process and then reattaches it to the tree (while maintaining the property of being a rotation tree). It can reattach to the left of its parent or to the tangent of the chain above it. When a vertex attaches to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;, it is finished. The loop continues when all points have attached to &amp;lt;tex&amp;gt; +\infty &amp;lt;/tex&amp;gt;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
/*мне лень это переводить, и так понятно/непонятно*/&lt;br /&gt;
&lt;br /&gt;
== Motion planning ==&lt;br /&gt;
[[Файл:mink.png|200px|thumb|left|Раздуваем препятствия]]&lt;br /&gt;
[[Файл:mink2.png|400px|thumb|right|Логично же]]&lt;br /&gt;
В общем тут все очевидно. Тут мы просто двигаем не точку, а произвольный выпуклый полигон. Если мы его не можем вращать, просто &amp;quot;обводим&amp;quot;  препятствия нашим полигоном (запиливаем [[Сумма Минковского (определение, вычисление)|сумму Минковского]] препятствий и полигона, сдвинутого в начало координат какой-нибудь точкой) и получаем другие препятствия, но зато теперь мы двигаем точку. А это мы уже научились делать выше.&lt;br /&gt;
&lt;br /&gt;
Если же этот полигон можно вращать, то делаем примерно то же самое, только как-то по-хитрому. Нам про это, кажется, не рассказывали(или рассказывали так же:))&lt;br /&gt;
&lt;br /&gt;
== Источники ==&lt;br /&gt;
* Mark de Berg, Otfried Cheong, Marc van Kreveld, Mark Overmars (2008), Computational Geometry: Algorithms and Applications (3rd edition), Springer-Verlag, ISBN 978-3-540-77973-5 Chapter 15 page 324-331&lt;br /&gt;
* [http://www.academia.edu/2845047/3D_Visibility_Graph not_bad.jpg статья про visibility graphs]&lt;br /&gt;
[[Категория: Вычислительная геометрия]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36005</id>
		<title>ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36005"/>
				<updated>2014-01-24T10:23:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Построение РСДС множества прямых */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Файл:DCEL.png|400px|thumb|left|Представление плоского графа с помощью РСДС]]&lt;br /&gt;
[[Файл:DCEL2.png|200px|thumb|right|Плоский граф, ребрам которого придана произвольная ориентация для представления его с помощью РСДС. Стрелки вокруг вершин соответствуют указателям (P1, P2)]]&lt;br /&gt;
[[Файл:DCEL3.png|200px|thumb|right|(а) РСДС, (б) входы по вершинам head_V [1..n] и (в) входы по граням head_F[1..l]]]&lt;br /&gt;
&lt;br /&gt;
'''ППЛГ''' {{---}} Плоский прямолинейный граф.&lt;br /&gt;
&lt;br /&gt;
'''РСДС''' {{---}} Реберный список с двойными связями.&lt;br /&gt;
&lt;br /&gt;
==ППЛГ==&lt;br /&gt;
[[Укладка графа на плоскости|Планарный граф]], уложенный на плоскости, принято называть ''плоским''.&lt;br /&gt;
'''Плоская укладка планарного графа''' &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;  {{---}} это отображение каждой вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в точку на плоскости, а каждого ребра из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; в простую линию, соединяющую пару образов концевых вершин этого ребра так, чтобы образы ребер пересекались только в своих концевых точках. Хорошо известно, что любой планарный граф можно уложить на плоскости так, чтобы все ребра отобразились в прямолинейные отрезки.&lt;br /&gt;
&lt;br /&gt;
==РСДС==&lt;br /&gt;
===Первое описание===&lt;br /&gt;
Реберный список с двойными связями особенно удобен для представления ППЛГ.&lt;br /&gt;
Пусть задан граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V = \{v_1, v_2... v_n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E = \{e_1, e_2... e_n\}&amp;lt;/tex&amp;gt;. Главная компонента РСДС для планарного графа это ''реберный узел''. Между ребрами графа и реберными узлами РСДС существует взаимно однозначное соответствие, т.е. каждое ребро представлено в РСДС ровно один раз. Реберный узел РСДС, соответствующий ребру графа, например, &amp;lt;tex&amp;gt;e_k = \{v_1, v_2\} &amp;lt;/tex&amp;gt; имеет 4 поля (&amp;lt;tex&amp;gt;V1, V2, F1, F2&amp;lt;/tex&amp;gt;) и 2 указателя (&amp;lt;tex&amp;gt;P1, P2&amp;lt;/tex&amp;gt;). Поле &amp;lt;tex&amp;gt;V1&amp;lt;/tex&amp;gt; содержит начало ребра, а поле &amp;lt;tex&amp;gt;V2&amp;lt;/tex&amp;gt; содержит его конец (так изначально неориентированное ребро получает условную ориентацию). Поля &amp;lt;tex&amp;gt;F1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F2&amp;lt;/tex&amp;gt; содержат имена граней, лежащих слева и справа от ориентированного ребра (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;). Указатель &amp;lt;tex&amp;gt;P1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;P2&amp;lt;/tex&amp;gt;) задает реберный узел, содержащий первое ребро, встречаемое вслед за ребром (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;), при повороте от него против часовой стрелки вокруг &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:DCEL4.png|300px|thumb|right|Ко второму описанию]]&lt;br /&gt;
===Второе описание===&lt;br /&gt;
РСДС состоит из 3 компонент:&lt;br /&gt;
*''Vertex'' {{---}} это точка сочленения. Содержит координаты точки. А также указатель на инцидентное ребро.&lt;br /&gt;
*''Face'' {{---}} содержит указатель на наружную компоненту (некоторое ребро на его границе). Для неограниченных поверхностей это nil. Так же содержит внутреннюю компоненту, которая есть указатель на некое ребро, с которого можно начать описывать внутреннюю область (опять же, может быть nil).&lt;br /&gt;
*''Half-edge'' {{---}} это ребро. Содержит указатели на точку, откуда исходит (origin), указатель на ребро близнец (twin)(направленное в другую сторону), инцидентную поверхность (incident_face), и указатели на следующее и предыдущие ребра.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct vertex {&lt;br /&gt;
    x, y;&lt;br /&gt;
    half_edge *rep;  /* rep-&amp;gt;origin == this */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct face {&lt;br /&gt;
    outer_component *out;&lt;br /&gt;
    inner_components *in; (список какой-нибудь)&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct half_edge {&lt;br /&gt;
    half_edge *prev;  /* prev-&amp;gt;next == this */&lt;br /&gt;
    half_edge *next;  /* next-&amp;gt;prev == this */&lt;br /&gt;
    half_edge *twin;  /* twin-&amp;gt;twin == this */&lt;br /&gt;
    vertex *origin;     /* twin-&amp;gt;next-&amp;gt;origin == origin &amp;amp;&amp;amp;&lt;br /&gt;
                                prev-&amp;gt;twin-&amp;gt;origin == origin */&lt;br /&gt;
    face *incident_face;       /* prev-&amp;gt;incident_face == incident_face &amp;amp;&amp;amp; next-&amp;gt;incident_face == incident_face */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Построение РСДС множества прямых==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
Для каждой конечной точки создаем vertex. Для каждого входного сегмента создаем 2 half-edge и присваиваем vertex в origin и создаем поля twin. Для каждой конечной точки сортируем (по часовой стрелке) half-edge, у которых origin vertex и есть эта точка. Для каждой пары half-edge e1, e2, по часовой стрелке присваиваем e1-&amp;gt;twin-&amp;gt;next = e2 и e2-&amp;gt;prev = e1-&amp;gt;twin. Выбираем один из этих half-edge и делаем его представителем точки. (Вырожденный случай: если есть только 1 half-edge в отсортированном списке, то присваиваем e-&amp;gt;twin-&amp;gt;next = e и e-&amp;gt;prev = e-&amp;gt;twin. Если сделать четко, то это не понадобится). Следующие указатели это перестановки half-edge. В каждом цикле находим и создаем face. [http://cs.stackexchange.com/a/2516]&lt;br /&gt;
&lt;br /&gt;
[http://cs.stackexchange.com/a/18167 Более поясняющая статья.] К сожалению нет времени перевести, но там и так все достаточно понятно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36004</id>
		<title>ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=36004"/>
				<updated>2014-01-24T10:13:14Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Построение РСДС множества прямых */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Файл:DCEL.png|400px|thumb|left|Представление плоского графа с помощью РСДС]]&lt;br /&gt;
[[Файл:DCEL2.png|200px|thumb|right|Плоский граф, ребрам которого придана произвольная ориентация для представления его с помощью РСДС. Стрелки вокруг вершин соответствуют указателям (P1, P2)]]&lt;br /&gt;
[[Файл:DCEL3.png|200px|thumb|right|(а) РСДС, (б) входы по вершинам head_V [1..n] и (в) входы по граням head_F[1..l]]]&lt;br /&gt;
&lt;br /&gt;
'''ППЛГ''' {{---}} Плоский прямолинейный граф.&lt;br /&gt;
&lt;br /&gt;
'''РСДС''' {{---}} Реберный список с двойными связями.&lt;br /&gt;
&lt;br /&gt;
==ППЛГ==&lt;br /&gt;
[[Укладка графа на плоскости|Планарный граф]], уложенный на плоскости, принято называть ''плоским''.&lt;br /&gt;
'''Плоская укладка планарного графа''' &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;  {{---}} это отображение каждой вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в точку на плоскости, а каждого ребра из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; в простую линию, соединяющую пару образов концевых вершин этого ребра так, чтобы образы ребер пересекались только в своих концевых точках. Хорошо известно, что любой планарный граф можно уложить на плоскости так, чтобы все ребра отобразились в прямолинейные отрезки.&lt;br /&gt;
&lt;br /&gt;
==РСДС==&lt;br /&gt;
===Первое описание===&lt;br /&gt;
Реберный список с двойными связями особенно удобен для представления ППЛГ.&lt;br /&gt;
Пусть задан граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V = \{v_1, v_2... v_n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E = \{e_1, e_2... e_n\}&amp;lt;/tex&amp;gt;. Главная компонента РСДС для планарного графа это ''реберный узел''. Между ребрами графа и реберными узлами РСДС существует взаимно однозначное соответствие, т.е. каждое ребро представлено в РСДС ровно один раз. Реберный узел РСДС, соответствующий ребру графа, например, &amp;lt;tex&amp;gt;e_k = \{v_1, v_2\} &amp;lt;/tex&amp;gt; имеет 4 поля (&amp;lt;tex&amp;gt;V1, V2, F1, F2&amp;lt;/tex&amp;gt;) и 2 указателя (&amp;lt;tex&amp;gt;P1, P2&amp;lt;/tex&amp;gt;). Поле &amp;lt;tex&amp;gt;V1&amp;lt;/tex&amp;gt; содержит начало ребра, а поле &amp;lt;tex&amp;gt;V2&amp;lt;/tex&amp;gt; содержит его конец (так изначально неориентированное ребро получает условную ориентацию). Поля &amp;lt;tex&amp;gt;F1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F2&amp;lt;/tex&amp;gt; содержат имена граней, лежащих слева и справа от ориентированного ребра (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;). Указатель &amp;lt;tex&amp;gt;P1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;P2&amp;lt;/tex&amp;gt;) задает реберный узел, содержащий первое ребро, встречаемое вслед за ребром (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;), при повороте от него против часовой стрелки вокруг &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:DCEL4.png|300px|thumb|right|Ко второму описанию]]&lt;br /&gt;
===Второе описание===&lt;br /&gt;
РСДС состоит из 3 компонент:&lt;br /&gt;
*''Vertex'' {{---}} это точка сочленения. Содержит координаты точки. А также указатель на инцидентное ребро.&lt;br /&gt;
*''Face'' {{---}} содержит указатель на наружную компоненту (некоторое ребро на его границе). Для неограниченных поверхностей это nil. Так же содержит внутреннюю компоненту, которая есть указатель на некое ребро, с которого можно начать описывать внутреннюю область (опять же, может быть nil).&lt;br /&gt;
*''Half-edge'' {{---}} это ребро. Содержит указатели на точку, откуда исходит (origin), указатель на ребро близнец (twin)(направленное в другую сторону), инцидентную поверхность (incident_face), и указатели на следующее и предыдущие ребра.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct vertex {&lt;br /&gt;
    x, y;&lt;br /&gt;
    half_edge *rep;  /* rep-&amp;gt;origin == this */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct face {&lt;br /&gt;
    outer_component *out;&lt;br /&gt;
    inner_components *in; (список какой-нибудь)&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct half_edge {&lt;br /&gt;
    half_edge *prev;  /* prev-&amp;gt;next == this */&lt;br /&gt;
    half_edge *next;  /* next-&amp;gt;prev == this */&lt;br /&gt;
    half_edge *twin;  /* twin-&amp;gt;twin == this */&lt;br /&gt;
    vertex *origin;     /* twin-&amp;gt;next-&amp;gt;origin == origin &amp;amp;&amp;amp;&lt;br /&gt;
                                prev-&amp;gt;twin-&amp;gt;origin == origin */&lt;br /&gt;
    face *incident_face;       /* prev-&amp;gt;incident_face == incident_face &amp;amp;&amp;amp; next-&amp;gt;incident_face == incident_face */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Построение РСДС множества прямых==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
Для каждой конечной точки создаем vertex. Для каждого входного сегмента создаем 2 half-edge и присваиваем vertex в origin и создаем поля twin. Для каждой конечной точки сортируем (по часовой стрелке) half-edge, у которых origin vertex и есть эта точка. Для каждой пары half-edge e1, e2, по часовой стрелке присваиваем e1-&amp;gt;twin-&amp;gt;next = e2 и e2-&amp;gt;prev = e1-&amp;gt;twin. Выбираем один из этих half-edge и делаем его представителем точки. (Вырожденный случай: если есть только 1 half-edge в отсортированном списке, то присваиваем e-&amp;gt;twin-&amp;gt;next = e и e-&amp;gt;prev = e-&amp;gt;twin. Если сделать четко, то это не понадобится). Следующие указатели это перестановки half-edge. В каждом цикле находим и создаем face. [http://cs.stackexchange.com/a/2516]&lt;br /&gt;
&lt;br /&gt;
[http://www.example.com Более поясняющая статья.] К сожалению нет времени перевести, но там и так все достаточно понятно.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35962</id>
		<title>Метрические пространства</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35962"/>
				<updated>2014-01-20T19:46:21Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|id=defms&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, отображение &amp;lt;tex&amp;gt; \rho : X \times X \to \mathbb{R^+} &amp;lt;/tex&amp;gt; {{---}} называется '''метрикой''' на &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, если выполняются аксиомы&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \ge 0 ;\ \rho (x, y) = 0  \iff x = y &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) = \rho (y, x) &amp;lt;/tex&amp;gt; &lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \le \rho (x, z) + \rho (z, y) &amp;lt;/tex&amp;gt; {{---}} неравенство треугольника&lt;br /&gt;
&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называют '''метрическим пространством'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmsconv&lt;br /&gt;
|definition=&lt;br /&gt;
Последовательность &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; '''сходится''' к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; (записывают &amp;lt;tex&amp;gt; x = \lim\limits_{n \to \infty} x_n&amp;lt;/tex&amp;gt;), если &amp;lt;tex&amp;gt; \rho(x_n, x) \xrightarrow[n \to \infty]{} 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Некоторые примеры метрических пространств:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}, \rho(x, y) = | x - y |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^n, \rho(\overline x, \overline y) = \sqrt{\sum\limits_{i=1}^n (x_i - y_i)^2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\infty}&amp;lt;/tex&amp;gt;. Превращение в МП должно быть связано с желаемой операцией предельного перехода. В случае конечномерного пространства сходимость совпадает с покоординатной сходимостью, хотим того же самого для бесконечномерного. Введем метрику: &amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n = 1}^{\infty} {1 \over 2^n}{|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt; (стандартный способ превратить в метрическое пространство счетное произведение метрических пространств, коим и является &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;). Проверим, что эта метрика удовлетворяет аксиомам:&lt;br /&gt;
** этот ряд всегда сходящийся, так как мажорируется убывающей геометрической прогрессией &amp;lt;tex&amp;gt;\sum\limits_{n=1}^{\infty} {1 \over 2^n} = 1&amp;lt;/tex&amp;gt;, соответственно, расстояние ограничено единицей.&lt;br /&gt;
** первая аксиома: неотрицательность очевидна, равенство метрики нулю в обе стороны очевидно&lt;br /&gt;
** вторая аксиома: еще очевиднее&lt;br /&gt;
** третья аксиома легко вытекает из следующего утверждения:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt; {|x - z| \over 1 + |x - z|} \le {|x - y| \over 1 + |x - y|} + {|y - z| \over 1 + |y - z|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;f(t) = {t \over 1 + t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; f(t) &amp;lt;/tex&amp;gt; возрастает при &amp;lt;tex&amp;gt; t \in [0, \infty) &amp;lt;/tex&amp;gt;, поэтому, если &amp;lt;tex&amp;gt; 0 \le t_1 &amp;lt; t_2 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; f(t_1) &amp;lt; f(t_2) &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac{f(t)}{t} = \frac{1}{1 + t}&amp;lt;/tex&amp;gt; убывает при &amp;lt;tex&amp;gt;t \in [0, \infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(t_1) + f(t_2) = t_1 \frac{1}{1 + t_1} + t_2 \frac{1}{1 + t_2} \ge&amp;lt;/tex&amp;gt;(по убыванию &amp;lt;tex&amp;gt;\frac{1}{1 + t}&amp;lt;/tex&amp;gt;)&amp;lt;tex&amp;gt;\ge t_1 \frac{1}{1 + t_1 + t_2} + t_2 \frac{1}{1 + t_1 + t_2} = \frac{t_1 + t_2}{1 + t_1 + t_2} = f(t_1 + t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Так как &amp;lt;tex&amp;gt; |x - z| \le |x - y| + |y - z| &amp;lt;/tex&amp;gt; по свойствам &amp;lt;tex&amp;gt; | \cdot | &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; возрастает, то &amp;lt;tex&amp;gt; f(|x - z|) \le f(|x - y| + |y - z|)&amp;lt;/tex&amp;gt;. Так как знаем, что &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt;f(|x - y| + |y - z|) \le f(|x - y|) + f(|y - z|) &amp;lt;/tex&amp;gt;, то есть получили &amp;lt;tex&amp;gt;f(|x - z|) \le f(|x - y|) + f(|y - z|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=rinfcoordconv&lt;br /&gt;
|statement=Сходимость в метрике &amp;lt;tex&amp;gt; \mathbb{R}^{\infty} &amp;lt;/tex&amp;gt; эквивалентна покоординатной. &lt;br /&gt;
|proof=&lt;br /&gt;
Рассматриваем &amp;lt;tex&amp;gt; f(t) = \frac{t}{1+t} &amp;lt;/tex&amp;gt;, как и в прошлом утверждении.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} = (x^{(n)}_1, \dots, x^{(n)}_k, \dots), x = (x_1, \dots, x_k, \dots) &amp;lt;/tex&amp;gt;. Покажем, что &amp;lt;tex&amp;gt; x^{(n)} \to x \iff \forall k: x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В прямую сторону: &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le 2^k \rho(x^{(n)}, x) &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; {\varepsilon \over 2^k} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le \varepsilon &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; t = {1 \over 1 - f(t)} - 1 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; t \to 0 &amp;lt;/tex&amp;gt;, когда &amp;lt;tex&amp;gt; f(t) \to 0 &amp;lt;/tex&amp;gt;, а значит, покоординатная сходимость выполняется. &lt;br /&gt;
&lt;br /&gt;
В обратную сторону: подберем такое &amp;lt;tex&amp;gt; k_0 &amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt; {\sum\limits_{k = k_0 + 1}^{\infty} {1 \over 2^k}} &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Возьмем &amp;lt;tex&amp;gt; n_0 &amp;lt;/tex&amp;gt; таким, чтобы &amp;lt;tex&amp;gt; \forall k \le k_0, n &amp;gt; n_0: |x^{(n)}_k - x_k| &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; \sum\limits_{k = 1}^{k_0} {\varepsilon \over 2^k} + \varepsilon &amp;lt; 2 \varepsilon &amp;lt;/tex&amp;gt;. Устремляя &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; к нулю, получаем необходимое. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* В любом пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; можно ввести дискретную метрику: &amp;lt;tex&amp;gt;\rho(x, y) = \begin{cases} 0; &amp;amp; x = y \\ 1; &amp;amp; x \ne y \end{cases}&amp;lt;/tex&amp;gt;. Заметим, что в дискретной метрике сходятся только стационарные последовательности.&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, то есть множество всех функций из &amp;lt;tex&amp;gt;\mathbb{I} = [0; 1]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;. Это пространство не метризуется, то есть не существует метрики, в которой сходимость эквивалентна поточечной &amp;lt;ref&amp;gt;Кому интересно: метрическое пространство удовлетворяет первой аксиоме счетности, а она не может выполняться в &amp;lt;tex&amp;gt;X = \mathbb{I}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, которое понятно как сводится к &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;: [http://math.stackexchange.com/questions/65472/why-is-0-10-1-not-first-countable ''Why is &amp;lt;tex&amp;gt;[0,1]^{[0,1]}&amp;lt;/tex&amp;gt; not first countable?'']&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Центральную роль в изучении МП играют шары:&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defob&lt;br /&gt;
|definition=&lt;br /&gt;
'''Открытым шаром''' в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; с радиусом &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и центром в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; называют множество &amp;lt;tex&amp;gt;V_r(a) = \{ x \mid \rho(x, a) &amp;lt; r \} &amp;lt;/tex&amp;gt;. В определении '''замкнутого шара''' знак &amp;lt;tex&amp;gt;&amp;lt;&amp;lt;/tex&amp;gt; заменяется на &amp;lt;tex&amp;gt;\le&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
На базе этих множеств можно МП превратить в ТП.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defts&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, класс множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; называется '''топологией''', если:&lt;br /&gt;
# &amp;lt;tex&amp;gt; X, \varnothing \in \tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое объединение (возможно, несчетное) &amp;lt;tex&amp;gt;\bigcup\limits_{\alpha} G_{\alpha}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое конечное пересечение &amp;lt;tex&amp;gt;\bigcap\limits_{i=1}^{n} G_i&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt; называют '''топологическим пространством'''. Множества, принадлежащие &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;, называются '''открытыми'''. '''Замкнутыми''' называются множества-дополнения к множествам из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defint&lt;br /&gt;
|definition=&lt;br /&gt;
Рассмотрим множество &amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Внутренностью (interior)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Int} A = \bigcup\limits_{G \subset A} G&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; — открытые множества.&lt;br /&gt;
&lt;br /&gt;
'''Замыкание (closure)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Cl} A = \bigcap\limits_{A \subset F } F&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; — замкнутые множества.&lt;br /&gt;
&lt;br /&gt;
'''Границей (boundary, frontier)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Fr} A = \mathrm{Cl} A \setminus \mathrm{Int} A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftslimit&lt;br /&gt;
|definition=&lt;br /&gt;
Точка &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; называется '''пределом последовательности &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; в топологическом пространстве''' &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\forall G \ni x\ \exists N\ \forall n &amp;gt; N: x_n \in G&amp;lt;/tex&amp;gt;, то есть любое открытое множество, содержащее предел, также содержит все точки последовательности кроме конечного числа.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defnbh&lt;br /&gt;
|definition=&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; называется '''окрестностью''' в ТП, если существует открытое &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x \in G \subset U&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defcont&lt;br /&gt;
|definition=&lt;br /&gt;
Отображение &amp;lt;tex&amp;gt;f: (X, \tau_1) \to (Y, \tau_2)&amp;lt;/tex&amp;gt; называют непрерывным в точке &amp;lt;tex&amp;gt;x \in X&amp;lt;/tex&amp;gt;, если для любой окрестности &amp;lt;tex&amp;gt;U_{f(x)}&amp;lt;/tex&amp;gt; существует окрестность &amp;lt;tex&amp;gt;U_x&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;f(U_x) \subset U_{f(x)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Характеристика непрерывных отображений ТП: &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; непрерывно, если для любого &amp;lt;tex&amp;gt;G' \in \tau_2: f^{-1}(G') \in \tau_1&amp;lt;/tex&amp;gt;, то есть прообраз любого открытого множества также открыт.&amp;lt;ref&amp;gt;В конспекте только в прямую сторону, но вообще, вроде, это критерий. Док-во есть в Колмогорове, элементы теории функции и функана, 6 издание, страница 107.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для любого МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; можно ввести '''метрическую топологию''': выделим в семейство открытых множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;  множества, являющимися объединениями любого (возможно, несчетного) числа открытых шаров. Покажем, что это семейство удовлетворяет аксиомам ТП:&lt;br /&gt;
# Очевидно, &amp;lt;tex&amp;gt;X = \bigcup\limits_{x \in X}\bigcup\limits_{i=1}^{\infty}U_i(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Очевидно.&lt;br /&gt;
# Докажем для пересечения двух множеств, дальше по индукции:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;G_1 \bigcap G_2 = (\bigcup\limits_{\alpha} V') \bigcap (\bigcup\limits_{\beta} V'') = \bigcup\limits_{\alpha, \beta} (V' \bigcap V'')&amp;lt;/tex&amp;gt;. (То, что так можно сделать, доказывается включением в обе стороны)&lt;br /&gt;
#: Рассмотрим &amp;lt;tex&amp;gt;V' \bigcap V''&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x \in V' \bigcap V'' \exists V(x) \subset V' \bigcap V''&amp;lt;/tex&amp;gt; (раньше когда-то доказывали), тогда &amp;lt;tex&amp;gt;V' \bigcap V'' = \bigcup\limits_{x \in V' \cap V''} V(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае открытые множества были получены объединением открытых шаров — множеств более узкого класса. Это один из общих приемов превращения произвольного пространства в топологическое, открытые шары здесь — база топологии.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftbase&lt;br /&gt;
|definition=&lt;br /&gt;
'''Базой топологии''' называют некоторый набор открытых множеств &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;, такой, что &amp;lt;tex&amp;gt; \forall G \in \tau:\ G = \bigcup\limits_{V \in \sigma} V &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое множество можно представить в виде объединения множеств из &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=contrho&lt;br /&gt;
|statement=&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;f(x) = \rho(x, A)&amp;lt;/tex&amp;gt; равномерно непрерывна.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall a \in A, x_1, x_2 \in X: \rho(x_1, a) \le \rho(x_1, x_2) + \rho(x_2, a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(x_1, A) \le \rho(x_1, a), \forall \varepsilon &amp;gt; 0\ \exists a_\varepsilon \in A: \rho(x_2, a_\varepsilon) &amp;lt; \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\rho(x_1, A) &amp;lt; \rho(x_1, x_2) + \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично, &amp;lt;tex&amp;gt;\rho(x_2, A) &amp;lt; \rho(x_1, x_2) + \rho(x_1, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда, &amp;lt;tex&amp;gt;|\rho(x_1, A) - \rho(x_2, A)| &amp;lt; \rho(x_1, x_2) + \varepsilon&amp;lt;/tex&amp;gt;, устремляя &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; к нулю, получаем равномерную непрерывность &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; по определению.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=propcl&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Cl} A = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\rho(x, A) = \inf\limits_{a \in A} \rho(x, a)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;B = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;. Понятно, что если некоторая последовательность &amp;lt;tex&amp;gt;x_n \in B&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(x_n, A) = 0&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\rho(x, A) = 0&amp;lt;/tex&amp;gt;, то есть, по определению &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;B = \mathrm{Cl} B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;a \in A&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(a, A) = 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \subset B&amp;lt;/tex&amp;gt;, а раз &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто, то &amp;lt;tex&amp;gt;\mathrm{Cl} A \subset B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь покажем, что &amp;lt;tex&amp;gt;B \subset \mathrm{Cl} A &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;B \subset \bigcap\limits_{A \subset F } F &amp;lt;/tex&amp;gt;, или что для любого &amp;lt;tex&amp;gt;F: A \subset F&amp;lt;/tex&amp;gt;, выполняется &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Допустим, это неверно, и &amp;lt;tex&amp;gt;\exists b \in B: b \notin F&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;b \in X \setminus F = G = \bigcup\limits_{\alpha} V_{r_\alpha}(x_\alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt; b \in V_r(b) \subset X \setminus F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b \in B, \rho(b, A) = 0&amp;lt;/tex&amp;gt;, следовательно, есть последовательность &amp;lt;tex&amp;gt;a_n \in A: \rho(b, a_n) \to 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, больших некоторого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\rho(b, a_n) &amp;lt; r&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;a_n \in V_r(b)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;A \cap V_r(b)&amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt;A \subset F \implies A \cap G = \varnothing &amp;lt;/tex&amp;gt; {{---}} противоречие, &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Замечание: в общем случае в топологических пространствах замыкания не определяются через предел последовательности, в этом смысле метрические пространства удобны.&lt;br /&gt;
&lt;br /&gt;
Метрические пространства удовлетворяют [http://en.wikipedia.org/wiki/Separation_axiom#Main_definitions аксиоме нормальности]:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=msnorm&lt;br /&gt;
|about=&lt;br /&gt;
нормальность МП&lt;br /&gt;
|statement=&lt;br /&gt;
Любое МП - нормальное, то есть любые два непересекающихся замкнутых подмножества имеют непересекающиеся окрестности.&lt;br /&gt;
|proof=&lt;br /&gt;
(скопировано из первого курса, в Колмогорове на странице 112 есть доказательство поприятнее и поинтуитивнее)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; f(x) = \frac {\rho(x, F_1)} {\rho(x, F_1) + \rho(x, F_2)} &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; F_1 \cap F_2 = \varnothing &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; F_1, F_2 &amp;lt;/tex&amp;gt; - замкнуты, то знаменатель не равен 0. Следовательно, &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; корректна и непрерывна в силу непрерывности &amp;lt;tex&amp;gt; \rho &amp;lt;/tex&amp;gt;. При этом: &amp;lt;tex&amp;gt; x \in F_1 \implies f(x) = 0; x \in F_2: f(x) = 1 &amp;lt;/tex&amp;gt;. Рассмотрим на R пару интервалов: &amp;lt;tex&amp;gt; (- \infty; \frac 1 3) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; (\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; неперывна, то прообраз открытого множества - открытое множество (это другое определение непрерывного отображения, оно почти эквивалентно тому, которое было дано ранее).&lt;br /&gt;
: &amp;lt;tex&amp;gt; G_1 = f^{-1} ( - \infty; \frac 1 3); G_2 = f^{-1}(\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; F_1 \in G_1; F_2 \in G_2; G_1 \cap G_2 = \varnothing &amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следствие: так как одноточечные подмножества в МП являются замкнутыми, МП удовлетворяют аксиоме отделимости Хаусдорфа: любые две различные точки можно отделить открытыми шарами. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompl&lt;br /&gt;
|definition=&lt;br /&gt;
МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называется '''полным''', если в нем любая сходящаяся в себе последовательность сходится к элементу &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
принцип вложенных шаров&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — полное. &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; — замкнутые шары. &amp;lt;tex&amp;gt;\overline V_{n + 1} \subset \overline V_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\bigcap\limits_{n=1}^{\infty} \overline V_n \ne \varnothing&amp;lt;/tex&amp;gt;, и состоит из одной точки.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; — центр соответствующего шара, тогда из вложенности &amp;lt;tex&amp;gt;\forall m &amp;gt; n: \rho(a_n, a_m) &amp;lt; r_n&amp;lt;/tex&amp;gt;, то есть последовательность центров сходится в себе, так как &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;, тогда по полноте пространства последовательность центров сходится к &amp;lt;tex&amp;gt;a \in X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt; a \in \bigcap\limits_{n=1}^{\infty} \overline V_n &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\forall n: a \in \overline V_n&amp;lt;/tex&amp;gt;. Для любого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шар &amp;lt;tex&amp;gt;\overline V_n &amp;lt;/tex&amp;gt; содержит все точки последовательности &amp;lt;tex&amp;gt;\{a_n \}&amp;lt;/tex&amp;gt;, кроме конечного числа. Тогда оставшаяся последовательность центров содержится в &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; и также сходится к &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt; \overline V_n&amp;lt;/tex&amp;gt; — замкнутое множество, [[Метрическое пространство#Основное характеристическое свойство замкнутых множеств | оно содержит предел этой последовательности]] и &amp;lt;tex&amp;gt;a \in \overline V_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также, кроме &amp;lt;tex&amp;gt;a &amp;lt;/tex&amp;gt; в пересечение ничего входить не может: пусть в него еще входит точка &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;,тогда &amp;lt;tex&amp;gt;\rho(a, b) &amp;gt; 0&amp;lt;/tex&amp;gt;, возьмем шар в пересечении радиусом меньше &amp;lt;tex&amp;gt;\rho(a, b) \over 2&amp;lt;/tex&amp;gt; (такой есть по стремлению радиусов к &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;), но в нем может лежать только одна из точек &amp;lt;tex&amp;gt;a,b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defdense&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''всюду плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\mathrm{Cl} A = X&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Q}&amp;lt;/tex&amp;gt; всюду плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;\mathrm{Cl} \mathbb{Q} = \mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если в пространстве существует счетное всюду плотное множество, такое пространство называют '''сепарабельным'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''нигде не плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\mathrm{Int} \mathrm{Cl} A = \varnothing&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Z}&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; (X, \rho) &amp;lt;/tex&amp;gt;. Тогда в любом шаре есть шар, не содержащий точек &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; B = \mathrm{Cl} A &amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \mathrm{Int} B = \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это значит, что &amp;lt;tex&amp;gt;\bigcup\limits_{G \subset B} G = \varnothing &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не является подмножеством &amp;lt;tex&amp;gt; B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный открытый шар &amp;lt;tex&amp;gt; V &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; V = (V \cap B) \cup (V \cap \overline B) &amp;lt;/tex&amp;gt;. Из наших рассуждений следует, что &amp;lt;tex&amp;gt; V \cap \overline B &amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt; \overline B &amp;lt;/tex&amp;gt; {{---}} открытое множество, &amp;lt;tex&amp;gt; \overline B = \bigcup\limits_{\alpha} V_{r_\alpha}(a_\alpha) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \exists V_1: V \cap V_1 \ne \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда можно просто выбрать &amp;lt;tex&amp;gt; V_r(a) \subset V \cap V_1 &amp;lt;/tex&amp;gt;, он и будет искомым шаром без точек &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defbaire&lt;br /&gt;
|definition=&lt;br /&gt;
Подмножество &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; топологического пространства &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; имеет '''I категорию по Бэру в пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;''', если оно является не более чем счетным объединением нигде не плотных в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; множеств. В противном случае оно имеет '''II категорию по Бэру'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thbaire&lt;br /&gt;
|author=Бэр&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП является множеством II категории в себе.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — полное и является множеством I категории, то есть представимо как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} M_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; — нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;. Возьмем замкнутый шар &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, например, радиуса 1. Так как &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, оно также нигде не плотно в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, а, значит, существует замкнутый шар &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt; радиуса меньше &amp;lt;tex&amp;gt;1 \over 2&amp;lt;/tex&amp;gt;, содержащийся в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt; и не пересекающийся с &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;M_1 \cap \overline V_1 = \varnothing&amp;lt;/tex&amp;gt;). Аналогично, &amp;lt;tex&amp;gt;M_2&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt;, и так далее действуя таким образом, построим систему вложенных замкнутых шаров (&amp;lt;tex&amp;gt;\overline V_{n+1} \subset \overline V_n&amp;lt;/tex&amp;gt;) со стремящимся к нулю радиусом. В силу теоремы о вложенных шарах пересечение этих шаров должно содержать какую-то точку &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, но эта точка не может лежать ни в одном из множеств &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; по построению, то есть, получили противоречие, и &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; не является множеством первой категории.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=следствие из т. Бэра&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП без изолированных точек несчетно.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — МП без изолированных точек (то есть в любой окрестности любой точки найдутся точки, отличные от нее). Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — счетно, то есть, можно занумеровать его элементы как &amp;lt;tex&amp;gt;\{ x_1 \dots x_n \dots \}&amp;lt;/tex&amp;gt; и представить &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} \{ x_n \}&amp;lt;/tex&amp;gt;. Но одноточечные множества нигде не плотны в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;: рассмотрим шар &amp;lt;tex&amp;gt; V_r(p) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; p = x_n &amp;lt;/tex&amp;gt;, то внутри шара есть шар с центром не в &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; меньшего радиуса, так как &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; не является изолированной точкой; для остальных шаров можно взять шар радиуса, меньшего, чем &amp;lt;tex&amp;gt; \rho(x, p) &amp;lt;/tex&amp;gt; с центром также в &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; является множеством I категории, что противоречит теореме Бэра. Следовательно, &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; должно быть несчетно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Это следствие объясняет природу несчетности вещественной оси. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompact&lt;br /&gt;
|definition=&lt;br /&gt;
Замкнутое &amp;lt;tex&amp;gt;K \subset X&amp;lt;/tex&amp;gt; называют '''компактом''', если из любой последовательности точек в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; можно выделить сходящуюся подпоследовательность, предел которой также принадлежит &amp;lt;tex&amp;gt; K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmstb&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt; называют '''вполне ограниченным''', если для него при любом &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; существует конечная &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть, то есть &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \exists x_1, x_2 \dots x_n: A \subset \bigcup\limits_{i=1}^n V_{\varepsilon}(x_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thhausdorf&lt;br /&gt;
|author=Хаусдорф&lt;br /&gt;
|statement=&lt;br /&gt;
В полном метрическом пространстве множество является компактом тогда и только тогда, когда оно замкнуто и вполне ограничено.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Теорема Хаусдорфа об ε-сетях]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пример: &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt; — полное.&lt;br /&gt;
|proof=&lt;br /&gt;
Нужно установить равносильность сходимости &amp;lt;tex&amp;gt; \overline x^{(n)} \in R^{\infty} &amp;lt;/tex&amp;gt; и ее сходимости в себе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \implies &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \lim\limits_{n \to \infty} x^{(n)} = x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \rho(x^{(n)}, x^{(m)}) \le \rho(x^{(n)}, x) + \rho(x^{(m)}, x) &amp;lt;/tex&amp;gt;, и при &amp;lt;tex&amp;gt; n, m \to \infty &amp;lt;/tex&amp;gt; каждое из слагаемых в правой части стремится к &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе по определению.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Longleftarrow &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе. Так же, как в предыдущих доказательствах, обозначим &amp;lt;tex&amp;gt;f(t) = \frac{t}{1+t}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\forall k:\ f(|x^{(n)}_k - x^{(m)}_k|) \le 2^k \rho(x^{(n)}, x^{(m)}) \to 0 &amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;|x^{(n)}_k - x^{(m)}_k| = \frac{1}{1 - f(|x^{(n)}_k - x^{(m)}_k|)} - 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе также и покоординатно.&lt;br /&gt;
&lt;br /&gt;
Но по полноте &amp;lt;tex&amp;gt; \mathbb R &amp;lt;/tex&amp;gt;, каждая из последовательностей по отдельной координате сходится: &amp;lt;tex&amp;gt; \forall k:\ x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как покоординатная сходимость в метрике &amp;lt;tex&amp;gt; \mathbb R^{\infty} &amp;lt;/tex&amp;gt; равносильна просто сходимости, то &amp;lt;tex&amp;gt; x^{(n)} \to x = (x_1, x_2, \ldots x_n, \ldots) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
компактность прямоугольника в R^infty&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Pi = [a_1, b_1] \times \dots \times [a_n, b_n] \dots&amp;lt;/tex&amp;gt; — компакт в &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n=1}^{\infty} {1 \over 2^n} {|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;{|x_n - y_n| \over 1 + |x_n - y_n|} \le 1&amp;lt;/tex&amp;gt;, также &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0 \exists n_0: \sum\limits_{n = n_0 + 1}^{\infty} {1 \over 2^n} &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;. Таким образом, для каждого &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; можно выбрать номер координаты &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;, такой, что все координаты с большими &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt; номерами суммарно влияют на метрику не больше, чем на &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расмотрим &amp;lt;tex&amp;gt;\Pi_{n_0} = [a_1, b_1] \times \dots \times [a_{n_0}, b_{n_0}] \subset R^{n_0}&amp;lt;/tex&amp;gt; — для него можно составить конечную &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; (понятно, что по каждой координате это сделать легко, а дальше возьмем декартово произведение). Сделаем сеть &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;\Pi&amp;lt;/tex&amp;gt; следующим образом: к каждой &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;-мерной точке из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; допишем произвольные координаты &amp;lt;tex&amp;gt;x_{n_0 + 1}, x_{n_0 + 2} \dots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x' \in \Pi\ \exists x \in \Pi_{n_0}: \rho (x', x) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По определению &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сети для &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x \in \Pi_{n_0} \exists a \in A: \rho(x, a) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По построению &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; и выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\forall a \in A\ \exists a' \in A': \rho(a, a') &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x' \in \Pi\ \exists a' \in A': \rho(x', a') \le \rho(x', x) + \rho(x, a) + \rho(a, a') \le 3 \varepsilon&amp;lt;/tex&amp;gt;, то есть построили конечную &amp;lt;tex&amp;gt;3\varepsilon&amp;lt;/tex&amp;gt;-сеть.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
А еще зачем-то можно рассмотреть для пространства с мерой на сигма-алгебре &amp;lt;tex&amp;gt; (X, \mathcal A, \mu) &amp;lt;/tex&amp;gt; пространство измеримых на &amp;lt;tex&amp;gt; E \in \mathcal A &amp;lt;/tex&amp;gt; вещественнозначных функций. Если ввести на нем метрику &amp;lt;tex&amp;gt;\rho(f, g) = \int\limits_E {|f - g| \over 1 + |f - g|} d \mu&amp;lt;/tex&amp;gt;, то сходимость последовательности функций в ней будет равносильна сходимости по мере.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Topological_space Topological space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Interior_(topology) Interior (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Closure_(topology) Closure (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Dense_(topology) Dense (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Nowhere_dense_set Nowhere dense set]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Compact_space Compact space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Totally_bounded_space Totally bounded space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Base_(topology) Base (topology)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Функциональный анализ 3 курс]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35961</id>
		<title>Метрические пространства</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35961"/>
				<updated>2014-01-20T19:45:48Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|id=defms&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, отображение &amp;lt;tex&amp;gt; \rho : X \times X \to \mathbb{R^+} &amp;lt;/tex&amp;gt; {{---}} называется '''метрикой''' на &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, если выполняются аксиомы&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \ge 0 ;\ \rho (x, y) = 0  \iff x = y &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) = \rho (y, x) &amp;lt;/tex&amp;gt; &lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \le \rho (x, z) + \rho (z, y) &amp;lt;/tex&amp;gt; {{---}} неравенство треугольника&lt;br /&gt;
&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называют '''метрическим пространством'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmsconv&lt;br /&gt;
|definition=&lt;br /&gt;
Последовательность &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; '''сходится''' к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; (записывают &amp;lt;tex&amp;gt; x = \lim\limits_{n \to \infty} x_n&amp;lt;/tex&amp;gt;), если &amp;lt;tex&amp;gt; \rho(x_n, x) \xrightarrow[n \to \infty]{} 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Некоторые примеры метрических пространств:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}, \rho(x, y) = | x - y |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^n, \rho(\overline x, \overline y) = \sqrt{\sum\limits_{i=1}^n (x_i - y_i)^2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\infty}&amp;lt;/tex&amp;gt;. Превращение в МП должно быть связано с желаемой операцией предельного перехода. В случае конечномерного пространства сходимость совпадает с покоординатной сходимостью, хотим того же самого для бесконечномерного. Введем метрику: &amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n = 1}^{\infty} {1 \over 2^n}{|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt; (стандартный способ превратить в метрическое пространство счетное произведение метрических пространств, коим и является &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;). Проверим, что эта метрика удовлетворяет аксиомам:&lt;br /&gt;
** этот ряд всегда сходящийся, так как мажорируется убывающей геометрической прогрессией &amp;lt;tex&amp;gt;\sum\limits_{n=1}^{\infty} {1 \over 2^n} = 1&amp;lt;/tex&amp;gt;, соответственно, расстояние ограничено единицей.&lt;br /&gt;
** первая аксиома: неотрицательность очевидна, равенство метрики нулю в обе стороны очевидно&lt;br /&gt;
** вторая аксиома: еще очевиднее&lt;br /&gt;
** третья аксиома легко вытекает из следующего утверждения:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt; {|x - z| \over 1 + |x - z|} \le {|x - y| \over 1 + |x - y|} + {|y - z| \over 1 + |y - z|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;f(t) = {t \over 1 + t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; f(t) &amp;lt;/tex&amp;gt; возрастает при &amp;lt;tex&amp;gt; t \in [0, \infty) &amp;lt;/tex&amp;gt;, поэтому, если &amp;lt;tex&amp;gt; 0 \le t_1 &amp;lt; t_2 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; f(t_1) &amp;lt; f(t_2) &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac{f(t)}{t} = \frac{1}{1 + t}&amp;lt;/tex&amp;gt; убывает при &amp;lt;tex&amp;gt;t \in [0, \infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(t_1) + f(t_2) = t_1 \frac{1}{1 + t_1} + t_2 \frac{1}{1 + t_2} \ge&amp;lt;/tex&amp;gt;(по убыванию &amp;lt;tex&amp;gt;\frac{1}{1 + t}&amp;lt;/tex&amp;gt;)&amp;lt;tex&amp;gt;\ge t_1 \frac{1}{1 + t_1 + t_2} + t_2 \frac{1}{1 + t_1 + t_2} = \frac{t_1 + t_2}{1 + t_1 + t_2} = f(t_1 + t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Так как &amp;lt;tex&amp;gt; |x - z| \le |x - y| + |y - z| &amp;lt;/tex&amp;gt; по свойствам &amp;lt;tex&amp;gt; | \cdot | &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; возрастает, то &amp;lt;tex&amp;gt; f(|x - z|) \le f(|x - y| + |y - z|)&amp;lt;/tex&amp;gt;. Так как знаем, что &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt;f(|x - y| + |y - z|) \le f(|x - y|) + f(|y - z|) &amp;lt;/tex&amp;gt;, то есть получили &amp;lt;tex&amp;gt;f(|x - z|) \le f(|x - y|) + f(|y - z|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=rinfcoordconv&lt;br /&gt;
|statement=Сходимость в метрике &amp;lt;tex&amp;gt; \mathbb{R}^{\infty} &amp;lt;/tex&amp;gt; эквивалентна покоординатной. &lt;br /&gt;
|proof=&lt;br /&gt;
Рассматриваем &amp;lt;tex&amp;gt; f(t) = \frac{t}{1+t} &amp;lt;/tex&amp;gt;, как и в прошлом утверждении.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} = (x^{(n)}_1, \dots, x^{(n)}_k, \dots), x = (x_1, \dots, x_k, \dots) &amp;lt;/tex&amp;gt;. Покажем, что &amp;lt;tex&amp;gt; x^{(n)} \to x \iff \forall k: x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В прямую сторону: &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le 2^k \rho(x^{(n)}, x) &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; {\varepsilon \over 2^k} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le \varepsilon &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; t = {1 \over 1 - f(t)} - 1 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; t \to 0 &amp;lt;/tex&amp;gt;, когда &amp;lt;tex&amp;gt; f(t) \to 0 &amp;lt;/tex&amp;gt;, а значит, покоординатная сходимость выполняется. &lt;br /&gt;
&lt;br /&gt;
В обратную сторону: подберем такое &amp;lt;tex&amp;gt; k_0 &amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt; {\sum\limits_{k = k_0 + 1}^{\infty} {1 \over 2^k}} &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Возьмем &amp;lt;tex&amp;gt; n_0 &amp;lt;/tex&amp;gt; таким, чтобы &amp;lt;tex&amp;gt; \forall k \le k_0, n &amp;gt; n_0: |x^{(n)}_k - x_k| &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; \sum\limits_{k = 1}^{k_0} {\varepsilon \over 2^k} + \varepsilon &amp;lt; 2 \varepsilon &amp;lt;/tex&amp;gt;. Устремляя &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; к нулю, получаем необходимое. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* В любом пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; можно ввести дискретную метрику: &amp;lt;tex&amp;gt;\rho(x, y) = \begin{cases} 0; &amp;amp; x = y \\ 1; &amp;amp; x \ne y \end{cases}&amp;lt;/tex&amp;gt;. Заметим, что в дискретной метрике сходятся только стационарные последовательности.&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, то есть множество всех функций из &amp;lt;tex&amp;gt;\mathbb{I} = [0; 1]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;. Это пространство не метризуется, то есть не существует метрики, в которой сходимость эквивалентна поточечной &amp;lt;ref&amp;gt;Кому интересно: метрическое пространство удовлетворяет первой аксиоме счетности, а она не может выполняться в &amp;lt;tex&amp;gt;X = \mathbb{I}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, которое понятно как сводится к &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;: [http://math.stackexchange.com/questions/65472/why-is-0-10-1-not-first-countable ''Why is &amp;lt;tex&amp;gt;[0,1]^{[0,1]}&amp;lt;/tex&amp;gt; not first countable?'']&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Центральную роль в изучении МП играют шары:&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defob&lt;br /&gt;
|definition=&lt;br /&gt;
'''Открытым шаром''' в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; с радиусом &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и центром в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; называют множество &amp;lt;tex&amp;gt;V_r(a) = \{ x \mid \rho(x, a) &amp;lt; r \} &amp;lt;/tex&amp;gt;. В определении '''замкнутого шара''' знак &amp;lt;tex&amp;gt;&amp;lt;&amp;lt;/tex&amp;gt; заменяется на &amp;lt;tex&amp;gt;\le&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
На базе этих множеств можно МП превратить в ТП.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defts&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, класс множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; называется '''топологией''', если:&lt;br /&gt;
# &amp;lt;tex&amp;gt; X, \varnothing \in \tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое объединение (возможно, несчетное) &amp;lt;tex&amp;gt;\bigcup\limits_{\alpha} G_{\alpha}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое конечное пересечение &amp;lt;tex&amp;gt;\bigcap\limits_{i=1}^{n} G_i&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt; называют '''топологическим пространством'''. Множества, принадлежащие &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;, называются '''открытыми'''. '''Замкнутыми''' называются множества-дополнения к множествам из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defint&lt;br /&gt;
|definition=&lt;br /&gt;
Рассмотрим множество &amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Внутренностью (interior)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Int} A = \bigcup\limits_{G \subset A} G&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; — открытые множества.&lt;br /&gt;
&lt;br /&gt;
'''Замыкание (closure)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Cl} A = \bigcap\limits_{A \subset F } F&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; — замкнутые множества.&lt;br /&gt;
&lt;br /&gt;
'''Границей (boundary, frontier)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Fr} A = \mathrm{Cl} A \setminus \mathrm{Int} A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftslimit&lt;br /&gt;
|definition=&lt;br /&gt;
Точка &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; называется '''пределом последовательности &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; в топологическом пространстве''' &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\forall G \ni x\ \exists N\ \forall n &amp;gt; N: x_n \in G&amp;lt;/tex&amp;gt;, то есть любое открытое множество, содержащее предел, также содержит все точки последовательности кроме конечного числа.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defnbh&lt;br /&gt;
|definition=&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; называется '''окрестностью''' в ТП, если существует открытое &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x \in G \subset U&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defcont&lt;br /&gt;
|definition=&lt;br /&gt;
Отображение &amp;lt;tex&amp;gt;f: (X, \tau_1) \to (Y, \tau_2)&amp;lt;/tex&amp;gt; называют непрерывным в точке &amp;lt;tex&amp;gt;x \in X&amp;lt;/tex&amp;gt;, если для любой окрестности &amp;lt;tex&amp;gt;U_{f(x)}&amp;lt;/tex&amp;gt; существует окрестность &amp;lt;tex&amp;gt;U_x&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;f(U_x) \subset U_{f(x)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Характеристика непрерывных отображений ТП: &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; непрерывно, если для любого &amp;lt;tex&amp;gt;G' \in \tau_2: f^{-1}(G') \in \tau_1&amp;lt;/tex&amp;gt;, то есть прообраз любого открытого множества также открыт.&amp;lt;ref&amp;gt;В конспекте только в прямую сторону, но вообще, вроде, это критерий. Док-во есть в Колмогорове, элементы теории функции и функана, 6 издание, страница 107.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для любого МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; можно ввести '''метрическую топологию''': выделим в семейство открытых множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;  множества, являющимися объединениями любого (возможно, несчетного) числа открытых шаров. Покажем, что это семейство удовлетворяет аксиомам ТП:&lt;br /&gt;
# Очевидно, &amp;lt;tex&amp;gt;X = \bigcup\limits_{x \in X}\bigcup\limits_{i=1}^{\infty}U_i(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Очевидно.&lt;br /&gt;
# Докажем для пересечения двух множеств, дальше по индукции:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;G_1 \bigcap G_2 = (\bigcup\limits_{\alpha} V') \bigcap (\bigcup\limits_{\beta} V'') = \bigcup\limits_{\alpha, \beta} (V' \bigcap V'')&amp;lt;/tex&amp;gt;. (То, что так можно сделать, доказывается включением в обе стороны)&lt;br /&gt;
#: Рассмотрим &amp;lt;tex&amp;gt;V' \bigcap V''&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x \in V' \bigcap V'' \exists V(x) \subset V' \bigcap V''&amp;lt;/tex&amp;gt; (раньше когда-то доказывали), тогда &amp;lt;tex&amp;gt;V' \bigcap V'' = \bigcup\limits_{x \in V' \cap V''} V(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае открытые множества были получены объединением открытых шаров — множеств более узкого класса. Это один из общих приемов превращения произвольного пространства в топологическое, открытые шары здесь — база топологии.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftbase&lt;br /&gt;
|definition=&lt;br /&gt;
'''Базой топологии''' называют некоторый набор открытых множеств &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;, такой, что &amp;lt;tex&amp;gt; \forall G \in \tau:\ G = \bigcup\limits_{V \in \sigma} V &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое множество можно представить в виде объединения множеств из &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=contrho&lt;br /&gt;
|statement=&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;f(x) = \rho(x, A)&amp;lt;/tex&amp;gt; равномерно непрерывна.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall a \in A, x_1, x_2 \in X: \rho(x_1, a) \le \rho(x_1, x_2) + \rho(x_2, a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(x_1, A) \le \rho(x_1, a), \forall \varepsilon &amp;gt; 0\ \exists a_\varepsilon \in A: \rho(x_2, a_\varepsilon) &amp;lt; \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\rho(x_1, A) &amp;lt; \rho(x_1, x_2) + \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично, &amp;lt;tex&amp;gt;\rho(x_2, A) &amp;lt; \rho(x_1, x_2) + \rho(x_1, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда, &amp;lt;tex&amp;gt;|\rho(x_1, A) - \rho(x_2, A)| &amp;lt; \rho(x_1, x_2) + \varepsilon&amp;lt;/tex&amp;gt;, устремляя &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; к нулю, получаем равномерную непрерывность &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; по определению.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=propcl&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Cl} A = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\rho(x, A) = \inf\limits_{a \in A} \rho(x, a)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;B = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;. Понятно, что если некоторая последовательность &amp;lt;tex&amp;gt;x_n \in B&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(x_n, A) = 0&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\rho(x, A) = 0&amp;lt;/tex&amp;gt;, то есть, по определению &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;B = \mathrm{Cl} B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;a \in A&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(a, A) = 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \subset B&amp;lt;/tex&amp;gt;, а раз &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто, то &amp;lt;tex&amp;gt;\mathrm{Cl} A \subset B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь покажем, что &amp;lt;tex&amp;gt;B \subset \mathrm{Cl} A &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;B \subset \bigcap\limits_{A \subset F } F &amp;lt;/tex&amp;gt;, или что для любого &amp;lt;tex&amp;gt;F: A \subset F&amp;lt;/tex&amp;gt;, выполняется &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Допустим, это неверно, и &amp;lt;tex&amp;gt;\exists b \in B: b \notin F&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;b \in X \setminus F = G = \bigcup\limits_{\alpha} V_{r_\alpha}(x_\alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt; b \in V_r(b) \subset X \setminus F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b \in B, \rho(b, A) = 0&amp;lt;/tex&amp;gt;, следовательно, есть последовательность &amp;lt;tex&amp;gt;a_n \in A: \rho(b, a_n) \to 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, больших некоторого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\rho(b, a_n) &amp;lt; r&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;a_n \in V_r(b)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;A \cap V_r(b)&amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt;A \subset F \implies A \cap G = \varnothing &amp;lt;/tex&amp;gt; {{---}} противоречие, &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Замечание: в общем случае в топологических пространствах замыкания не определяются через предел последовательности, в этом смысле метрические пространства удобны.&lt;br /&gt;
&lt;br /&gt;
Метрические пространства удовлетворяют [http://en.wikipedia.org/wiki/Separation_axiom#Main_definitions аксиоме нормальности]:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=msnorm&lt;br /&gt;
|about=&lt;br /&gt;
нормальность МП&lt;br /&gt;
|statement=&lt;br /&gt;
Любое МП - нормальное, то есть любые два непересекающихся замкнутых подмножества имеют непересекающиеся окрестности.&lt;br /&gt;
|proof=&lt;br /&gt;
(скопировано из первого курса, в Колмогорове на странице 112 есть доказательство поприятнее и поинтуитивнее)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; f(x) = \frac {\rho(x, F_1)} {\rho(x, F_1) + \rho(x, F_2)} &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; F_1 \cap F_2 = \varnothing &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; F_1, F_2 &amp;lt;/tex&amp;gt; - замкнуты, то знаменатель не равен 0. Следовательно, &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; корректна и непрерывна в силу непрерывности &amp;lt;tex&amp;gt; \rho &amp;lt;/tex&amp;gt;. При этом: &amp;lt;tex&amp;gt; x \in F_1 \implies f(x) = 0; x \in F_2: f(x) = 1 &amp;lt;/tex&amp;gt;. Рассмотрим на R пару интервалов: &amp;lt;tex&amp;gt; (- \infty; \frac 1 3) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; (\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; неперывна, то прообраз открытого множества - открытое множество (это другое определение непрерывного отображения, оно почти эквивалентно тому, которое было дано ранее).&lt;br /&gt;
: &amp;lt;tex&amp;gt; G_1 = f^{-1} ( - \infty; \frac 1 3); G_2 = f^{-1}(\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; F_1 \in G_1; F_2 \in G_2; G_1 \cap G_2 = \varnothing &amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следствие: так как одноточечные подмножества в МП являются замкнутыми, МП удовлетворяют аксиоме отделимости Хаусдорфа: любые две различные точки можно отделить открытыми шарами. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompl&lt;br /&gt;
|definition=&lt;br /&gt;
МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называется '''полным''', если в нем любая сходящаяся в себе последовательность сходится к элементу &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
принцип вложенных шаров&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — полное. &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; — замкнутые шары. &amp;lt;tex&amp;gt;\overline V_{n + 1} \subset \overline V_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\bigcap\limits_{n=1}^{\infty} \overline V_n \ne \varnothing&amp;lt;/tex&amp;gt;, и состоит из одной точки.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; — центр соответствующего шара, тогда из вложенности &amp;lt;tex&amp;gt;\forall m &amp;gt; n: \rho(a_n, a_m) &amp;lt; r_n&amp;lt;/tex&amp;gt;, то есть последовательность центров сходится в себе, так как &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;, тогда по полноте пространства последовательность центров сходится к &amp;lt;tex&amp;gt;a \in X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt; a \in \bigcap\limits_{n=1}^{\infty} \overline V_n &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\forall n: a \in \overline V_n&amp;lt;/tex&amp;gt;. Для любого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шар &amp;lt;tex&amp;gt;\overline V_n &amp;lt;/tex&amp;gt; содержит все точки последовательности &amp;lt;tex&amp;gt;\{a_n \}&amp;lt;/tex&amp;gt;, кроме конечного числа. Тогда оставшаяся последовательность центров содержится в &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; и также сходится к &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt; \overline V_n&amp;lt;/tex&amp;gt; — замкнутое множество, [[Метрическое пространство#Основное характеристическое свойство замкнутых множеств | оно содержит предел этой последовательности]] и &amp;lt;tex&amp;gt;a \in \overline V_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также, кроме &amp;lt;tex&amp;gt;a &amp;lt;/tex&amp;gt; в пересечение ничего входить не может: пусть в него еще входит точка &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;,тогда &amp;lt;tex&amp;gt;\rho(a, b) &amp;gt; 0&amp;lt;/tex&amp;gt;, возьмем шар в пересечении радиусом меньше &amp;lt;tex&amp;gt;\rho(a, b) \over 2&amp;lt;/tex&amp;gt; (такой есть по стремлению радиусов к &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;), но в нем может лежать только одна из точек &amp;lt;tex&amp;gt;a,b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defdense&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''всюду плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\mathrm{Cl} A = X&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Q}&amp;lt;/tex&amp;gt; всюду плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;\mathrm{Cl} \mathbb{Q} = \mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если в пространстве существует счетное всюду плотное множество, такое пространство называют '''сепарабельным'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''нигде не плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;mathrm{Int} \mathrm{Cl} A = \varnothing&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Z}&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; (X, \rho) &amp;lt;/tex&amp;gt;. Тогда в любом шаре есть шар, не содержащий точек &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; B = \mathrm{Cl} A &amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \mathrm{Int} B = \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это значит, что &amp;lt;tex&amp;gt;\bigcup\limits_{G \subset B} G = \varnothing &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не является подмножеством &amp;lt;tex&amp;gt; B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный открытый шар &amp;lt;tex&amp;gt; V &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; V = (V \cap B) \cup (V \cap \overline B) &amp;lt;/tex&amp;gt;. Из наших рассуждений следует, что &amp;lt;tex&amp;gt; V \cap \overline B &amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt; \overline B &amp;lt;/tex&amp;gt; {{---}} открытое множество, &amp;lt;tex&amp;gt; \overline B = \bigcup\limits_{\alpha} V_{r_\alpha}(a_\alpha) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \exists V_1: V \cap V_1 \ne \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда можно просто выбрать &amp;lt;tex&amp;gt; V_r(a) \subset V \cap V_1 &amp;lt;/tex&amp;gt;, он и будет искомым шаром без точек &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defbaire&lt;br /&gt;
|definition=&lt;br /&gt;
Подмножество &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; топологического пространства &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; имеет '''I категорию по Бэру в пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;''', если оно является не более чем счетным объединением нигде не плотных в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; множеств. В противном случае оно имеет '''II категорию по Бэру'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thbaire&lt;br /&gt;
|author=Бэр&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП является множеством II категории в себе.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — полное и является множеством I категории, то есть представимо как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} M_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; — нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;. Возьмем замкнутый шар &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, например, радиуса 1. Так как &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, оно также нигде не плотно в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, а, значит, существует замкнутый шар &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt; радиуса меньше &amp;lt;tex&amp;gt;1 \over 2&amp;lt;/tex&amp;gt;, содержащийся в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt; и не пересекающийся с &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;M_1 \cap \overline V_1 = \varnothing&amp;lt;/tex&amp;gt;). Аналогично, &amp;lt;tex&amp;gt;M_2&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt;, и так далее действуя таким образом, построим систему вложенных замкнутых шаров (&amp;lt;tex&amp;gt;\overline V_{n+1} \subset \overline V_n&amp;lt;/tex&amp;gt;) со стремящимся к нулю радиусом. В силу теоремы о вложенных шарах пересечение этих шаров должно содержать какую-то точку &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, но эта точка не может лежать ни в одном из множеств &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; по построению, то есть, получили противоречие, и &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; не является множеством первой категории.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=следствие из т. Бэра&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП без изолированных точек несчетно.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — МП без изолированных точек (то есть в любой окрестности любой точки найдутся точки, отличные от нее). Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — счетно, то есть, можно занумеровать его элементы как &amp;lt;tex&amp;gt;\{ x_1 \dots x_n \dots \}&amp;lt;/tex&amp;gt; и представить &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} \{ x_n \}&amp;lt;/tex&amp;gt;. Но одноточечные множества нигде не плотны в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;: рассмотрим шар &amp;lt;tex&amp;gt; V_r(p) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; p = x_n &amp;lt;/tex&amp;gt;, то внутри шара есть шар с центром не в &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; меньшего радиуса, так как &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; не является изолированной точкой; для остальных шаров можно взять шар радиуса, меньшего, чем &amp;lt;tex&amp;gt; \rho(x, p) &amp;lt;/tex&amp;gt; с центром также в &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; является множеством I категории, что противоречит теореме Бэра. Следовательно, &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; должно быть несчетно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Это следствие объясняет природу несчетности вещественной оси. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompact&lt;br /&gt;
|definition=&lt;br /&gt;
Замкнутое &amp;lt;tex&amp;gt;K \subset X&amp;lt;/tex&amp;gt; называют '''компактом''', если из любой последовательности точек в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; можно выделить сходящуюся подпоследовательность, предел которой также принадлежит &amp;lt;tex&amp;gt; K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmstb&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt; называют '''вполне ограниченным''', если для него при любом &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; существует конечная &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть, то есть &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \exists x_1, x_2 \dots x_n: A \subset \bigcup\limits_{i=1}^n V_{\varepsilon}(x_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thhausdorf&lt;br /&gt;
|author=Хаусдорф&lt;br /&gt;
|statement=&lt;br /&gt;
В полном метрическом пространстве множество является компактом тогда и только тогда, когда оно замкнуто и вполне ограничено.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Теорема Хаусдорфа об ε-сетях]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пример: &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt; — полное.&lt;br /&gt;
|proof=&lt;br /&gt;
Нужно установить равносильность сходимости &amp;lt;tex&amp;gt; \overline x^{(n)} \in R^{\infty} &amp;lt;/tex&amp;gt; и ее сходимости в себе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \implies &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \lim\limits_{n \to \infty} x^{(n)} = x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \rho(x^{(n)}, x^{(m)}) \le \rho(x^{(n)}, x) + \rho(x^{(m)}, x) &amp;lt;/tex&amp;gt;, и при &amp;lt;tex&amp;gt; n, m \to \infty &amp;lt;/tex&amp;gt; каждое из слагаемых в правой части стремится к &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе по определению.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Longleftarrow &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе. Так же, как в предыдущих доказательствах, обозначим &amp;lt;tex&amp;gt;f(t) = \frac{t}{1+t}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\forall k:\ f(|x^{(n)}_k - x^{(m)}_k|) \le 2^k \rho(x^{(n)}, x^{(m)}) \to 0 &amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;|x^{(n)}_k - x^{(m)}_k| = \frac{1}{1 - f(|x^{(n)}_k - x^{(m)}_k|)} - 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе также и покоординатно.&lt;br /&gt;
&lt;br /&gt;
Но по полноте &amp;lt;tex&amp;gt; \mathbb R &amp;lt;/tex&amp;gt;, каждая из последовательностей по отдельной координате сходится: &amp;lt;tex&amp;gt; \forall k:\ x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как покоординатная сходимость в метрике &amp;lt;tex&amp;gt; \mathbb R^{\infty} &amp;lt;/tex&amp;gt; равносильна просто сходимости, то &amp;lt;tex&amp;gt; x^{(n)} \to x = (x_1, x_2, \ldots x_n, \ldots) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
компактность прямоугольника в R^infty&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Pi = [a_1, b_1] \times \dots \times [a_n, b_n] \dots&amp;lt;/tex&amp;gt; — компакт в &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n=1}^{\infty} {1 \over 2^n} {|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;{|x_n - y_n| \over 1 + |x_n - y_n|} \le 1&amp;lt;/tex&amp;gt;, также &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0 \exists n_0: \sum\limits_{n = n_0 + 1}^{\infty} {1 \over 2^n} &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;. Таким образом, для каждого &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; можно выбрать номер координаты &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;, такой, что все координаты с большими &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt; номерами суммарно влияют на метрику не больше, чем на &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расмотрим &amp;lt;tex&amp;gt;\Pi_{n_0} = [a_1, b_1] \times \dots \times [a_{n_0}, b_{n_0}] \subset R^{n_0}&amp;lt;/tex&amp;gt; — для него можно составить конечную &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; (понятно, что по каждой координате это сделать легко, а дальше возьмем декартово произведение). Сделаем сеть &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;\Pi&amp;lt;/tex&amp;gt; следующим образом: к каждой &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;-мерной точке из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; допишем произвольные координаты &amp;lt;tex&amp;gt;x_{n_0 + 1}, x_{n_0 + 2} \dots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x' \in \Pi\ \exists x \in \Pi_{n_0}: \rho (x', x) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По определению &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сети для &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x \in \Pi_{n_0} \exists a \in A: \rho(x, a) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По построению &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; и выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\forall a \in A\ \exists a' \in A': \rho(a, a') &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x' \in \Pi\ \exists a' \in A': \rho(x', a') \le \rho(x', x) + \rho(x, a) + \rho(a, a') \le 3 \varepsilon&amp;lt;/tex&amp;gt;, то есть построили конечную &amp;lt;tex&amp;gt;3\varepsilon&amp;lt;/tex&amp;gt;-сеть.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
А еще зачем-то можно рассмотреть для пространства с мерой на сигма-алгебре &amp;lt;tex&amp;gt; (X, \mathcal A, \mu) &amp;lt;/tex&amp;gt; пространство измеримых на &amp;lt;tex&amp;gt; E \in \mathcal A &amp;lt;/tex&amp;gt; вещественнозначных функций. Если ввести на нем метрику &amp;lt;tex&amp;gt;\rho(f, g) = \int\limits_E {|f - g| \over 1 + |f - g|} d \mu&amp;lt;/tex&amp;gt;, то сходимость последовательности функций в ней будет равносильна сходимости по мере.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Topological_space Topological space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Interior_(topology) Interior (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Closure_(topology) Closure (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Dense_(topology) Dense (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Nowhere_dense_set Nowhere dense set]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Compact_space Compact space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Totally_bounded_space Totally bounded space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Base_(topology) Base (topology)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Функциональный анализ 3 курс]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35960</id>
		<title>Метрические пространства</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9C%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D1%81%D1%82%D0%B2%D0%B0&amp;diff=35960"/>
				<updated>2014-01-20T19:44:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Определение&lt;br /&gt;
|id=defms&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, отображение &amp;lt;tex&amp;gt; \rho : X \times X \to \mathbb{R^+} &amp;lt;/tex&amp;gt; {{---}} называется '''метрикой''' на &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, если выполняются аксиомы&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \ge 0 ;\ \rho (x, y) = 0  \iff x = y &amp;lt;/tex&amp;gt;&lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) = \rho (y, x) &amp;lt;/tex&amp;gt; &lt;br /&gt;
# &amp;lt;tex&amp;gt; \rho (x, y) \le \rho (x, z) + \rho (z, y) &amp;lt;/tex&amp;gt; {{---}} неравенство треугольника&lt;br /&gt;
&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называют '''метрическим пространством'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmsconv&lt;br /&gt;
|definition=&lt;br /&gt;
Последовательность &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; '''сходится''' к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; (записывают &amp;lt;tex&amp;gt; x = \lim\limits_{n \to \infty} x_n&amp;lt;/tex&amp;gt;), если &amp;lt;tex&amp;gt; \rho(x_n, x) \xrightarrow[n \to \infty]{} 0&amp;lt;/tex&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Некоторые примеры метрических пространств:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}, \rho(x, y) = | x - y |&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^n, \rho(\overline x, \overline y) = \sqrt{\sum\limits_{i=1}^n (x_i - y_i)^2}&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\infty}&amp;lt;/tex&amp;gt;. Превращение в МП должно быть связано с желаемой операцией предельного перехода. В случае конечномерного пространства сходимость совпадает с покоординатной сходимостью, хотим того же самого для бесконечномерного. Введем метрику: &amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n = 1}^{\infty} {1 \over 2^n}{|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt; (стандартный способ превратить в метрическое пространство счетное произведение метрических пространств, коим и является &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;). Проверим, что эта метрика удовлетворяет аксиомам:&lt;br /&gt;
** этот ряд всегда сходящийся, так как мажорируется убывающей геометрической прогрессией &amp;lt;tex&amp;gt;\sum\limits_{n=1}^{\infty} {1 \over 2^n} = 1&amp;lt;/tex&amp;gt;, соответственно, расстояние ограничено единицей.&lt;br /&gt;
** первая аксиома: неотрицательность очевидна, равенство метрики нулю в обе стороны очевидно&lt;br /&gt;
** вторая аксиома: еще очевиднее&lt;br /&gt;
** третья аксиома легко вытекает из следующего утверждения:&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&amp;lt;tex&amp;gt; {|x - z| \over 1 + |x - z|} \le {|x - y| \over 1 + |x - y|} + {|y - z| \over 1 + |y - z|}&amp;lt;/tex&amp;gt;&lt;br /&gt;
|proof=&lt;br /&gt;
Рассмотрим &amp;lt;tex&amp;gt;f(t) = {t \over 1 + t}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; f(t) &amp;lt;/tex&amp;gt; возрастает при &amp;lt;tex&amp;gt; t \in [0, \infty) &amp;lt;/tex&amp;gt;, поэтому, если &amp;lt;tex&amp;gt; 0 \le t_1 &amp;lt; t_2 &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; f(t_1) &amp;lt; f(t_2) &amp;lt;/tex&amp;gt;&lt;br /&gt;
* &amp;lt;tex&amp;gt; \frac{f(t)}{t} = \frac{1}{1 + t}&amp;lt;/tex&amp;gt; убывает при &amp;lt;tex&amp;gt;t \in [0, \infty)&amp;lt;/tex&amp;gt;&lt;br /&gt;
Покажем, что для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; выполняется &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;f(t_1) + f(t_2) = t_1 \frac{1}{1 + t_1} + t_2 \frac{1}{1 + t_2} \ge&amp;lt;/tex&amp;gt;(по убыванию &amp;lt;tex&amp;gt;\frac{1}{1 + t}&amp;lt;/tex&amp;gt;)&amp;lt;tex&amp;gt;\ge t_1 \frac{1}{1 + t_1 + t_2} + t_2 \frac{1}{1 + t_1 + t_2} = \frac{t_1 + t_2}{1 + t_1 + t_2} = f(t_1 + t_2)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
Так как &amp;lt;tex&amp;gt; |x - z| \le |x - y| + |y - z| &amp;lt;/tex&amp;gt; по свойствам &amp;lt;tex&amp;gt; | \cdot | &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; возрастает, то &amp;lt;tex&amp;gt; f(|x - z|) \le f(|x - y| + |y - z|)&amp;lt;/tex&amp;gt;. Так как знаем, что &amp;lt;tex&amp;gt;f(t_1 + t_2) \le f(t_1) + f(t_2)&amp;lt;/tex&amp;gt;, получаем &amp;lt;tex&amp;gt;f(|x - y| + |y - z|) \le f(|x - y|) + f(|y - z|) &amp;lt;/tex&amp;gt;, то есть получили &amp;lt;tex&amp;gt;f(|x - z|) \le f(|x - y|) + f(|y - z|)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}} &lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=rinfcoordconv&lt;br /&gt;
|statement=Сходимость в метрике &amp;lt;tex&amp;gt; \mathbb{R}^{\infty} &amp;lt;/tex&amp;gt; эквивалентна покоординатной. &lt;br /&gt;
|proof=&lt;br /&gt;
Рассматриваем &amp;lt;tex&amp;gt; f(t) = \frac{t}{1+t} &amp;lt;/tex&amp;gt;, как и в прошлом утверждении.&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} = (x^{(n)}_1, \dots, x^{(n)}_k, \dots), x = (x_1, \dots, x_k, \dots) &amp;lt;/tex&amp;gt;. Покажем, что &amp;lt;tex&amp;gt; x^{(n)} \to x \iff \forall k: x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
В прямую сторону: &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le 2^k \rho(x^{(n)}, x) &amp;lt;/tex&amp;gt;. Пусть &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; {\varepsilon \over 2^k} &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; f(|x^{(n)}_k - x_k|) \le \varepsilon &amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt; t = {1 \over 1 - f(t)} - 1 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; t \to 0 &amp;lt;/tex&amp;gt;, когда &amp;lt;tex&amp;gt; f(t) \to 0 &amp;lt;/tex&amp;gt;, а значит, покоординатная сходимость выполняется. &lt;br /&gt;
&lt;br /&gt;
В обратную сторону: подберем такое &amp;lt;tex&amp;gt; k_0 &amp;lt;/tex&amp;gt;, чтобы &amp;lt;tex&amp;gt; {\sum\limits_{k = k_0 + 1}^{\infty} {1 \over 2^k}} &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Возьмем &amp;lt;tex&amp;gt; n_0 &amp;lt;/tex&amp;gt; таким, чтобы &amp;lt;tex&amp;gt; \forall k \le k_0, n &amp;gt; n_0: |x^{(n)}_k - x_k| &amp;lt; \varepsilon &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; \rho(x^{(n)}, x) &amp;lt; \sum\limits_{k = 1}^{k_0} {\varepsilon \over 2^k} + \varepsilon &amp;lt; 2 \varepsilon &amp;lt;/tex&amp;gt;. Устремляя &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; к нулю, получаем необходимое. &lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
* В любом пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; можно ввести дискретную метрику: &amp;lt;tex&amp;gt;\rho(x, y) = \begin{cases} 0; &amp;amp; x = y \\ 1; &amp;amp; x \ne y \end{cases}&amp;lt;/tex&amp;gt;. Заметим, что в дискретной метрике сходятся только стационарные последовательности.&lt;br /&gt;
* &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, то есть множество всех функций из &amp;lt;tex&amp;gt;\mathbb{I} = [0; 1]&amp;lt;/tex&amp;gt; в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;. Это пространство не метризуется, то есть не существует метрики, в которой сходимость эквивалентна поточечной &amp;lt;ref&amp;gt;Кому интересно: метрическое пространство удовлетворяет первой аксиоме счетности, а она не может выполняться в &amp;lt;tex&amp;gt;X = \mathbb{I}^{\mathbb{I}}&amp;lt;/tex&amp;gt;, которое понятно как сводится к &amp;lt;tex&amp;gt;X = \mathbb{R}^{\mathbb{I}}&amp;lt;/tex&amp;gt;: [http://math.stackexchange.com/questions/65472/why-is-0-10-1-not-first-countable ''Why is &amp;lt;tex&amp;gt;[0,1]^{[0,1]}&amp;lt;/tex&amp;gt; not first countable?'']&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Центральную роль в изучении МП играют шары:&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defob&lt;br /&gt;
|definition=&lt;br /&gt;
'''Открытым шаром''' в МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; с радиусом &amp;lt;tex&amp;gt;r&amp;lt;/tex&amp;gt; и центром в &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt; называют множество &amp;lt;tex&amp;gt;V_r(a) = \{ x \mid \rho(x, a) &amp;lt; r \} &amp;lt;/tex&amp;gt;. В определении '''замкнутого шара''' знак &amp;lt;tex&amp;gt;&amp;lt;&amp;lt;/tex&amp;gt; заменяется на &amp;lt;tex&amp;gt;\le&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
На базе этих множеств можно МП превратить в ТП.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defts&lt;br /&gt;
|definition=&lt;br /&gt;
Для некоторого множества &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, класс множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; называется '''топологией''', если:&lt;br /&gt;
# &amp;lt;tex&amp;gt; X, \varnothing \in \tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое объединение (возможно, несчетное) &amp;lt;tex&amp;gt;\bigcup\limits_{\alpha} G_{\alpha}&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
# Любое конечное пересечение &amp;lt;tex&amp;gt;\bigcap\limits_{i=1}^{n} G_i&amp;lt;/tex&amp;gt; из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt; принадлежит &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;&lt;br /&gt;
Пару &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt; называют '''топологическим пространством'''. Множества, принадлежащие &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;, называются '''открытыми'''. '''Замкнутыми''' называются множества-дополнения к множествам из &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defint&lt;br /&gt;
|definition=&lt;br /&gt;
Рассмотрим множество &amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Внутренностью (interior)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Int} A = \bigcup\limits_{G \subset A} G&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; — открытые множества.&lt;br /&gt;
&lt;br /&gt;
'''Замыкание (closure)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Cl} A = \bigcap\limits_{A \subset F } F&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt; F &amp;lt;/tex&amp;gt; — замкнутые множества.&lt;br /&gt;
&lt;br /&gt;
'''Границей (boundary, frontier)''' множества &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; называется множество &amp;lt;tex&amp;gt;\mathrm{Fr} A = \mathrm{Cl} A \setminus \mathrm{Int} A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftslimit&lt;br /&gt;
|definition=&lt;br /&gt;
Точка &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; называется '''пределом последовательности &amp;lt;tex&amp;gt;x_n&amp;lt;/tex&amp;gt; в топологическом пространстве''' &amp;lt;tex&amp;gt;(X, \tau)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\forall G \ni x\ \exists N\ \forall n &amp;gt; N: x_n \in G&amp;lt;/tex&amp;gt;, то есть любое открытое множество, содержащее предел, также содержит все точки последовательности кроме конечного числа.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defnbh&lt;br /&gt;
|definition=&lt;br /&gt;
Множество &amp;lt;tex&amp;gt;U&amp;lt;/tex&amp;gt; называется '''окрестностью''' в ТП, если существует открытое &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;x \in G \subset U&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defcont&lt;br /&gt;
|definition=&lt;br /&gt;
Отображение &amp;lt;tex&amp;gt;f: (X, \tau_1) \to (Y, \tau_2)&amp;lt;/tex&amp;gt; называют непрерывным в точке &amp;lt;tex&amp;gt;x \in X&amp;lt;/tex&amp;gt;, если для любой окрестности &amp;lt;tex&amp;gt;U_{f(x)}&amp;lt;/tex&amp;gt; существует окрестность &amp;lt;tex&amp;gt;U_x&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;f(U_x) \subset U_{f(x)}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Характеристика непрерывных отображений ТП: &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; непрерывно, если для любого &amp;lt;tex&amp;gt;G' \in \tau_2: f^{-1}(G') \in \tau_1&amp;lt;/tex&amp;gt;, то есть прообраз любого открытого множества также открыт.&amp;lt;ref&amp;gt;В конспекте только в прямую сторону, но вообще, вроде, это критерий. Док-во есть в Колмогорове, элементы теории функции и функана, 6 издание, страница 107.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для любого МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; можно ввести '''метрическую топологию''': выделим в семейство открытых множеств &amp;lt;tex&amp;gt;\tau&amp;lt;/tex&amp;gt;  множества, являющимися объединениями любого (возможно, несчетного) числа открытых шаров. Покажем, что это семейство удовлетворяет аксиомам ТП:&lt;br /&gt;
# Очевидно, &amp;lt;tex&amp;gt;X = \bigcup\limits_{x \in X}\bigcup\limits_{i=1}^{\infty}U_i(x)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
# Очевидно.&lt;br /&gt;
# Докажем для пересечения двух множеств, дальше по индукции:&lt;br /&gt;
#: &amp;lt;tex&amp;gt;G_1 \bigcap G_2 = (\bigcup\limits_{\alpha} V') \bigcap (\bigcup\limits_{\beta} V'') = \bigcup\limits_{\alpha, \beta} (V' \bigcap V'')&amp;lt;/tex&amp;gt;. (То, что так можно сделать, доказывается включением в обе стороны)&lt;br /&gt;
#: Рассмотрим &amp;lt;tex&amp;gt;V' \bigcap V''&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x \in V' \bigcap V'' \exists V(x) \subset V' \bigcap V''&amp;lt;/tex&amp;gt; (раньше когда-то доказывали), тогда &amp;lt;tex&amp;gt;V' \bigcap V'' = \bigcup\limits_{x \in V' \cap V''} V(x)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае открытые множества были получены объединением открытых шаров — множеств более узкого класса. Это один из общих приемов превращения произвольного пространства в топологическое, открытые шары здесь — база топологии.&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=deftbase&lt;br /&gt;
|definition=&lt;br /&gt;
'''Базой топологии''' называют некоторый набор открытых множеств &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;, такой, что &amp;lt;tex&amp;gt; \forall G \in \tau:\ G = \bigcup\limits_{V \in \sigma} V &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое множество можно представить в виде объединения множеств из &amp;lt;tex&amp;gt;\sigma&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=contrho&lt;br /&gt;
|statement=&lt;br /&gt;
Функция &amp;lt;tex&amp;gt;f(x) = \rho(x, A)&amp;lt;/tex&amp;gt; равномерно непрерывна.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\forall a \in A, x_1, x_2 \in X: \rho(x_1, a) \le \rho(x_1, x_2) + \rho(x_2, a)&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(x_1, A) \le \rho(x_1, a), \forall \varepsilon &amp;gt; 0\ \exists a_\varepsilon \in A: \rho(x_2, a_\varepsilon) &amp;lt; \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt;\rho(x_1, A) &amp;lt; \rho(x_1, x_2) + \rho(x_2, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Аналогично, &amp;lt;tex&amp;gt;\rho(x_2, A) &amp;lt; \rho(x_1, x_2) + \rho(x_1, A) + \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Отсюда, &amp;lt;tex&amp;gt;|\rho(x_1, A) - \rho(x_2, A)| &amp;lt; \rho(x_1, x_2) + \varepsilon&amp;lt;/tex&amp;gt;, устремляя &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; к нулю, получаем равномерную непрерывность &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; по определению.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=propcl&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\mathrm{Cl} A = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;\rho(x, A) = \inf\limits_{a \in A} \rho(x, a)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Обозначим &amp;lt;tex&amp;gt;B = \{ x \mid \rho(x, A) = 0 \}&amp;lt;/tex&amp;gt;. Понятно, что если некоторая последовательность &amp;lt;tex&amp;gt;x_n \in B&amp;lt;/tex&amp;gt; сходится к &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(x_n, A) = 0&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;\rho(x, A) = 0&amp;lt;/tex&amp;gt;, то есть, по определению &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;x \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;B = \mathrm{Cl} B&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто.&lt;br /&gt;
&lt;br /&gt;
Если &amp;lt;tex&amp;gt;a \in A&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;\rho(a, A) = 0&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;a \in B&amp;lt;/tex&amp;gt;. Значит, &amp;lt;tex&amp;gt;A \subset B&amp;lt;/tex&amp;gt;, а раз &amp;lt;tex&amp;gt;B&amp;lt;/tex&amp;gt; замкнуто, то &amp;lt;tex&amp;gt;\mathrm{Cl} A \subset B&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Теперь покажем, что &amp;lt;tex&amp;gt;B \subset \mathrm{Cl} A &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;B \subset \bigcap\limits_{A \subset F } F &amp;lt;/tex&amp;gt;, или что для любого &amp;lt;tex&amp;gt;F: A \subset F&amp;lt;/tex&amp;gt;, выполняется &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Допустим, это неверно, и &amp;lt;tex&amp;gt;\exists b \in B: b \notin F&amp;lt;/tex&amp;gt;, тогда &amp;lt;tex&amp;gt;b \in X \setminus F = G = \bigcup\limits_{\alpha} V_{r_\alpha}(x_\alpha)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Значит, &amp;lt;tex&amp;gt; b \in V_r(b) \subset X \setminus F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;b \in B, \rho(b, A) = 0&amp;lt;/tex&amp;gt;, следовательно, есть последовательность &amp;lt;tex&amp;gt;a_n \in A: \rho(b, a_n) \to 0&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для всех &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;, больших некоторого &amp;lt;tex&amp;gt;N&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\rho(b, a_n) &amp;lt; r&amp;lt;/tex&amp;gt;, и &amp;lt;tex&amp;gt;a_n \in V_r(b)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;A \cap V_r(b)&amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt;A \subset F \implies A \cap G = \varnothing &amp;lt;/tex&amp;gt; {{---}} противоречие, &amp;lt;tex&amp;gt;B \subset F&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
Замечание: в общем случае в топологических пространствах замыкания не определяются через предел последовательности, в этом смысле метрические пространства удобны.&lt;br /&gt;
&lt;br /&gt;
Метрические пространства удовлетворяют [http://en.wikipedia.org/wiki/Separation_axiom#Main_definitions аксиоме нормальности]:&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|id=msnorm&lt;br /&gt;
|about=&lt;br /&gt;
нормальность МП&lt;br /&gt;
|statement=&lt;br /&gt;
Любое МП - нормальное, то есть любые два непересекающихся замкнутых подмножества имеют непересекающиеся окрестности.&lt;br /&gt;
|proof=&lt;br /&gt;
(скопировано из первого курса, в Колмогорове на странице 112 есть доказательство поприятнее и поинтуитивнее)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; f(x) = \frac {\rho(x, F_1)} {\rho(x, F_1) + \rho(x, F_2)} &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; F_1 \cap F_2 = \varnothing &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; F_1, F_2 &amp;lt;/tex&amp;gt; - замкнуты, то знаменатель не равен 0. Следовательно, &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; корректна и непрерывна в силу непрерывности &amp;lt;tex&amp;gt; \rho &amp;lt;/tex&amp;gt;. При этом: &amp;lt;tex&amp;gt; x \in F_1 \implies f(x) = 0; x \in F_2: f(x) = 1 &amp;lt;/tex&amp;gt;. Рассмотрим на R пару интервалов: &amp;lt;tex&amp;gt; (- \infty; \frac 1 3) &amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt; (\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;. Т.к. &amp;lt;tex&amp;gt; f(x) &amp;lt;/tex&amp;gt; неперывна, то прообраз открытого множества - открытое множество (это другое определение непрерывного отображения, оно почти эквивалентно тому, которое было дано ранее).&lt;br /&gt;
: &amp;lt;tex&amp;gt; G_1 = f^{-1} ( - \infty; \frac 1 3); G_2 = f^{-1}(\frac 1 2, + \infty) &amp;lt;/tex&amp;gt;&lt;br /&gt;
: &amp;lt;tex&amp;gt; F_1 \in G_1; F_2 \in G_2; G_1 \cap G_2 = \varnothing &amp;lt;/tex&amp;gt;, ч.т.д.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Следствие: так как одноточечные подмножества в МП являются замкнутыми, МП удовлетворяют аксиоме отделимости Хаусдорфа: любые две различные точки можно отделить открытыми шарами. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompl&lt;br /&gt;
|definition=&lt;br /&gt;
МП &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; называется '''полным''', если в нем любая сходящаяся в себе последовательность сходится к элементу &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
принцип вложенных шаров&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — полное. &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; — замкнутые шары. &amp;lt;tex&amp;gt;\overline V_{n + 1} \subset \overline V_n&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt;\bigcap\limits_{n=1}^{\infty} \overline V_n \ne \varnothing&amp;lt;/tex&amp;gt;, и состоит из одной точки.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;a_n&amp;lt;/tex&amp;gt; — центр соответствующего шара, тогда из вложенности &amp;lt;tex&amp;gt;\forall m &amp;gt; n: \rho(a_n, a_m) &amp;lt; r_n&amp;lt;/tex&amp;gt;, то есть последовательность центров сходится в себе, так как &amp;lt;tex&amp;gt;r_n \to 0&amp;lt;/tex&amp;gt;, тогда по полноте пространства последовательность центров сходится к &amp;lt;tex&amp;gt;a \in X&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Покажем, что &amp;lt;tex&amp;gt; a \in \bigcap\limits_{n=1}^{\infty} \overline V_n &amp;lt;/tex&amp;gt;, то есть &amp;lt;tex&amp;gt;\forall n: a \in \overline V_n&amp;lt;/tex&amp;gt;. Для любого &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt; шар &amp;lt;tex&amp;gt;\overline V_n &amp;lt;/tex&amp;gt; содержит все точки последовательности &amp;lt;tex&amp;gt;\{a_n \}&amp;lt;/tex&amp;gt;, кроме конечного числа. Тогда оставшаяся последовательность центров содержится в &amp;lt;tex&amp;gt;\overline V_n&amp;lt;/tex&amp;gt; и также сходится к &amp;lt;tex&amp;gt;a&amp;lt;/tex&amp;gt;, а так как &amp;lt;tex&amp;gt; \overline V_n&amp;lt;/tex&amp;gt; — замкнутое множество, [[Метрическое пространство#Основное характеристическое свойство замкнутых множеств | оно содержит предел этой последовательности]] и &amp;lt;tex&amp;gt;a \in \overline V_n&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также, кроме &amp;lt;tex&amp;gt;a &amp;lt;/tex&amp;gt; в пересечение ничего входить не может: пусть в него еще входит точка &amp;lt;tex&amp;gt;b&amp;lt;/tex&amp;gt;,тогда &amp;lt;tex&amp;gt;\rho(a, b) &amp;gt; 0&amp;lt;/tex&amp;gt;, возьмем шар в пересечении радиусом меньше &amp;lt;tex&amp;gt;\rho(a, b) \over 2&amp;lt;/tex&amp;gt; (такой есть по стремлению радиусов к &amp;lt;tex&amp;gt;0&amp;lt;/tex&amp;gt;), но в нем может лежать только одна из точек &amp;lt;tex&amp;gt;a,b&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defdense&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''всюду плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\mathrm{Cl} A = X&amp;lt;/tex&amp;gt;&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Q}&amp;lt;/tex&amp;gt; всюду плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt;\mathrm{Cl} \mathbb{Q} = \mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Если в пространстве существует счетное всюду плотное множество, такое пространство называют '''сепарабельным'''.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; '''нигде не плотно''' в &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt;\mathrm{Cl} A = \varnothing&amp;lt;/tex&amp;gt;.&lt;br /&gt;
: Например, &amp;lt;tex&amp;gt;\mathbb{Z}&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\mathbb{R}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; (X, \rho) &amp;lt;/tex&amp;gt;. Тогда в любом шаре есть шар, не содержащий точек &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; B = \mathrm{Cl} A &amp;lt;/tex&amp;gt;, так как &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; \mathrm{Int} B = \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Это значит, что &amp;lt;tex&amp;gt;\bigcup\limits_{G \subset B} G = \varnothing &amp;lt;/tex&amp;gt;, то есть, любое непустое открытое &amp;lt;tex&amp;gt; G &amp;lt;/tex&amp;gt; не является подмножеством &amp;lt;tex&amp;gt; B &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Рассмотрим произвольный открытый шар &amp;lt;tex&amp;gt; V &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; V = (V \cap B) \cup (V \cap \overline B) &amp;lt;/tex&amp;gt;. Из наших рассуждений следует, что &amp;lt;tex&amp;gt; V \cap \overline B &amp;lt;/tex&amp;gt; непусто.&lt;br /&gt;
&lt;br /&gt;
Но &amp;lt;tex&amp;gt; \overline B &amp;lt;/tex&amp;gt; {{---}} открытое множество, &amp;lt;tex&amp;gt; \overline B = \bigcup\limits_{\alpha} V_{r_\alpha}(a_\alpha) &amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt; \exists V_1: V \cap V_1 \ne \varnothing &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Тогда можно просто выбрать &amp;lt;tex&amp;gt; V_r(a) \subset V \cap V_1 &amp;lt;/tex&amp;gt;, он и будет искомым шаром без точек &amp;lt;tex&amp;gt; A &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defbaire&lt;br /&gt;
|definition=&lt;br /&gt;
Подмножество &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; топологического пространства &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; имеет '''I категорию по Бэру в пространстве &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;''', если оно является не более чем счетным объединением нигде не плотных в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; множеств. В противном случае оно имеет '''II категорию по Бэру'''.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thbaire&lt;br /&gt;
|author=Бэр&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП является множеством II категории в себе.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — полное и является множеством I категории, то есть представимо как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} M_n&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; — нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;. Возьмем замкнутый шар &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, например, радиуса 1. Так как &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;, оно также нигде не плотно в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt;, а, значит, существует замкнутый шар &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt; радиуса меньше &amp;lt;tex&amp;gt;1 \over 2&amp;lt;/tex&amp;gt;, содержащийся в &amp;lt;tex&amp;gt;\overline V_0&amp;lt;/tex&amp;gt; и не пересекающийся с &amp;lt;tex&amp;gt;M_1&amp;lt;/tex&amp;gt; (&amp;lt;tex&amp;gt;M_1 \cap \overline V_1 = \varnothing&amp;lt;/tex&amp;gt;). Аналогично, &amp;lt;tex&amp;gt;M_2&amp;lt;/tex&amp;gt; нигде не плотно в &amp;lt;tex&amp;gt;\overline V_1&amp;lt;/tex&amp;gt;, и так далее действуя таким образом, построим систему вложенных замкнутых шаров (&amp;lt;tex&amp;gt;\overline V_{n+1} \subset \overline V_n&amp;lt;/tex&amp;gt;) со стремящимся к нулю радиусом. В силу теоремы о вложенных шарах пересечение этих шаров должно содержать какую-то точку &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;, но эта точка не может лежать ни в одном из множеств &amp;lt;tex&amp;gt;M_n&amp;lt;/tex&amp;gt; по построению, то есть, получили противоречие, и &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; не является множеством первой категории.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=следствие из т. Бэра&lt;br /&gt;
|statement=&lt;br /&gt;
Полное МП без изолированных точек несчетно.&lt;br /&gt;
|proof=&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt;(X, \rho)&amp;lt;/tex&amp;gt; — МП без изолированных точек (то есть в любой окрестности любой точки найдутся точки, отличные от нее). Пусть &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; — счетно, то есть, можно занумеровать его элементы как &amp;lt;tex&amp;gt;\{ x_1 \dots x_n \dots \}&amp;lt;/tex&amp;gt; и представить &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; как &amp;lt;tex&amp;gt;\bigcup\limits_{n=1}^{\infty} \{ x_n \}&amp;lt;/tex&amp;gt;. Но одноточечные множества нигде не плотны в &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt;: рассмотрим шар &amp;lt;tex&amp;gt; V_r(p) &amp;lt;/tex&amp;gt;, если &amp;lt;tex&amp;gt; p = x_n &amp;lt;/tex&amp;gt;, то внутри шара есть шар с центром не в &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; меньшего радиуса, так как &amp;lt;tex&amp;gt; x_n &amp;lt;/tex&amp;gt; не является изолированной точкой; для остальных шаров можно взять шар радиуса, меньшего, чем &amp;lt;tex&amp;gt; \rho(x, p) &amp;lt;/tex&amp;gt; с центром также в &amp;lt;tex&amp;gt; p &amp;lt;/tex&amp;gt;. Тогда &amp;lt;tex&amp;gt; X &amp;lt;/tex&amp;gt; является множеством I категории, что противоречит теореме Бэра. Следовательно, &amp;lt;tex&amp;gt;X&amp;lt;/tex&amp;gt; должно быть несчетно.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
Это следствие объясняет природу несчетности вещественной оси. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmscompact&lt;br /&gt;
|definition=&lt;br /&gt;
Замкнутое &amp;lt;tex&amp;gt;K \subset X&amp;lt;/tex&amp;gt; называют '''компактом''', если из любой последовательности точек в &amp;lt;tex&amp;gt;K&amp;lt;/tex&amp;gt; можно выделить сходящуюся подпоследовательность, предел которой также принадлежит &amp;lt;tex&amp;gt; K &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|id=defmstb&lt;br /&gt;
|definition=&lt;br /&gt;
&amp;lt;tex&amp;gt;A \subset X&amp;lt;/tex&amp;gt; называют '''вполне ограниченным''', если для него при любом &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; существует конечная &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть, то есть &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \exists x_1, x_2 \dots x_n: A \subset \bigcup\limits_{i=1}^n V_{\varepsilon}(x_i)&amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Теорема&lt;br /&gt;
|id=thhausdorf&lt;br /&gt;
|author=Хаусдорф&lt;br /&gt;
|statement=&lt;br /&gt;
В полном метрическом пространстве множество является компактом тогда и только тогда, когда оно замкнуто и вполне ограничено.&lt;br /&gt;
|proof=&lt;br /&gt;
[[Теорема Хаусдорфа об ε-сетях]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|statement=&lt;br /&gt;
Пример: &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt; — полное.&lt;br /&gt;
|proof=&lt;br /&gt;
Нужно установить равносильность сходимости &amp;lt;tex&amp;gt; \overline x^{(n)} \in R^{\infty} &amp;lt;/tex&amp;gt; и ее сходимости в себе.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \implies &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; \lim\limits_{n \to \infty} x^{(n)} = x &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как &amp;lt;tex&amp;gt; \rho(x^{(n)}, x^{(m)}) \le \rho(x^{(n)}, x) + \rho(x^{(m)}, x) &amp;lt;/tex&amp;gt;, и при &amp;lt;tex&amp;gt; n, m \to \infty &amp;lt;/tex&amp;gt; каждое из слагаемых в правой части стремится к &amp;lt;tex&amp;gt; 0 &amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе по определению.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt; \Longleftarrow &amp;lt;/tex&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
Пусть &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе. Так же, как в предыдущих доказательствах, обозначим &amp;lt;tex&amp;gt;f(t) = \frac{t}{1+t}&amp;lt;/tex&amp;gt;. Так как &amp;lt;tex&amp;gt;\forall k:\ f(|x^{(n)}_k - x^{(m)}_k|) \le 2^k \rho(x^{(n)}, x^{(m)}) \to 0 &amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;|x^{(n)}_k - x^{(m)}_k| = \frac{1}{1 - f(|x^{(n)}_k - x^{(m)}_k|)} - 1&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt; x^{(n)} &amp;lt;/tex&amp;gt; сходится в себе также и покоординатно.&lt;br /&gt;
&lt;br /&gt;
Но по полноте &amp;lt;tex&amp;gt; \mathbb R &amp;lt;/tex&amp;gt;, каждая из последовательностей по отдельной координате сходится: &amp;lt;tex&amp;gt; \forall k:\ x^{(n)}_k \to x_k &amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Так как покоординатная сходимость в метрике &amp;lt;tex&amp;gt; \mathbb R^{\infty} &amp;lt;/tex&amp;gt; равносильна просто сходимости, то &amp;lt;tex&amp;gt; x^{(n)} \to x = (x_1, x_2, \ldots x_n, \ldots) &amp;lt;/tex&amp;gt;.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{Утверждение&lt;br /&gt;
|about=&lt;br /&gt;
компактность прямоугольника в R^infty&lt;br /&gt;
|statement=&lt;br /&gt;
&amp;lt;tex&amp;gt;\Pi = [a_1, b_1] \times \dots \times [a_n, b_n] \dots&amp;lt;/tex&amp;gt; — компакт в &amp;lt;tex&amp;gt;R^{\infty}&amp;lt;/tex&amp;gt;.&lt;br /&gt;
|proof=&lt;br /&gt;
&amp;lt;tex&amp;gt;\rho(\overline x, \overline y) = \sum\limits_{n=1}^{\infty} {1 \over 2^n} {|x_n - y_n| \over 1 + |x_n - y_n|}&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;{|x_n - y_n| \over 1 + |x_n - y_n|} \le 1&amp;lt;/tex&amp;gt;, также &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0 \exists n_0: \sum\limits_{n = n_0 + 1}^{\infty} {1 \over 2^n} &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;. Таким образом, для каждого &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt; можно выбрать номер координаты &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;, такой, что все координаты с большими &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt; номерами суммарно влияют на метрику не больше, чем на &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Расмотрим &amp;lt;tex&amp;gt;\Pi_{n_0} = [a_1, b_1] \times \dots \times [a_{n_0}, b_{n_0}] \subset R^{n_0}&amp;lt;/tex&amp;gt; — для него можно составить конечную &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сеть &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; (понятно, что по каждой координате это сделать легко, а дальше возьмем декартово произведение). Сделаем сеть &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; для &amp;lt;tex&amp;gt;\Pi&amp;lt;/tex&amp;gt; следующим образом: к каждой &amp;lt;tex&amp;gt;n_0&amp;lt;/tex&amp;gt;-мерной точке из &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt; допишем произвольные координаты &amp;lt;tex&amp;gt;x_{n_0 + 1}, x_{n_0 + 2} \dots&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall x' \in \Pi\ \exists x \in \Pi_{n_0}: \rho (x', x) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По определению &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;-сети для &amp;lt;tex&amp;gt;A&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x \in \Pi_{n_0} \exists a \in A: \rho(x, a) &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* По построению &amp;lt;tex&amp;gt;A'&amp;lt;/tex&amp;gt; и выбору &amp;lt;tex&amp;gt;\varepsilon&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;\forall a \in A\ \exists a' \in A': \rho(a, a') &amp;lt; \varepsilon&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Таким образом, &amp;lt;tex&amp;gt;\forall \varepsilon &amp;gt; 0\ \forall x' \in \Pi\ \exists a' \in A': \rho(x', a') \le \rho(x', x) + \rho(x, a) + \rho(a, a') \le 3 \varepsilon&amp;lt;/tex&amp;gt;, то есть построили конечную &amp;lt;tex&amp;gt;3\varepsilon&amp;lt;/tex&amp;gt;-сеть.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
А еще зачем-то можно рассмотреть для пространства с мерой на сигма-алгебре &amp;lt;tex&amp;gt; (X, \mathcal A, \mu) &amp;lt;/tex&amp;gt; пространство измеримых на &amp;lt;tex&amp;gt; E \in \mathcal A &amp;lt;/tex&amp;gt; вещественнозначных функций. Если ввести на нем метрику &amp;lt;tex&amp;gt;\rho(f, g) = \int\limits_E {|f - g| \over 1 + |f - g|} d \mu&amp;lt;/tex&amp;gt;, то сходимость последовательности функций в ней будет равносильна сходимости по мере.&lt;br /&gt;
&lt;br /&gt;
== Примечания ==&lt;br /&gt;
&amp;lt;references&amp;gt;&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ссылки ==&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Topological_space Topological space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Interior_(topology) Interior (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Closure_(topology) Closure (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Dense_(topology) Dense (topology)]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Nowhere_dense_set Nowhere dense set]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Compact_space Compact space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Totally_bounded_space Totally bounded space]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Base_(topology) Base (topology)]&lt;br /&gt;
&lt;br /&gt;
[[Категория: Функциональный анализ 3 курс]]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35830</id>
		<title>ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35830"/>
				<updated>2014-01-17T20:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Файл:DCEL.png|400px|thumb|left|Представление плоского графа с помощью РСДС]]&lt;br /&gt;
[[Файл:DCEL2.png|200px|thumb|right|Плоский граф, ребрам которого придана произвольная ориентация для представления его с помощью РСДС. Стрелки вокруг вершин соответствуют указателям (P1, P2)]]&lt;br /&gt;
[[Файл:DCEL3.png|200px|thumb|right|(а) РСДС, (б) входы по вершинам head_V [1..n] и (в) входы по граням head_F[1..l]]]&lt;br /&gt;
&lt;br /&gt;
'''ППЛГ''' {{---}} Плоский прямолинейный граф.&lt;br /&gt;
&lt;br /&gt;
'''РСДС''' {{---}} Реберный список с двойными связями.&lt;br /&gt;
&lt;br /&gt;
==ППЛГ==&lt;br /&gt;
[[Укладка графа на плоскости|Планарный граф]], уложенный на плоскости, принято называть ''плоским''.&lt;br /&gt;
'''Плоская укладка планарного графа''' &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;  {{---}} это отображение каждой вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в точку на плоскости, а каждого ребра из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; в простую линию, соединяющую пару образов концевых вершин этого ребра так, чтобы образы ребер пересекались только в своих концевых точках. Хорошо известно, что любой планарный граф можно уложить на плоскости так, чтобы все ребра отобразились в прямолинейные отрезки.&lt;br /&gt;
&lt;br /&gt;
==РСДС==&lt;br /&gt;
===Первое описание===&lt;br /&gt;
Реберный список с двойными связями особенно удобен для представления ППЛГ.&lt;br /&gt;
Пусть задан граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V = \{v_1, v_2... v_n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E = \{e_1, e_2... e_n\}&amp;lt;/tex&amp;gt;. Главная компонента РСДС для планарного графа это ''реберный узел''. Между ребрами графа и реберными узлами РСДС существует взаимно однозначное соответствие, т.е. каждое ребро представлено в РСДС ровно один раз. Реберный узел РСДС, соответствующий ребру графа, например, &amp;lt;tex&amp;gt;e_k = \{v_1, v_2\} &amp;lt;/tex&amp;gt; имеет 4 поля (&amp;lt;tex&amp;gt;V1, V2, F1, F2&amp;lt;/tex&amp;gt;) и 2 указателя (&amp;lt;tex&amp;gt;P1, P2&amp;lt;/tex&amp;gt;). Поле &amp;lt;tex&amp;gt;V1&amp;lt;/tex&amp;gt; содержит начало ребра, а поле &amp;lt;tex&amp;gt;V2&amp;lt;/tex&amp;gt; содержит его конец (так изначально неориентированное ребро получает условную ориентацию). Поля &amp;lt;tex&amp;gt;F1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F2&amp;lt;/tex&amp;gt; содержат имена граней, лежащих слева и справа от ориентированного ребра (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;). Указатель &amp;lt;tex&amp;gt;P1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;P2&amp;lt;/tex&amp;gt;) задает реберный узел, содержащий первое ребро, встречаемое вслед за ребром (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;), при повороте от него против часовой стрелки вокруг &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:DCEL4.png|300px|thumb|right|Ко второму описанию]]&lt;br /&gt;
===Второе описание===&lt;br /&gt;
РСДС состоит из 3 компонент:&lt;br /&gt;
*''Vertex'' {{---}} это точка сочленения. Содержит координаты точки. А так же указатель на инцидентное ребро.&lt;br /&gt;
*''Face'' {{---}} содержит указатель на наружную компоненту (некоторое ребро на его границе). Для неограниченных поверхностей это nil. Так же содержит внутреннюю компоненту, которая есть указатель на некое ребро, с которого можно начать описывать внутреннюю область (опять же, может быть nil).&lt;br /&gt;
*''Half-edge'' {{---}} это ребро. Содержит указатели на точку, откуда исходит (origin), указатель на ребро близнец (twin)(направленное в другую сторону), инцидентную поверхность (incident_face), и указатели на следующее и предыдущие ребра.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct vertex {&lt;br /&gt;
    x, y;&lt;br /&gt;
    half_edge *rep;  /* rep-&amp;gt;origin == this */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct face {&lt;br /&gt;
    outer_component *out;&lt;br /&gt;
    inner_components *in; (список какой-нибудь)&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct half_edge {&lt;br /&gt;
    half_edge *prev;  /* prev-&amp;gt;next == this */&lt;br /&gt;
    half_edge *next;  /* next-&amp;gt;prev == this */&lt;br /&gt;
    half_edge *twin;  /* twin-&amp;gt;twin == this */&lt;br /&gt;
    vertex *origin;     /* twin-&amp;gt;next-&amp;gt;origin == origin &amp;amp;&amp;amp;&lt;br /&gt;
                                prev-&amp;gt;twin-&amp;gt;origin == origin */&lt;br /&gt;
    face *incident_face;       /* prev-&amp;gt;incident_face == incident_face &amp;amp;&amp;amp; next-&amp;gt;incident_face == incident_face */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Построение РСДС множетсва прямых==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
Для каждой конечной точки создаем vertex. Для каждого входного сегмента создаем 2 half-edge и присваиваем vertex в origin и создаем поля twin. Для каждой конечной точки сортируем (по часовой стрелке) half-edge, у которых origin vertex и есть эта точка. Для каждой пары half-edge e1, e2, по часовой стрелке присваиваем e1-&amp;gt;twin-&amp;gt;next = e2 и e2-&amp;gt;prev = e1-&amp;gt;twin. Выбираем один из этих half-edge и делаем его представителем точки. (Вырожденный случай: если есть только 1 half-edge в отсортированном списке, то присваиваем e-&amp;gt;twin-&amp;gt;next = e и e-&amp;gt;prev = e-&amp;gt;twin. Если сделать четко, то это не понадобится). Следующие указатели это перестановки half-edge. В каждом цикле находим и создаем face. [http://cs.stackexchange.com/a/2516]&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35481</id>
		<title>Обсуждение:ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35481"/>
				<updated>2014-01-09T17:02:00Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;А вы в курсе, что если составить аббревиатуру от &amp;quot;Плоский прямолинейный планарный граф&amp;quot;, то получится ПППГ, а не ППЛГ? :) '''Fixed'''&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35480</id>
		<title>ППЛГ и РСДС (PSLG и DCEL): определение, построение РСДС множества прямых</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%9F%D0%9B%D0%93_%D0%B8_%D0%A0%D0%A1%D0%94%D0%A1_(PSLG_%D0%B8_DCEL):_%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5,_%D0%BF%D0%BE%D1%81%D1%82%D1%80%D0%BE%D0%B5%D0%BD%D0%B8%D0%B5_%D0%A0%D0%A1%D0%94%D0%A1_%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D0%B0_%D0%BF%D1%80%D1%8F%D0%BC%D1%8B%D1%85&amp;diff=35480"/>
				<updated>2014-01-09T17:01:36Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
[[Файл:DCEL.png|400px|thumb|left|Представление плоского графа с помощью РСДС]]&lt;br /&gt;
[[Файл:DCEL2.png|200px|thumb|right|Плоский граф, ребрам которого придана произвольная ориентация для представления его с помощью РСДС. Стрелки вокруг вершин соответствуют указателям (P1, P2)]]&lt;br /&gt;
[[Файл:DCEL3.png|200px|thumb|right|(а) РСДС, (б) входы по вершинам head_V [1..n] и (в) входы по граням head_F[1..l]]]&lt;br /&gt;
&lt;br /&gt;
'''ППЛГ''' {{---}} Плоский прямолинейный граф.&lt;br /&gt;
&lt;br /&gt;
'''РСДС''' {{---}} Реберный список с двойными связями.&lt;br /&gt;
&lt;br /&gt;
==ППЛГ==&lt;br /&gt;
[[Укладка графа на плоскости|Планарный граф]], уложенный на плоскости, принято называть ''плоским''.&lt;br /&gt;
'''Плоская укладка планарного графа''' &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;  {{---}} это отображение каждой вершины из &amp;lt;tex&amp;gt;V&amp;lt;/tex&amp;gt; в точку на плоскости, а каждого ребра из &amp;lt;tex&amp;gt;E&amp;lt;/tex&amp;gt; в простую линию, соединяющую пару образов концевых вершин этого ребра так, чтобы образы ребер пересекались только в своих концевых точках. Хорошо известно, что любой планарный граф можно уложить на плоскости так, чтобы все ребра отобразились в прямолинейные отрезки.&lt;br /&gt;
&lt;br /&gt;
==РСДС==&lt;br /&gt;
===Первое описание===&lt;br /&gt;
Реберный список с двойными связями особенно удобен для представления ППЛГ.&lt;br /&gt;
Пусть задан граф &amp;lt;tex&amp;gt;G = (V, E)&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;V = \{v_1, v_2... v_n\}&amp;lt;/tex&amp;gt;, а &amp;lt;tex&amp;gt;E = \{e_1, e_2... e_n\}&amp;lt;/tex&amp;gt;. Главная компонента РСДС для планарного графа это ''реберный узел''. Между ребрами графа и реберными узлами РСДС существует взаимно однозначное соответствие, т.е. каждое ребро представлено в РСДС ровно один раз. Реберный узел РСДС, соответствующий ребру графа, например, &amp;lt;tex&amp;gt;e_k = \{v_1, v_2\} &amp;lt;/tex&amp;gt; имеет 4 поля (&amp;lt;tex&amp;gt;V1, V2, F1, F2&amp;lt;/tex&amp;gt;) и 2 указателя (&amp;lt;tex&amp;gt;P1, P2&amp;lt;/tex&amp;gt;). Поле &amp;lt;tex&amp;gt;V1&amp;lt;/tex&amp;gt; содержит начало ребра, а поле &amp;lt;tex&amp;gt;V2&amp;lt;/tex&amp;gt; содержит его конец (так изначально неориентированное ребро получает условную ориентацию). Поля &amp;lt;tex&amp;gt;F1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;F2&amp;lt;/tex&amp;gt; содержат имена граней, лежащих слева и справа от ориентированного ребра (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;). Указатель &amp;lt;tex&amp;gt;P1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;P2&amp;lt;/tex&amp;gt;) задает реберный узел, содержащий первое ребро, встречаемое вслед за ребром (&amp;lt;tex&amp;gt;v_1, v_2&amp;lt;/tex&amp;gt;), при повороте от него против часовой стрелки вокруг &amp;lt;tex&amp;gt;v_1&amp;lt;/tex&amp;gt; (соответственно &amp;lt;tex&amp;gt;v_2&amp;lt;/tex&amp;gt;).&lt;br /&gt;
[[Файл:DCEL4.png|300px|thumb|right|Ко второму описанию]]&lt;br /&gt;
===Второе описание===&lt;br /&gt;
РСДС состоит из 3 компонент:&lt;br /&gt;
*''Vertex'' {{---}} это точка сочленения. Содержит координаты точки. А так же указатель на инцидентное ребро.&lt;br /&gt;
*''Face'' {{---}} содержит указатель на наружную компоненту (некоторое ребро на его границе). Для неограниченных поверхностей это nil. Так же содержит внутреннюю компоненту, которая есть указатель на некое ребро, с которого можно начать описывать внутреннюю область (опять же, может быть nil).&lt;br /&gt;
*''Half-edge'' {{---}} это ребро. Содержит указатели на точку, откуда исходит (origin), указатель на ребро близнец (twin)(направленное в другую сторону), инцидентную поверхность (incident_face), и указатели на следующее и предыдущие ребра.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct vertex {&lt;br /&gt;
    x, y;&lt;br /&gt;
    half_edge *rep;  /* rep-&amp;gt;origin == this */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct face {&lt;br /&gt;
    outer_component *out;&lt;br /&gt;
    inner_components *in; (список какой-нибудь)&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
struct half_edge {&lt;br /&gt;
    half_edge *prev;  /* prev-&amp;gt;next == this */&lt;br /&gt;
    half_edge *next;  /* next-&amp;gt;prev == this */&lt;br /&gt;
    half_edge *twin;  /* twin-&amp;gt;twin == this */&lt;br /&gt;
    vertex *origin;     /* twin-&amp;gt;next-&amp;gt;origin == origin &amp;amp;&amp;amp;&lt;br /&gt;
                                prev-&amp;gt;twin-&amp;gt;origin == origin */&lt;br /&gt;
    face *incident_face;       /* prev-&amp;gt;incident_face == incident_face &amp;amp;&amp;amp; next-&amp;gt;incident_face == incident_face */&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Построение РСДС множетсва прямых==&lt;br /&gt;
&lt;br /&gt;
Алгоритм:&lt;br /&gt;
Для каждой конечной точки создаем vertex. Для каждого входного сегмента создаем 2 half-edge и присваиваем vertex в origin и создаем поля twin. Для каждой конечной точки сортируем (по часовой стрелке) half-edge, у которых origin vertex и есть эта точка. Для каждой пары half-edge e1, e2, по часовой стрелке присваиваем e1-&amp;gt;twin-&amp;gt;next = e2 и e2-&amp;gt;prev = e1-&amp;gt;twin. Выбираем один из этих half-edge и делаем его представителем точки. (Вырожденный случай: если есть только 1 half-edge в отсортированном списке, то присваиваем e-&amp;gt;twin-&amp;gt;next = e и e-&amp;gt;prev = e-&amp;gt;twin. Если сделать четко, то это не понадобится). Следующие указатели это перестановки half-edge. В каждом цикле находим и создаем face.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35391</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35391"/>
				<updated>2014-01-07T20:42:37Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: /* Q&amp;amp;A */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
*'''Копирование РСДС'''&lt;br /&gt;
Просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
*'''Как из пересечения ребер сделать новую компоненту РСДС'''&lt;br /&gt;
См рисунок.&lt;br /&gt;
&lt;br /&gt;
*'''Сколько будет faces?'''&lt;br /&gt;
Столько же, сколько outer boudaries + 1.&lt;br /&gt;
&lt;br /&gt;
*'''Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем?''' &lt;br /&gt;
Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
*'''Че за граф такой пацанский?'''&lt;br /&gt;
См рисунок. Из него мы сможем понять, какие циклы принадлежат одному и тому же face. Например, в рисунке мы видим, что C2, C3 и C6 являются циклами одного face. Из предыдущего вопроса мы понимаем, что C2 есть внешняя граница.&lt;br /&gt;
&lt;br /&gt;
'''Лемма к предыдущему вопросу''' - Каждая компонента графа отвечает за множество циклов инцидентных одному face.&lt;br /&gt;
&lt;br /&gt;
'''Доказательство''': Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в face &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же face. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
&lt;br /&gt;
*'''Как построить этот граф?'''&lt;br /&gt;
Вспоминаем, что во время работы алгоритма заметающей прямой, мы смотрели на отрезки левее от event point. Из этого получаем, что информацию для постройки нашего графа мы получаем из этого алгоритма. То есть для начала мы делаем узел для каждого цикла, затем для создания ребер мы смотри на самые левые вершины циклов. Если есть half-edge слева от вершины, то создаем ребро между циклами (в котором вершина и в котором half-edge).&lt;br /&gt;
&lt;br /&gt;
*'''Еще что-то?''' &lt;br /&gt;
Да. названия face должны быть такими-же как в старых РСДС.&lt;br /&gt;
(Как это делать. Много букв и много не нужного, но пусть будет. Легко перевести)&lt;br /&gt;
One thing remains: each face f in the overlay must be labeled with the names of the faces in the old subdivisions that contained it. To find these faces, consider an arbitrary vertex v of f . If v is the intersection of an edge e 1 from S 1 and an edge e 2 from S 2 then we can decide which faces of S 1 and S 2 contain f by looking at the IncidentFace() pointer of the appropriate half-edges corresponding to e 1 and e 2 . If v is not an intersection but a vertex of, say, S 1 , then we only know the face of S 1 containing f . To find the face of S 2 containing f , we have to do some more work: we have to determine the face of S 2 that contains v. In other words, if we knew for each vertex of S 1 in which face of S 2 it lay, and vice versa, then we could label the faces of O(S 1 , S 2 ) correctly. How can we compute this information? The solution is to apply the paradigm that has been introduced in this chapter, plane sweep, once more. However, we won’t explain this final step here. It is a good exercise to test your understanding of the plane sweep approach to design the algorithm yourself. (In fact, it is not necessary to compute this information in a separate plane sweep. It can also be done in the sweep that computes the intersections.)&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35388</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35388"/>
				<updated>2014-01-07T20:29:01Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
'''Копирование РСДС''' - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
'''Как из пересечения ребер сделать новую компоненту РСДС''' - см рисунок.&lt;br /&gt;
&lt;br /&gt;
'''Сколько будет faces?''' Столько же, сколько outer boudaries + 1.&lt;br /&gt;
&lt;br /&gt;
'''Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем?''' Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
'''Че за граф такой пацанский?''' См рисунок. Из него мы сможем понять, какие циклы принадлежат одному и тому же face. Например, в рисунке мы видим, что C2, C3 и C6 являются циклами одного face. Из предыдущего вопроса мы понимаем, что C2 есть внешняя граница.&lt;br /&gt;
&lt;br /&gt;
'''Лемма к предыдущему вопросу''' - Каждая компонента графа отвечает за множество циклов инцидентных одному face.&lt;br /&gt;
&lt;br /&gt;
'''Доказательство''': Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в face &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же face. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35387</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35387"/>
				<updated>2014-01-07T20:28:39Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
'''Копирование РСДС''' - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
'''Как из пересечения ребер сделать новую компоненту РСДС''' - см рисунок.&lt;br /&gt;
&lt;br /&gt;
'''Сколько будет faces?''' Столько же, сколько outer boudaries + 1.&lt;br /&gt;
&lt;br /&gt;
'''Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем?''' Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
'''Че за граф такой пацанский?''' См рисунок. Из него мы сможем понять, какие циклы принадлежат одному и тому же face. Например, в рисунке мы видим, что C2, C3 и C6 являются циклами одного face. Из предыдущего вопроса мы понимаем, что C2 есть внешняя граница.&lt;br /&gt;
&lt;br /&gt;
'''Лемма к предыдущему вопросу''' - Каждая компонента графа отвечает за множество циклов инцидентных одному face.&lt;br /&gt;
&lt;br /&gt;
'''Доказательство''': Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в face &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же face. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35385</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35385"/>
				<updated>2014-01-07T20:28:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
[[Файл:PSLG1.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG2.png|400px|thumb|right|Создание новой компоненты]]&lt;br /&gt;
[[Файл:PSLG3.png|400px|thumb|left|Граф для поиска face]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
'''MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)'''&lt;br /&gt;
&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
'''Копирование РСДС''' - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
'''Как из пересечения ребер сделать новую компоненту РСДС''' - см рисунок.&lt;br /&gt;
&lt;br /&gt;
'''Сколько будет faces?''' Столько же, сколько outer boudaries + 1.&lt;br /&gt;
&lt;br /&gt;
'''Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем?''' Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
'''Че за граф такой пацанский?''' См рисунок. Из него мы сможем понять, какие циклы принадлежат одному и тому же face. Например, в рисунке мы видим, что C2, C3 и C6 являются циклами одного face. Из предыдущего вопроса мы понимаем, что C2 есть внешняя граница.&lt;br /&gt;
&lt;br /&gt;
'''Лемма к предыдущему вопросу''' - Каждая компонента графа отвечает за множество циклов инцидентных одному face.&lt;br /&gt;
&lt;br /&gt;
'''Доказательство''': Рассмотрим цикл &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, который ограничивает дыру в face &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Поскольку &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; локально лежит левее самой левой вершины из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;, то &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; должен быть соединен с другим циклом, который тоже ограничивает &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. отсюда следует, что циклы есть компонента связности в графе, описывающая один и тот-же face. Для того, что бы закончить доказательство, покажем, что каждый цикл ограничивающий дыру в &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; есть в той же компоненте связности, что и внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Предположим, что есть цикл, для которого это не так.  Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; — самый левый такой цикл, то есть тот, чья самая левая вершина самая левая (шляпа). По определению есть ребро между &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; и неким &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который лежит слева от самой левой вершины &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. Следовательно &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; в той же компоненте связности, что и &amp;lt;tex&amp;gt;C'&amp;lt;/tex&amp;gt;, который не в той же компоненте, что внешняя граница &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Противоречие.&lt;br /&gt;
&lt;br /&gt;
== Литература и источники ==&lt;br /&gt;
* Вычислительная геометрия. Алгоритмы и приложения, де Берг Марк и другие. Глава 2.3&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG3.png&amp;diff=35384</id>
		<title>Файл:PSLG3.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG3.png&amp;diff=35384"/>
				<updated>2014-01-07T20:25:52Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG2.png&amp;diff=35383</id>
		<title>Файл:PSLG2.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG2.png&amp;diff=35383"/>
				<updated>2014-01-07T20:23:46Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG1.png&amp;diff=35382</id>
		<title>Файл:PSLG1.png</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:PSLG1.png&amp;diff=35382"/>
				<updated>2014-01-07T20:21:17Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35378</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35378"/>
				<updated>2014-01-07T19:53:11Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;br /&gt;
Копирование РСДС - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.&lt;br /&gt;
&lt;br /&gt;
Как из пересечения ребер сделать новую компоненту РСДС - см рисунок.&lt;br /&gt;
&lt;br /&gt;
Сколько будет faces? Столько же, сколько outer boudaries + 1.&lt;br /&gt;
&lt;br /&gt;
Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем? Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.&lt;br /&gt;
&lt;br /&gt;
Че за граф такой пацанский? ну ваще он тащит.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35373</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35373"/>
				<updated>2014-01-07T19:44:24Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35372</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35372"/>
				<updated>2014-01-07T19:43:54Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
&lt;br /&gt;
==Алгоритм==&lt;br /&gt;
MapOverlay (&amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt;, &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt;)&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
1. Копируем &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; в РСДС &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из &amp;lt;tex&amp;gt;S_1&amp;lt;/tex&amp;gt; с ребрами из &amp;lt;tex&amp;gt;S_2&amp;lt;/tex&amp;gt; с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
3. Теперь &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt; это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в &amp;lt;tex&amp;gt;D&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф &amp;lt;tex&amp;gt;G&amp;lt;/tex&amp;gt;, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть &amp;lt;tex&amp;gt;С&amp;lt;/tex&amp;gt; будет уникальная наружная граница цикла в компоненте, а &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt; будет означать face ограниченный этим циклом. Создадим face для &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;. Запишем outer_component в какой-нибудь half-edge из &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на &amp;lt;tex&amp;gt;f&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35370</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35370"/>
				<updated>2014-01-07T19:40:44Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
MapOverlay (S1, S2)&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
1. Копируем S1 и S2 в РСДС D.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из S1 с ребрами из S2 с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем D.&lt;br /&gt;
&lt;br /&gt;
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в D.&lt;br /&gt;
&lt;br /&gt;
3. Теперь D это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в D.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф G, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть С будет уникальная наружная граница цикла в компоненте, а f будет означать face ограниченный этим циклом. Создадим face для f. Запишем outer_component в какой-нибудь half-edge из C. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на f.&lt;br /&gt;
&lt;br /&gt;
==Q&amp;amp;A==&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35367</id>
		<title>Пересечение многоугольников (PSLG overlaying)</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D0%B5%D1%81%D0%B5%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BD%D0%BE%D0%B3%D0%BE%D1%83%D0%B3%D0%BE%D0%BB%D1%8C%D0%BD%D0%B8%D0%BA%D0%BE%D0%B2_(PSLG_overlaying)&amp;diff=35367"/>
				<updated>2014-01-07T19:36:51Z</updated>
		
		<summary type="html">&lt;p&gt;Tiss93: h&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background-color: #ABCDEF; font-size: 16px; font-weight: bold; color: #000000; text-align: center; padding: 4px; border-style: solid; border-width: 1px;&amp;quot;&amp;gt;Эта статья находится в разработке!&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Категория: В разработке]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
==Вычисление пересечения двух многоугольников представленных в виде РСДС==&lt;br /&gt;
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]&lt;br /&gt;
&lt;br /&gt;
===Алгоритм===&lt;br /&gt;
MapOverlay (S1, S2)&lt;br /&gt;
Дано: 2 ППЛГ в виде РСДС.&lt;br /&gt;
Вывод: пересечение этих ППЛГ в виде РСДС.&lt;br /&gt;
Алгоритм:&lt;br /&gt;
1. Копируем S1 и S2 в РСДС D.&lt;br /&gt;
&lt;br /&gt;
2. Находим все пересечения ребер из S1 с ребрами из S2 с помощью заметающей прямой.&lt;br /&gt;
&lt;br /&gt;
2.1 Когда находим точки пересечения, то обновляем D.&lt;br /&gt;
&lt;br /&gt;
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в D.&lt;br /&gt;
&lt;br /&gt;
3. Теперь D это нормальный РСДС, но без информации о faces.&lt;br /&gt;
&lt;br /&gt;
4. Находим boundary cycles в D.&lt;br /&gt;
&lt;br /&gt;
5. Создаем граф G, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).&lt;br /&gt;
&lt;br /&gt;
6. Для каждой компоненты графа:&lt;br /&gt;
&lt;br /&gt;
7. Пусть С будет уникальная наружная граница цикла в компоненте, а f будет означать face ограниченный этим циклом. Создадим face для f. Запишем outer_component в какой-нибудь half-edge из C. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на f.&lt;/div&gt;</summary>
		<author><name>Tiss93</name></author>	</entry>

	</feed>