From b6545ea0c84e689f22bcf50664564ce2a35e6781 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Tue, 10 Jan 2017 01:07:29 +0400 Subject: [PATCH 01/19] without proof and implementation --- 2_segments.in | 2 + Line_segment_intersection.ipynb | 590 ++++++++++++++++++++++++++++++++ 2 files changed, 592 insertions(+) create mode 100644 2_segments.in create mode 100644 Line_segment_intersection.ipynb diff --git a/2_segments.in b/2_segments.in new file mode 100644 index 0000000..1e43d4f --- /dev/null +++ b/2_segments.in @@ -0,0 +1,2 @@ +3 7.9 -10 8 +2 7.7 -4 -6 \ No newline at end of file diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb new file mode 100644 index 0000000..f6cb381 --- /dev/null +++ b/Line_segment_intersection.ipynb @@ -0,0 +1,590 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": false + }, + "source": [ + "# Пересечение множества отрезков\n", + "Перед нами стоит задача: дано множество $S$, состоящее из $n$ отрезков на плоскости. Нам нужно найти все точки их пересечений. \n", + "\n", + "Очевидно, что наивный алгоритм, переберающий все пары отрезков, имеет сложность $O(n^2)$. В некотором смысле это оптимальная оценка, так как в случае, когда каждая пара отрезков из множества пересекается, любой алгоритм займет $\\Omega(n^2)$ времени. Однако на практике такие ситуации встречаются редко, обычно пересечений гораздо меньше. Поэтому хотелось бы уметь решать данную задачу быстрее в таких ситуациях. Другими словами, нужен алгоритм, время работы которого будет зависеть не только от $n$, но и от количества пересечений. Такие алгоритмы называются *output-sensitive*. \n", + "\n", + "В этом конспекте мы научимся решать поставленную задачу за время $O((n + I)\\log{n})$, где $I$ - количество персечений. Кроме этого мы рассмотрим несколько смежных задач, а также задачу о пересечении отрезков на сфере." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## План конспекта\n", + "- Предикат \"левый поворот\"\n", + " - Наивная реализация\n", + " - Проблемы наивной реализации\n", + " - Расчет погрешности вычисления поворота в числах с плавающей точкой\n", + " - Реализация с учетом погрешностей\n", + "- Задача о пересечении двух отрезков\n", + " - Теория\n", + " - Реализация\n", + "- Алгоритм Бентли-Оттмана\n", + " - Теория\n", + " - Упражнение" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Предикат \"Левый поворот\"\n", + "Это простейший геометрический предикат, который позволяет проверять, пересекается ли пара отрезков, лежит ли точка внутри треугольника и многое другое. Он принимает на вход три точки плоскости $(a, b, c)$ и возвращает следующие значения:\n", + "\n", + "$$ \\begin{equation*}\n", + "turn(a, b, c) = \n", + " \\begin{cases}\n", + " 1, &\\text{если c лежит слева от направленного отрезка ab,}\\\\\n", + " -1, &\\text{если c лежит справа от направленного отрезка ab,}\\\\\n", + " 0, &\\text{если три точки лежат на одной плоскости.}\n", + " \\end{cases}\n", + "\\end{equation*} $$\n", + "\n", + "Предикат вычисляется с помощью векторного произведения:\n", + "\n", + "$$ turn(a, b, c) = sign((b - a) \\times (c - a)) = sign \n", + "\\left( \\begin{array}{cc}\n", + " \\left| \\begin{array}{cc}\n", + " b_x - a_x & c_x - a_x\\\\\n", + " b_y - a_y & c_y - a_y\n", + " \\end{array} \\right| \n", + "\\end{array} \\right) $$\n", + "\n", + "Рассмотрим результат такого наивного вычисления поворота от отрезка и точки плоскости: красный цвет - левый поворот, синий - правый, зеленый - точка и отрезок принадлежат одной прямой: " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "data": { + "image/png": "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\nuyZ+79rHLDL867nnf546hyhnDYDO6vb24w733x1Odx8NV3DTctw18XvXvgz1H/51DlHOGgCd1e3t\nxx3uv7Ex3d3ZWMFNy3HXxO9d+1LMujUQucSeP+6q/bjD/ez5x/txx/vZ8593+GcJUc4aAJ3V7e3H\nHe4fng7dnvan5bjr4veuvZTFhn89I3339tTd2lqvnADoZrm9/bjD/f1BX0fDI3U2Orp5fc1uWo67\nJn5P9yKRvvUc/gcH6na7VZcDAACQhkWGf/0f+AMAAIC1wvAHAABoGQx/AACAlsHwBwAAaBnuw9/M\nftzMvmhmXzezz5vZG7w/EwAAAK7Gdfib2dsk/bykn5X0eklfkPSEmd039Y1E+uKu2o97sp7Y3VC3\ntx93vL8Vkb6SPi/pX5z7b5P0ZUnvueJ6In1xV+vHPVlP7G6o29uPO97fmkhfSfdK+qakzUuvf0LS\n3hXv4Xhf3NX6cU/WcwRvqNvbjzve35rjfSX9WUkvSHrjpdc/IOm/XvEeIn1xN7P2rO5C7G60O3Pt\nWd3Zax+TPtJ3R9LmeN2+rc3NTe3u7i4uIgOyWW5vP+7JemJ3Q93eftzxfg/37u6uNjc3L6ydnZ25\n33/P4h85NyeSnpd0/6XX75f0v6a98XGNbgFIku7cWf4AZDIgm+X29uOerCd2N9Tt7ccd7/dwb29v\na3t7+8Jr5473nc2sWwOrLE1+4O85Sf/wiuvZ88ddrR/3ZD17/qFubz/ueH9r9vzLaJj/sKRTSX9b\n0msl/WtJA0nfecX1RPrirtaPe7Ke2N1Qt7cfd7y/dZG+Zvb3JL1Ho9v9T0v6+6WU37niWiJ9cdfD\nj3uyntjdULe3H3e8n0jfCRDpCwAAsBxE+gIAAMCVMPwBAABaBsMfAACgZTD8AQAAWgbDHwAAoGUw\n/AEAAFpGPYf/8fH6nQRAN8vt7U/q7g162u/vqz/w6XnStqR1e/txx/u9a5+bWacARS55nPBHAHSz\n3N7+pO7B6cDtBL5S0rYlrdvbjzve7117KTU63nfRJc72x121P6nb8+z9UtK2Ja3b24873t+qs/0X\nXReG/3jVOUQ5awB0Vnfm2h3dhyeHF4b+5dU7Wa3nSduS1p259qzu7LWPWWT413PP/zx1C1GO8uOO\n9yd13x1Odx8NV+t50rakdXv7ccf7vWtfhvoP/7qFKEf5ccf7k7pvbEx3dzZW63nStqR1e/txx/u9\n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\n7ng/7ng/kb4TINIXAABgOYj0BQAAgCth+AMAALQMhj8AAEDLYPgDAAC0DIY/AABAy2D4AwAAtIx6\nDv/j47Ure4Oe9vv76g98QpSz5j9ndXv7ccf7ccf7ccf7vWufm1mnAEUuOZzwNzgduJ3AV0re/Oes\nbm8/7ng/7ng/7ni/d+2l1PB433mXHM729zx7v5S8Z0FndXv7ccf7ccf7ccf7W3m2/7zrwvAfrxWC\njg9PDi8M/curd7JaiHLW/Oes7sy1Z3Vnrj2rO3PtWd3Zax+zyPCv557/eVYIUb47nB6ifDRcLQA6\nW/5zdre3H3e8H3e8H3e837v2Zaj/8F8hRPnGxvQQ5c7GagHQ2fKfs7u9/bjj/bjj/bjj/d61L8Ws\nWwORS+z5467Yjzvejzvejzvez57/vMN/TY9BDk+Hrk/7Z81/zur29uOO9+OO9+OO93vXXspiw7+e\nkb57e+puba3V3R/0dTQ8Umejo5vX1x8AnTX/Oavb24873o873o873u/pXiTSt57D/+BA3W636nIA\nAADSsMjwr/8DfwAAALBWGP4AAAAtg+EPAADQMhj+a2R3d7fqEloHPY+HnsdDz+Npes8Z/muk6V8s\ndYSex0PP46Hn8TS957Uc/sd/6BDpGxAB+dWv5ouAzOoe++l5nHvsp+dx7rGfnse5x/6MPV+IWQcB\nRC6dHfKjd63vIJ7YCMi3rNWfNV6SnjfL/VI/Pfd2v9RPz73dL/Xn6fmY9Cf86V3rO4I39jjIt6zV\nn/WoSXreLPdL/fTc2/1SPz33dr/Un6fnYzKf8PcXJP0XvVXSfaPX9t62p9e88jVL+f7gD6S3vvXq\nv9/bk16znPoK/46kx9fi96w9q3uyn57T82a5J/vpOT2fzTPPPKPHHntMkv5iKeW3pl1bt+H/tyR9\nquo6AAAAEvOOUsqvTrugbsP/uqRbkr4k6RvVVgMAAJCKl0n6LklPlFIG0y6s1fAHAAAAf2r5q34A\nAADgB8MfAACgZTD8AQAAWgbDHwAAoGUw/AEAAFoGw98RM/sWM3vazF4ws9dVXU9TMbMHzexjZvas\nmZ2aWd/M3mdm91ZdW5Mwsx83sy+a2dfN7PNm9oaqa2oqZvZeM3vSzP7IzL5iZntm9lDVdbUJM/uZ\ns3+7P1x1LR4w/H35oKQva3TcIvjxWkkm6cckPaLR0VzvlvRPqyyqSZjZ2yT9vKSflfR6SV+Q9ISZ\n3VdpYc3lTZJ+UdIbJb1Z0r2SPm1m31ZpVS3h7Bvbd2n0dd5I+D1/J8zsByR9SNIPSfp9Sd9bSvm9\naqtqD2YUJc/YAAAC6UlEQVT205LeXUrpVF1LEzCzz0v6b6WUf3D23ybpOUn/spTywUqLawFn32R9\nVdL3l1I+V3U9TcbMXi7pQNLflfSPJP1uKeWnqq1q/fCTvwNmdr+kfyPpMUlfr7ictvJKScOqi2gC\nZ9snj0r6T+PXyuinhv8o6fuqqqtlvFKjO4h8TfvzryT9+1LKZ6ouxJN7qi6goXxc0kdLKb9rZg9W\nXUzbMLOOpJ+Q1Ljv1iviPknXJH3l0utfkfTn4stpF2d3WX5B0udKKb9fdT1NxszeLul7Jf35qmvx\nhp/858TM3n/28MdV63kze8jMflLSyyV9YPzWCstOzbw9v/SeV0nal/RrpZRfqqZygLXyUY2eZXl7\n1YU0GTN7tUbfZL2jlPLNquvxhj3/OTkLHbo+47IvSvp1SX/j0uvXJP2xpE+VUt7pUF4jmbPnz5ZS\n/vjs+gckfVbSb9Hn9XF22/9U0g+VUv7dudc/IekVpZS/WVVtTcfMPiLpLZLeVEo5rrqeJmNmPyjp\n30p6Xn/yQ9s1jbZbnpf0raVBA5Phv2bOvnv80+deekDSExo9+PdkKeV/VFJYwzn7if8zkn5b0u0m\n/Z+0DlzxwN+xRg/8/fNKi2soZ4P/ByX95VLKs1XX03TM7DskXd6m/YSkZyT9s1LKM+FFOcKe/5op\npXz5/H+b2dc0+i7yWQa/D2c/8f+mRnde3iPpz4xmk1RKubxPDcvxYUmfMLMDSU9q9OuU367RP46w\nZszso5K2JW1K+trZQ8SS9H9LKcSdO1BK+ZpGv5n1Imf/fg+aNvglhn8U/BTqy1+T9N1n67mz10yj\nvl+rqqgmUUr59bNfN/vHku6X9LSkW6WU/11tZY3l3Rp9/f7mpdffKelXwqtpL439t5vb/gAAAC2D\np/0BAABaBsMfAACgZTD8AQAAWgbDHwAAoGUw/AEAAFoGwx8AAKBlMPwBAABaBsMfAACgZTD8AQAA\nWgbDHwAAoGUw/AEAAFrG/wcGpMm0yIOP4AAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "class Point:\n", + " def __init__(self, x = 0.0, y = 0.0):\n", + " self.x = x\n", + " self.y = y\n", + "\n", + " def __add__(self, p):\n", + " return Point(self.x + p.x, self.y + p.y)\n", + "\n", + " def __sub__(self, p):\n", + " return Point(self.x - p.x, self.y - p.y)\n", + "\n", + " def __neg__(self):\n", + " return Point(-self.x, -self.y)\n", + "\n", + " def __repr__(self):\n", + " return \"(%r, %r)\" % (self.x, self.y)\n", + "\n", + "max_val = 5\n", + "step = 0.5\n", + "colors = [\"r\",\"g\", \"b\"]\n", + "\n", + "def calculate_det(a, b):\n", + " return a.x * b.y - b.x * a.y\n", + "\n", + "def turn(a, b, c):\n", + " det = calculate_det(b - a, c - a)\n", + " if det > 0:\n", + " return colors[0]\n", + " if det < 0:\n", + " return colors[2]\n", + " return colors[1]\n", + "\n", + "x = Point(-max_val, -max_val)\n", + "y = Point(max_val, max_val)\n", + "for x_i in np.arange(-max_val, max_val, step):\n", + " for y_i in np.arange(-max_val, max_val, step):\n", + " color = turn(x, y, Point(x_i, y_i))\n", + " plt.scatter(x_i, y_i, color = color, s = 20)\n", + "\n", + "plt.axis([-max_val, max_val, -max_val, max_val])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Однако у такого решения есть проблема: попробуем посчитать поворот точек $p1 = (1.1016, 8.1672)$, $p2 = -p1$ и $p3 = p1 * (1 << 52)$:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Point: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", + "Turn: left turn\n" + ] + } + ], + "source": [ + "p1 = Point(1.1016, 8.1672)\n", + "p2 = -p1\n", + "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", + "print(\"Point:\", p1, p2, p3)\n", + "t = turn(p1, p2, p3)\n", + "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "Несмотря на то, что точки лежат на одной прямой, результат не равен $collinear$. Проблема кроется в ограниченной точности арифметики с плавающей точкой. Достаточно часто реализацию алгоритмов вычислительной геометрии затрудняют такие вычисления, так как их погрешность приводит к нарушению инвариантов алгоритма. \n", + "\n", + "Но заметим, что $collinear$ - достаточно редкий результат. Поэтому если бы мы могли большую часть ответов выдавать, сравнивая векторное произведение с некоторой константой $e$, а оставшуюся часть считать каким-нибудь менее эффективным, но точным способом (например, воспользовавшись длинной арифметикой), то мы могли бы считать нашу задачу выполненной, так как в среднем время расчета поворота увеличилось бы незначительно. Поэтому наша следующая задача - вычислить константу $e$.\n", + "\n", + "Двоичное число с плавающей точкой представляется в виде $a = \\pm 1.a_1a_2a_3 \\dots a_{p - 1} \\times 2^\\gamma$, где $a_i \\in \\{ 0, 1 \\}$. Обозначим за $D$ множество всех чисел c плавающей точкой, операции над ними (в противовес обычным операциям над вещественными числами) обычно обозначают как $\\oplus$, $\\ominus$ и $\\otimes$. Машинный эпсилон $\\varepsilon = 2^{-p}$. Тогда погрешности операций для $\\forall a, b \\in D$ при условии округления к ближайшему можно выразить так:\n", + "* $(a \\oplus b) = (a + b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", + "* $(a \\ominus b) = (a - b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", + "* $(a \\otimes b) = (a \\times b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", + "\n", + "Нам нужно показать, что справедливо следующее утверждение:\n", + "\n", + "$$ \\forall a, b, c \\in D^2, \\widetilde{v} = (b_x \\ominus a_x) \\otimes (c_y \\ominus a_y) \\ominus (b_y \\ominus a_y) \\otimes (c_x \\ominus a_x) $$ \n", + "$$ \\begin{equation*}\n", + "\\exists e \\in D :\n", + " \\begin{cases}\n", + " \\widetilde{v} > e &{\\Rightarrow (b - a) \\times (c - a) > 0}\\\\\n", + " \\widetilde{v} < -e &{\\Rightarrow (b - a) \\times (c - a) < 0}\n", + " \\end{cases}\n", + "\\end{equation*} $$\n", + "\n", + "Обозначим $v = (b - a) \\times (c - a) = (b_x - a_x) (c_y - a_y) - (b_y - a_y) (c_x - a_x)$. Распишем выражение для $\\widetilde{v}$ в арифметике с плавающей точкой: \n", + "\n", + "$$ \\begin{array}{c}\n", + " \\widetilde{v} = (b_x \\ominus a_x) \\otimes (c_y \\ominus a_y) \\ominus (b_y \\ominus a_y) \\otimes (c_x \\ominus a_x) = \\\\\n", + " = [ (b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) - (b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) ] (1 + \\delta_7),\n", + "\\end{array}\n", + "$$\n", + "\n", + "где $ \\mid \\delta_i \\mid \\leqslant \\varepsilon.$ Заметим, что $v \\approx \\widetilde{v}$. Оценим абсолютную погрешность $|v - \\widetilde{v}|$.\n", + "\n", + "$$ \\begin{array}{c} \n", + "|v - \\widetilde{v}| = |(b_x - a_x) (c_y - a_y) - (b_y - a_y) (c_x - a_x) - (b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7) + \\\\ + (b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7)| = \\\\ = |(b_x - a_x) (c_y - a_y) (1 - (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7)) - (b_y - a_y) (c_x - a_x) (1 - (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7))| \\leqslant \\\\ \n", + "\\leqslant |(b_x - a_x) (c_y - a_y) (1 - (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7))| + |(b_y - a_y) (c_x - a_x) (1 - (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7))| = \\\\ \n", + "= |(b_x - a_x) (c_y - a_y)| \\cdot |((1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7) - 1)| + |(b_y - a_y) (c_x - a_x)| \\cdot |((1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7) - 1)| = \\\\ \n", + "= |(b_x - a_x) (c_y - a_y)| \\cdot |\\delta_1 + \\delta_2 + \\delta_3 + \\delta_7 + \\delta_1 \\delta_2 \\ldots| + |(b_y - a_y) (c_x - a_x)| \\cdot |\\delta_4 + \\delta_5 + \\delta_6 + \\delta_7 + \\delta_4 \\delta_5 \\ldots| \\leqslant \\\\ \n", + "\\leqslant |(b_x - a_x) (c_y - a_y)| \\cdot (|\\delta_1| + |\\delta_2| + |\\delta_3| + |\\delta_7| + |\\delta_1 \\delta_2| \\ldots) + |(b_y - a_y) (c_x - a_x)| \\cdot (|\\delta_4| + |\\delta_5| + |\\delta_6| + |\\delta_7| + |\\delta_4 \\delta_5| \\ldots) \\leqslant \\\\\n", + "\\leqslant |(b_x - a_x) (c_y - a_y)| \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) + |(b_y - a_y) (c_x - a_x)| \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) = \\\\ \n", + "= (|(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|)(4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4)\n", + "\\end{array}\n", + "$$\n", + "\n", + "Заметим, что $e$ должна удовлетворять неравенству $|\\widetilde{v} - v| \\leqslant e \\leqslant |\\widetilde{v}|$. Таким образом, мы получили нижнюю границу числа $e$ в вещественных числах, но $e$ является числом с плавающей точкой. Обозначим $t = |(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|$. Тогда $|v - \\widetilde{v}| \\leqslant t \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4)$. Пусть $\\widetilde{t} = |(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|$. Распишем:\n", + "\n", + "$$ \\begin{array}{c} \n", + "\\widetilde{t} = [|(b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3)| + |(b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6)|] (1 + \\delta_7) \\geqslant \\\\\n", + "\\geqslant |(b_x - a_x) (c_y - a_y) (1 - \\varepsilon)^3)| \\cdot (1 - \\varepsilon) + |(b_y - a_y) (c_x - a_x) (1 - \\varepsilon)^3)| \\cdot (1 - \\varepsilon) = \\\\\n", + "= |(b_x - a_x) (c_y - a_y)| \\cdot (1 - \\varepsilon)^4 + |(b_y - a_y) (c_x - a_x)| \\cdot (1 - \\varepsilon)^4 = \\\\\n", + "= (|(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|) \\cdot (1 - \\varepsilon)^4 = t \\cdot (1 - \\varepsilon)^4\n", + "\\end{array}\n", + "$$\n", + "\n", + "Получили, что $t \\leqslant \\Large \\frac{\\widetilde{t}}{(1 - \\varepsilon)^4}$. Отсюда следует:\n", + "$$ \\begin{array}{c} \n", + "|v - \\widetilde{v}| \\leqslant e \\leqslant \\widetilde{t} \\times \\Large \\frac{4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4}{(1 - \\varepsilon)^4} = \\\\ = \\widetilde{t} \\times (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) \\times (1 + 4 \\varepsilon + 10 \\varepsilon^2 + 20 \\varepsilon^3 + O(\\varepsilon^4)) \\leqslant (|(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|) \\times 8 \\varepsilon \n", + "\\end{array}\n", + "$$\n", + "\n", + "Таким образом, константа $e$ может быть вычислена следующим образом: \n", + "\n", + "$$ e = (|(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|) \\times 8 \\varepsilon $$\n", + "\n", + "С учетом полученных результатов, предекат будет выглядить так:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "from decimal import *\n", + "\n", + "getcontext().prec = 70\n", + "\n", + "def calculate_arg(a, b):\n", + " return abs(a.x * b.y) + abs(b.x * a.y)\n", + "\n", + "def turn(a, b, c):\n", + " e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a)\n", + " det = calculate_det(b - a, c - a)\n", + " if det > e:\n", + " return colors[0]\n", + " if det < -e:\n", + " return colors[2]\n", + "\n", + " la = Point(Decimal(a.x), Decimal(a.y))\n", + " lb = Point(Decimal(b.x), Decimal(b.y))\n", + " lc = Point(Decimal(c.x), Decimal(c.y))\n", + " ldet = calculate_det(lb - la, lc - la)\n", + " if ldet > 0:\n", + " return colors[0]\n", + " if ldet < 0:\n", + " return colors[2]\n", + " return colors[1]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Если мы посчитаем поворот точек $p1$, $p2$ и $p3$ теперь, то получим верный результат:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Point: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", + "Turn: collinear\n" + ] + } + ], + "source": [ + "p1 = Point(1.1016, 8.1672)\n", + "p2 = -p1\n", + "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", + "print(\"Point:\", p1, p2, p3)\n", + "t = turn(p1, p2, p3)\n", + "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "## Задача о пересечении двух отрезков\n", + "Теперь научимся определять, пересекаются ли два отрезка, используя предикат \"левый поворот\". \n", + "\n", + "Отрезок $s$ задается начальной и конечной точками $a, b \\in \\mathbb{R}^2$ и определяется как множество точек $s = \\{ (1 - t)a + tb, t \\in [0, 1] \\}$. Отрезки $s_1$ и $s_2$ пересекаются, если существует непустое множество их общих точек. \n", + "\n", + "Иначе говоря, отрезки пересекаются тогда и только тогда, когда для каждого из них концы другого не лежат с одной от стороны от первого. Отдельно стоит рассматривать только граничный случай, когда оба отрезка лежат на одной прямой, потому как в таком случае проверка с помощью поворота ответа не даст (это обычно называют проверкой на *bounding box*). Немного модифицируем определение поворота и запишем условие пересечения двух отрезков:\n", + "\n", + "\\begin{equation}\n", + "turn(s, c) = \n", + " \\begin{cases}\n", + " 1, &\\text{если c лежит слева от направленного отрезка s,}\\\\\n", + " -1, &\\text{если c лежит справа от направленного отрезка s,}\\\\\n", + " 0, &\\text{s и c коллинеарны.}\n", + " \\end{cases}\n", + "\\end{equation} \n", + "\n", + "$$ s_1 \\cap s_2 \\Longleftrightarrow \\begin{equation}\n", + " \\begin{cases}\n", + " turn(s_1, s_2.a) \\cdot turn(s_1, s_2.b) \\leqslant 0, &\\text{}\\\\\n", + " turn(s_2, s_1.a) \\cdot turn(s_2, s_1.b) \\leqslant 0, &\\text{}\\\\\n", + " AABB(s_1) \\cap AABB(s_2) \\ne 0.\n", + " \\end{cases}\n", + "\\end{equation} $$\n", + "\n", + "Здесь $AABB$ - это *axis-aligned bounding box*. Для этого достаточно проверить, что проекции этих двух отрезков на оси $X$ и $Y$ пересекаются." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Segments: [(3.0, 7.9), (-10.0, 8.0)] [(2.0, 7.7), (-4.0, -6.0)]\n", + "Segments don't intersect\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from decimal import *\n", + "\n", + "getcontext().prec = 70\n", + "\n", + "class Point:\n", + " def __init__(self, x = 0.0, y = 0.0):\n", + " self.x = x\n", + " self.y = y\n", + "\n", + " def __repr__(self):\n", + " return \"(%r, %r)\" % (self.x, self.y)\n", + "\n", + "class Segment:\n", + " def __init__(self, a, b):\n", + " self.a = a\n", + " self.b = b\n", + "\n", + " def __repr__(self):\n", + " return \"[%r, %r]\" % (self.a, self.b)\n", + "\n", + "def calculate_det(a, b):\n", + " return a.x * b.y - b.x * a.y\n", + "\n", + "def calculate_arg(a, b):\n", + " return abs(a.x * b.y) + abs(b.x * a.y)\n", + "\n", + "def turn(s, c):\n", + " a = s.a\n", + " b = s.b\n", + " e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a)\n", + " det = calculate_det(b - a, c - a)\n", + " if det > e:\n", + " return 1\n", + " if det < -e:\n", + " return -1\n", + "\n", + " la = Point(Decimal(a.x), Decimal(a.y))\n", + " lb = Point(Decimal(b.x), Decimal(b.y))\n", + " lc = Point(Decimal(c.x), Decimal(c.y))\n", + " ldet = calculate_det(lb - la, lc - la)\n", + " if ldet > 0:\n", + " return 1\n", + " if ldet < 0:\n", + " return -1\n", + " return 0\n", + "\n", + "def convert_by_x(s): # s.a.x <= s.b.x\n", + " if s.a.x > s.b.x:\n", + " tmp = s.a\n", + " s.a = s.b\n", + " s.b = tmp\n", + " return s\n", + "\n", + "def convert_by_y(s): # s.a.y <= s.b.y\n", + " if s.a.y > s.b.y:\n", + " tmp = s.a\n", + " s.a = s.b\n", + " s.b = tmp\n", + " return s\n", + "\n", + "def bounding_box(s1, s2):\n", + " convert_by_x(s1)\n", + " convert_by_x(s2)\n", + " if not (s1.a.x <= s2.b.x and s1.b.x >= s2.a.x):\n", + " return 0\n", + " convert_by_y(s1)\n", + " convert_by_y(s2)\n", + " if not (s1.a.y <= s2.b.y and s1.b.y >= s2.a.y):\n", + " return 0\n", + " return 1\n", + "\n", + "def check_intersection(s1, s2):\n", + " if bounding_box(s1, s2) == 0:\n", + " return 0\n", + " if turn(s1, s2.a) * turn(s1, s2.b) > 0:\n", + " return 0\n", + " if turn(s2, s1.a) * turn(s2, s1.b) > 0:\n", + " return 0\n", + " return 1\n", + "\n", + "with open(\"2_segments.in\") as inp:\n", + " x1, y1, x2, y2 = map(float, inp.readline().split())\n", + " s1 = Segment(Point(x1, y1), Point(x2, y2))\n", + " x3, y3, x4, y4 = map(float, inp.readline().split())\n", + " s2 = Segment(Point(x3, y3), Point(x4, y4))\n", + "\n", + "print(\"Segments:\", s1, s2)\n", + "if check_intersection(s1, s2) != 0:\n", + " print(\"Segments intersect\")\n", + "else:\n", + " print(\"Segments don't intersect\")\n", + "\n", + "plt.plot([x1, x2], [y1, y2])\n", + "plt.plot([x3, x4], [y3, y4])\n", + "step = 5\n", + "plt.axis([min(0, x1, x2, x3, x4) - step, max(x1, x2, x3, x4) + step, min(0, y1, y2, y3,y4) - step, max(y1, y2, y3, y4) + step])\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "На этом вступление заканчивается, и мы переходим к основной части конспекта, в которой будут разобраны более существенные и интересные задачи." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Алгоритм Бенли-Оттмана\n", + "Данный алгоритм позволяет решить задачу, которая была аннонсирована во вступлении. Напомню ее формулировку: дано множество $S = \\{ s_1, s_2, \\dots s_n \\}$, состоящее из $n$ отрезков на плоскости. Нужно найти множество точек, в которых эти отрезки пересекаются. \n", + "\n", + "Заметим, что пересекаться могут только ближайшие отрезки, поэтому нет смысла проверять на наличие пересечения отрезки, находящиеся далеко друг от друга. Для начала оформально определим понятия \"ближайших\" и \"находящихся далеко друг от друга\" отрезков. Будем рассматривать ортогональные проекции отрезков на ось $X$. Если проекции двух отрезков не пересекаются, то будем говорить, что такие отрезки далеко друг от друга (очевидно, они не могут иметь общих точек). Следовательно, мы должны рассматривать только те отрезки, проекции которых пересекаются, то есть существует параллельная оси $Y$ прямая, пересекающая оба отрезка. Чтобы найти все такие отрезки, представим прямую $l$, скользящую по плоскости параллельно оси $Y$, начинающую свое движение из $-\\infty$. Эта прямая называется заметающей прямой (*sweep line*). Благодаря ей мы сможем отслеживать интересующие нас отрезки в каждый момент времени, что позволит нам найти все пересечения.\n", + "\n", + "Будем называть статусом заметающей прямой множество отрезков, пересекающих заметающую прямую в данный момент времени. Статус меняется при достижении так называемых событий (*event points*), для нас событиями являются точки начала и конца отрезков.\n", + "\n", + "На самом деле алгоритм совершает какие-то дейтвия только при достижении $l$ события: обновляется статус прямой и происходят проверки отрезков из множества на наличие пересечений. Например, если событие - \"левый конец отрезка\" $s_i$, то $s_i$ добавляется в статус и проверяется на пересечение с другими; при достижении события \"правый конец\" $s_i$ будет удален из множества. Однако такой алгоритм все еще не output-sensitive, поскольку есть ситуации, при которых происходит проверка $O(n^2)$ пар отрезков, хотя пересечений на самом деле много меньше: простейший пример - множество горизонтальных отрезков, пересекающих ось $Y$. Проблема в том, что два отрезка, пересекающих заметающую прямую, могут находиться далеко друг от друга в вертикальном направлении. \n", + "\n", + "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с остальными, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", + "$$ a < b \\Longleftrightarrow \\left[ \n", + " \\begin{gathered} \n", + " a.x < b.x \\\\ \n", + " a.x = b.x \\wedge a.y < b.y \\\\ \n", + " \\end{gathered} \n", + "\\right. $$\n", + "Таким образом, мы сможем отсечь отрезки, находящиеся далеко в вертикальном направлении. Соответственно, мы будем проверять на наличие пересечения только ближайшие в обоих направлениях отрезки. \n", + "\n", + "Теперь соберем все вместе и опишем алгоритм более формально:\n", + "\n", + "0. Заранее оговорим, что левый конец отрезка является его началом, правый - концом.\n", + "1. Из множества входных отрезков $S$ построим множество событий $events$, в котором каждый отрезок будет встречаться два раза - одно событие будет отвечать за его левый конец, другое - за правый.\n", + "2. Отсортируем $events$ по неубыванию. \n", + "3. Инициализируем $status$ пустым множеством. Для статуса нужна такая структура данных, которая бы позволила хранить элементы в отсортированном порядке и вставлять/извлекать данные не хуже, чем за $O(\\log{m})$, где $m$ - количество отрезков в статусе. Например, можно использовать сбалансированное бинарное дерево поиска. \n", + "4. Будем идти по отсортированному множеству событий. Каждое новое событие $e$ будем обрабатывать следующим образом:\n", + " 1. Проверяем, какого типа событие (начало или конец отрезка) мы встретили. Пусть инициатором этого события является отрезок $s$.\n", + " 2. Если событие - левый конец, то делаем следующее:\n", + " 1. Если $events = \\varnothing$, то просто добавляем $s$ в статус и переходим к следующему событию.\n", + " 2. В противном случае нам нужно найти соседей $s$ и проверить отрезки на наличие пересечений. Находим в статусе минимальный элемент, больший $s$ (если такого нет - берем максимальный). Пусть это будет отрезок $t$. Если $t$ - крайний элемент статуса (максимальный или минимальный), то мы проверяем пересечение только с ним. Если нет - то нужно проверить пересечение $s$ не только с $t$, но и с отрезком, идущим в статусе перед $t$ (то есть с соседями сверху и снизу).\n", + " 3. После проверки добавляем $s$ в статус.\n", + " 4. Переходим к следующему событию.\n", + " 3. Если событие - правый конец:\n", + " 1. Удаляем отрезок из статуса\n", + " 2. Теперь у двух отрезков могли поменяться соседи, поэтому если в статусе больше одного отрезка, то снова находим в статусе $t$ - минимальный элемент, больший $s$. Если такого нет, переходим к следующему событию. Если есть и он не крайний минимальный, то проверяем, пересекается ли он со своим нижним соседом.\n", + " 3. Переходим к следующему событию.\n", + " \n", + "После того, как будет обработано последнее событие, алгоритм завершает свою работу. Стоит учесть, что какие-то отрезки могут становиться соседями больше одного раза, и корректно обрабатывать такие ситуации. \n", + "\n", + "Точку пересечения $q$ двух непараллельных отрезков $a_1 b_1$ и $a_2 b_2$ можно найти следующим образом:\n", + "\n", + "\\begin{equation} \n", + "\\left( \\begin{array}{cc}\n", + " a_1.y - b_1.y & b_1.x - a_1.x\\\\\n", + " a_2.y - b_2.y & b_2.x - a_2.x\n", + "\\end{array} \\right) \n", + "\\cdot \n", + "\\left( \\begin{array}{c}\n", + " x\\\\\n", + " y\n", + "\\end{array} \\right) =\n", + "\\left( \\begin{array}{c}\n", + " (a_1.y - b_1.y) \\cdot a_1.x + (b_1.x - a_1.x) \\cdot a_1.y\\\\\n", + " (a_2.y - b_2.y) \\cdot a_2.x + (b_2.x - a_2.x) \\cdot a_2.y\n", + "\\end{array} \\right) \\end{equation}\n", + "\n", + "\\begin{equation} \\left( \\begin{array}{c}\n", + " x\\\\\n", + " y\n", + "\\end{array} \\right) = \\large \n", + "\\frac{\n", + "\\left( \\begin{array}{cc}\n", + "b_2.x - a_2.x & a_1.x - b_1.x\\\\\n", + "b_2.y - a_2.y & a_1.y - b_1.y\n", + "\\end{array} \\right) \n", + "\\cdot\n", + "\\left( \\begin{array}{c}\n", + "b_1.x \\cdot a_1.y - b_1.y \\cdot a_1.x\\\\\n", + "b_2.x \\cdot a_2.y - b_2.y \\cdot a_2.x\n", + "\\end{array} \\right) \n", + "}{\n", + "\\left| \\begin{array}{cc}\n", + "a_1.y - b_1.y & b_1.x - a_1.x\\\\\n", + "a_2.y - b_2.y & b_2.x - a_2.x\n", + "\\end{array} \\right| } \\end{equation}\n", + "\n", + "Теперь, перед тем, как реализовывать алгоритм, нам нужно доказать корректность его работы.\n", + "\n", + "**Теорема**
\n", + "Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", + "\n", + "**Доказательство**
\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python [default]", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 3bdaef8b5e6111e1f8d1d9ce6596d81e6f1af139 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Tue, 10 Jan 2017 15:51:34 +0400 Subject: [PATCH 02/19] add proof --- Line_segment_intersection.ipynb | 36 ++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index f6cb381..d56f4bb 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -11,7 +11,7 @@ "\n", "Очевидно, что наивный алгоритм, переберающий все пары отрезков, имеет сложность $O(n^2)$. В некотором смысле это оптимальная оценка, так как в случае, когда каждая пара отрезков из множества пересекается, любой алгоритм займет $\\Omega(n^2)$ времени. Однако на практике такие ситуации встречаются редко, обычно пересечений гораздо меньше. Поэтому хотелось бы уметь решать данную задачу быстрее в таких ситуациях. Другими словами, нужен алгоритм, время работы которого будет зависеть не только от $n$, но и от количества пересечений. Такие алгоритмы называются *output-sensitive*. \n", "\n", - "В этом конспекте мы научимся решать поставленную задачу за время $O((n + I)\\log{n})$, где $I$ - количество персечений. Кроме этого мы рассмотрим несколько смежных задач, а также задачу о пересечении отрезков на сфере." + "В этом конспекте мы научимся решать поставленную задачу за время $O((n + I)\\log{n})$, где $I$ - количество персечений. Кроме этого мы рассмотрим несколько смежных задач." ] }, { @@ -499,7 +499,7 @@ "4. Будем идти по отсортированному множеству событий. Каждое новое событие $e$ будем обрабатывать следующим образом:\n", " 1. Проверяем, какого типа событие (начало или конец отрезка) мы встретили. Пусть инициатором этого события является отрезок $s$.\n", " 2. Если событие - левый конец, то делаем следующее:\n", - " 1. Если $events = \\varnothing$, то просто добавляем $s$ в статус и переходим к следующему событию.\n", + " 1. Если $status = \\varnothing$, то просто добавляем $s$ в статус и переходим к следующему событию.\n", " 2. В противном случае нам нужно найти соседей $s$ и проверить отрезки на наличие пересечений. Находим в статусе минимальный элемент, больший $s$ (если такого нет - берем максимальный). Пусть это будет отрезок $t$. Если $t$ - крайний элемент статуса (максимальный или минимальный), то мы проверяем пересечение только с ним. Если нет - то нужно проверить пересечение $s$ не только с $t$, но и с отрезком, идущим в статусе перед $t$ (то есть с соседями сверху и снизу).\n", " 3. После проверки добавляем $s$ в статус.\n", " 4. Переходим к следующему событию.\n", @@ -552,7 +552,37 @@ "**Теорема**
\n", "Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", "\n", - "**Доказательство**
\n" + "**Доказательство**
\n", + "$\\triangleright$
Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны влять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение.
\n", + "$\\triangleleft$\n", + "\n", + "Теперь мы понимаем, что в таком виде алгоритм не находит пересечения трех и более отрезков, имеющих одну общую точку. То есть этот алгоритм можно использовать для ответа на вопрос \"есть ли в множестве такая пара отрезков, которая пересекается?\", но чтобы найти все пересечения, нужно добавить еще один шаг. Добавим к событиям еще один тип - пересечение отрезков. Будем проверять, если событие - это точка пересечения двух отрезков, то эти отрезки меняют порядок и у каждого появляется, возможно, новый сосед. Мы проверим каждую пару новых соседей в статусе на пересечение. Нас будут интересовать только пересечения правее заметающей прямой.\n", + "\n", + "**Теорема**
\n", + "Алгоритм находит все точки точки пересечения и отрезки, которые их содержат. \n", + "\n", + "**Доказательство**
\n", + "$\\triangleright$
Воспользуемся индукцией по событиям, отсортированным в порядке $ q < p \\Longleftrightarrow \\left[ \n", + " \\begin{gathered} \n", + " q.x < p.x \\\\ \n", + " q.x = p.x \\wedge q.y < p.y \\\\ \n", + " \\end{gathered} \n", + "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаы корректно. \n", + "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке пара отрезков, пересекающихся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", + "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их верхний конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$.
\n", + "$\\triangleleft$\n", + "\n", + "**Теорема**
\n", + "Время работы алгоритма - $O((n + I)\\log{n})$, где $I$ - количество пересечений.\n", + "\n", + "**Доказательство**
\n", + "$\\triangleright$
\n", + "На первом шаге алгорим строит множество событий $events$, вместе с сортировкой (или при использовании сбалансированного бинарного дерева в качестве структуры данных) это выполняется за $O(n\\log{n})$. Инициализация статуса занимает константное время. \n", + "\n", + "Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\mid L(p) \\cup C(p) \\cup U(p) \\mid$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$.\n", + "\n", + "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$, следовательно $TODO$.
\n", + "$\\triangleleft$" ] }, { From d50776e23ce6892955a62ea27076afa298609c40 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Wed, 11 Jan 2017 18:35:14 +0400 Subject: [PATCH 03/19] finish proof --- Line_segment_intersection.ipynb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index d56f4bb..5363da8 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -569,7 +569,7 @@ " \\end{gathered} \n", "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаы корректно. \n", "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке пара отрезков, пересекающихся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", - "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их верхний конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$. \n", + "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$. \n", "$\\triangleleft$\n", "\n", "**Теорема**
\n", @@ -581,8 +581,10 @@ "\n", "Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\mid L(p) \\cup C(p) \\cup U(p) \\mid$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$.\n", "\n", - "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$, следовательно $TODO$. \n", - "$\\triangleleft$" + "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$. \n", + "$\\triangleleft$\n", + "\n", + "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дополнить недостающую часть." ] }, { From 62712006b2320c490a05753ddfef85e743d199f8 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Thu, 12 Jan 2017 15:10:36 +0400 Subject: [PATCH 04/19] add impl --- Line_segment_intersection.ipynb | 147 +++++++++++++++++++++++++++++++- segments_set.in | 5 ++ 2 files changed, 148 insertions(+), 4 deletions(-) create mode 100644 segments_set.in diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index 5363da8..083dade 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -333,7 +333,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -350,7 +350,7 @@ "data": { "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -368,6 +368,9 @@ " def __init__(self, x = 0.0, y = 0.0):\n", " self.x = x\n", " self.y = y\n", + " \n", + " def __sub__(self, p):\n", + " return Point(self.x - p.x, self.y - p.y)\n", "\n", " def __repr__(self):\n", " return \"(%r, %r)\" % (self.x, self.y)\n", @@ -584,7 +587,7 @@ "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$. \n", "$\\triangleleft$\n", "\n", - "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дополнить недостающую часть." + "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дописать недостающую часть." ] }, { @@ -594,7 +597,143 @@ "collapsed": true }, "outputs": [], - "source": [] + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "from decimal import *\n", + "from enum import Enum\n", + "from blist import sortedset\n", + "\n", + "getcontext().prec = 70\n", + "step = 5\n", + "Type = Enum('Type', 'left right inter')\n", + "\n", + "class Type(Enum):\n", + " left = 0\n", + " right = 1\n", + " inter = 2\n", + " \n", + " def __lt__(self, other):\n", + " return self.value < other.value\n", + "\n", + "class Point:\n", + " __slots__ = (\"x\", \"y\")\n", + "\n", + " def __init__(self, x = 0.0, y = 0.0):\n", + " self.x = x\n", + " self.y = y\n", + "\n", + " def __sub__(self, p):\n", + " return Point(self.x - p.x, self.y - p.y)\n", + "\n", + " def __lt__(self, p):\n", + " return self.x < p.x or self.x == p.x and self.y < p.y\n", + "\n", + " def __eq__(self, p):\n", + " return self.x == p.x and self.y == p.y\n", + "\n", + " def __gt__(self, p):\n", + " return not (self < p or self == p)\n", + "\n", + " def __repr__(self):\n", + " return \"(%r, %r)\" % (self.x, self.y)\n", + "\n", + "class Segment:\n", + " __slots__ = (\"a\", \"b\", \"id\")\n", + "\n", + " def __init__(self, a, b, id):\n", + " self.a = min(a, b)\n", + " self.b = max(a, b)\n", + " self.id = id\n", + "\n", + " def __lt__(self, s):\n", + " if s is None:\n", + " return False\n", + " if self.id == s.id:\n", + " return False\n", + " if self.a == s.a:\n", + " return self.b < s.b\n", + " return self.a < s.a\n", + "\n", + " def __eq__(self, s):\n", + " return self.id == s.id\n", + "\n", + " def __gt__(self, p):\n", + " return not (self < p or self == p)\n", + "\n", + " def __repr__(self):\n", + " return \"[%r, %r]\" % (self.a, self.b)\n", + "\n", + "class Event:\n", + " __slots__ = (\"segment\", \"t\", \"addit_segment\", \"inter_point\") # addit_segment & inter_point are used only for type = inter\n", + "\n", + " def __init__(self, segment, t, addit_segment = None, inter_point = None):\n", + " self.segment = segment\n", + " self.t = t\n", + "\n", + " def __lt__(self, e):\n", + " a = self.segment.a if self.t == Type.left else \\\n", + " self.segment.b if self.t == Type.right else self.inter_point\n", + " b = e.segment.a if e.t == Type.left else \\\n", + " e.segment.b if e.t == Type.right else e.inter_point\n", + " if a == b:\n", + " if self.t == e.t:\n", + " if self.segment == e.segment:\n", + " return self.addit_segment < e.addit_segment\n", + " return self.segment < e.segment\n", + " return self.t < e.t\n", + " return a < b\n", + "\n", + " def __eq__(self, e):\n", + " return self.segment.id == e.segment.id and self.t == e.t\n", + "\n", + " def __gt__(self, e):\n", + " return not (self < e or self == e)\n", + "\n", + " def __repr__(self):\n", + " if type != Type.inter:\n", + " return \"Event [%r, type = %r]\" % (self.segment, self.t)\n", + " return \"Event inter [%r, %r, point = %r]\" % (self.segment, self.addit_segment, self.inter_point)\n", + "\n", + "max_x = max_y = min_x = min_y = 0\n", + "events = []\n", + "with open(\"segments_set.in\") as inp:\n", + " n = int(inp.readline()) # number of segments\n", + " for i in range(0, n):\n", + " x1, y1, x2, y2 = map(float, inp.readline().split())\n", + " s = Segment(Point(x1, y1), Point(x2, y2), i)\n", + " events.append(Event(s, Type.left))\n", + " events.append(Event(s, Type.right))\n", + " max_x = max(max_x, x1, x2)\n", + " max_y = max(max_y, y1, y2)\n", + " min_x = min(min_x, x1, x2)\n", + " min_y = min(min_y, y1, y2)\n", + " plt.plot([x1, x2], [y1, y2])\n", + "\n", + "events.sort()\n", + "status = sortedset()\n", + "intersections = set()\n", + "\n", + "for e in events:\n", + " line_segment = e.segment\n", + " if e.t == Type.left:\n", + " # Находим соседей отрезка сверху и снизу, и, если они есть,\n", + " # проверяем отрезки на наличие пересечения. Добавляем\n", + " # новые события в статус.\n", + " status.add(line_segment)\n", + " if e.t == Type.right:\n", + " status.remove(line_segment)\n", + " # Если у каких-то отрезков поменялись соседи,\n", + " # проверим их. Добавляем новые события\n", + " # в статус.\n", + " if e.t == Type.inter:\n", + " # Меняем порядок отрезков и проверяем\n", + " # каждую пару новых соседей. Новые пересечения\n", + " # добавляем в статус.\n", + "\n", + "plt.axis([min_x - step, max_x + step, min_y - step, max_y + step])\n", + "plt.show()" + ] } ], "metadata": { diff --git a/segments_set.in b/segments_set.in new file mode 100644 index 0000000..db1e559 --- /dev/null +++ b/segments_set.in @@ -0,0 +1,5 @@ +4 +1 3 1 -2 +6 0.5 1 0.1 +3 3 1 1 +5 -2 1 3 \ No newline at end of file From 83f5410d7c0890d38e36515e3de5c56eeecc15ee Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Fri, 13 Jan 2017 11:52:38 +0400 Subject: [PATCH 05/19] code clean up --- 2_segments.in | 15 +++++++-- Line_segment_intersection.ipynb | 55 ++++++++++++++------------------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/2_segments.in b/2_segments.in index 1e43d4f..f16f6c6 100644 --- a/2_segments.in +++ b/2_segments.in @@ -1,2 +1,13 @@ -3 7.9 -10 8 -2 7.7 -4 -6 \ No newline at end of file +6 +1 1 4 4 +2 3 2 4.5 +0 0 4 4 +4 1 1 4 +1 1 3 5 +3 5 2 2 +1 1 5 3 +3 2 3 0 +1 1 3 3 +2 2 5 5 +1 1 2 2 +3 3 5 5 \ No newline at end of file diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index 083dade..b0fccaa 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -333,24 +333,16 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Segments: [(3.0, 7.9), (-10.0, 8.0)] [(2.0, 7.7), (-4.0, -6.0)]\n", - "Segments don't intersect\n" - ] - }, { "data": { - "image/png": "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\n", + "image/png": "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\nERHJkrDvaeqIr1o1FnikuZnNbEvgSfzN232BA4AKM/vUOfdMeGE2b8WKFZw3cCBjKiroFIvRLahG\n8+XVV3MbUH/uubQbORJiungnIiIiIlJMQm00OecmA5Phx8Elm3MOUO2cuyx4/p6Z7QGUA5E2ms4b\nOJBxFRWMcI4z6+vpUF/PD8CawC3ABz/8wN1qMImIiIiIFJ18O8rfBZiWMG0KsGsEsfyourqaMRUV\nDHOO8/EjZIJvMDX+O2bsWGpqaqIJUEREREREQpNvjaYuQG3CtFpgPTNbK4J4AJgwYQKdYjHObOL1\nMqBTLEZlZWUuwxIRERERkRwomnGaysvL6dy582rTSktLKS0tbfVn19bW0i0Wo0N9fdLXOwBbxGLU\n1ia290SKV1VVFVVVVatNq6uriygaERERkfDkW6Ppc6AkYVoJsMg5tzzVG4cPH07v3r1DCaqkpIQF\nDQ18x6quefGWAgsaGigpSQxdpHglOykxb948+vTpE1FEIiIiIuHIt+55LwL7J0w7KJgemb59+7K4\noYGxTbw+FljS0EC/fv1yGZaIiIiIiORAqI0mM+toZjuYWa9gUo/g+ebB69ebWfwYTHcF89xoZr8w\ns3OB44Bbw4yzOT169KB/WRkXm3E78F0wfSlwO3CJGf3LyujevXt0QYqIiIiISCjC7p63IzADcMFj\nWDB9PHAGvvDD5o0zO+fmm9lhwHDgAuB/wJnOucSKejl3x513AnBRRQVXx2JsEYzTtKShgf5lZT++\nLiIiIiIixSXscZqeI8XVLOfc6UmmzQLy7qaI9u3bc/fo0VwxaBCVlZXU1tbSpUsX+vbtqytMIiIi\nIiJFLN8KQeS97t27M3jw4KjDEBERERGRHMm3QhAiIiIiIiJ5RY0mERERERGRFNRoEhERERERSUGN\nJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRoEhERERERSUGN\nJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRoEhERERERSUGN\nphaqqqoq6uVFsUytY/EsU7InX78/xZUZxSVRydfvWHFlRnFFL/RGk5kNNLMaM1tmZi+Z2U4p5t3b\nzBoSHvVmtknYcWZKB9uFv7woltkW1jFqZnalmT1vZkvN7Ouo42mtfP3+FFdmFFdhyuQYJl/l63es\n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\nieQ5M7sB2NU5t3fUseQL5RGRzBRiHtF+LhKunDWaghKYx+Nv9vqt8yNdJ86zN/4S8nxgbeAt4M/O\nuRdyEqSIFDwzexuYDGyOv+H5E2CUc64i0sBEpGAoj4hIotAbTWa2HfAivhG0GOjrnJvcxLzb4pPT\nq/h67/2Bk4GdnXOvN/GejfCXzufjq4CISHTWxlfmmeKc+yqKAMxsGb6b7zB8l5Sd8WdfBzjn7mvi\nPcojIvmj4PKIcohIXgklh+Si0bQGsAXQGV93vT++VOBPrjQ18f6ZwALn3KlNvN4XqMxOtCKSJf2c\ncxOiWLCZLQdeds7tGTdtBLCjc273Jt6jPCKSfwomjyiHiOSlrOaQ0Ae3dc6txNdmB3jNzHYGLsQP\n2JeOl/F19ZsyH+D++++nZ8+eLQ0zFOXl5QwfPjzqMH5CcWVGcaXvnXfe4aSTToJgv4zIZ/gB8uK9\nAxyT4j3zQXkkE4orM4orfQWaR+aDckgmFFdmFFf6wsohoTeakojhu96lqxc+eTXle4CePXvSu3d+\nVQLt3Llz3sUEiitTiqtFouye8jzwi4RpvwAWpHiP8kiGFFdmFFeLFFIeUQ7JkOLKjOJqkazmkFAb\nTWZ2HfAv/GjDnYB++HuWDgpevx7YtLHrnZldCNTgR5VeG9+Vb1/gwDDjFJGiMhx43swGAQ/hR0Yv\nw+cTEZF0KI+IyGrCvtK0CTAe6ArU4ccKOMg5Nz14vQu+Mk2jNfE3XW4KfBfMv79zblbIcYpIkXDO\nvWpmRwM3AFfjT8Rc6Jx7INrIRKRQKI+ISKJQG03OubJmXj894fnNwM1hxiQixc859zTwdNRxiEjh\nUh4RkXixqAMoZqWlpVGHkJTiyozikijl6/esuDKjuCQq+fodK67MKK7o5Wxw27CYWW9g7ty5c/P5\nRjSRNmHevHn06dMHoI9zbl7U8aRLeUQkfxRiHlEOEckfYeUQXWkSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1gjzw83sbOAcYMtg0tvANc65ySne\n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\nRERERESkAWqaREREREREGqCmSUREREREpAFqmkRERERERBqgpklERERERKQBappEREREREQa8P8B\nsqg7JJz87VoAAAAASUVORK5CYII=\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -379,6 +371,9 @@ " def __init__(self, a, b):\n", " self.a = a\n", " self.b = b\n", + " \n", + " def __lt__(self, s):\n", + " return self.a < s.a or self.a == s.a and self.b < s.b\n", "\n", " def __repr__(self):\n", " return \"[%r, %r]\" % (self.a, self.b)\n", @@ -411,16 +406,12 @@ "\n", "def convert_by_x(s): # s.a.x <= s.b.x\n", " if s.a.x > s.b.x:\n", - " tmp = s.a\n", - " s.a = s.b\n", - " s.b = tmp\n", + " s.a, s.b = s.b, s.a\n", " return s\n", "\n", "def convert_by_y(s): # s.a.y <= s.b.y\n", " if s.a.y > s.b.y:\n", - " tmp = s.a\n", - " s.a = s.b\n", - " s.b = tmp\n", + " s.a, s.b = s.b, s.a\n", " return s\n", "\n", "def bounding_box(s1, s2):\n", @@ -443,22 +434,22 @@ " return 0\n", " return 1\n", "\n", + "f, axes = plt.subplots(2, 3, figsize=(10, 7))\n", "with open(\"2_segments.in\") as inp:\n", - " x1, y1, x2, y2 = map(float, inp.readline().split())\n", - " s1 = Segment(Point(x1, y1), Point(x2, y2))\n", - " x3, y3, x4, y4 = map(float, inp.readline().split())\n", - " s2 = Segment(Point(x3, y3), Point(x4, y4))\n", - "\n", - "print(\"Segments:\", s1, s2)\n", - "if check_intersection(s1, s2) != 0:\n", - " print(\"Segments intersect\")\n", - "else:\n", - " print(\"Segments don't intersect\")\n", - "\n", - "plt.plot([x1, x2], [y1, y2])\n", - "plt.plot([x3, x4], [y3, y4])\n", - "step = 5\n", - "plt.axis([min(0, x1, x2, x3, x4) - step, max(x1, x2, x3, x4) + step, min(0, y1, y2, y3,y4) - step, max(y1, y2, y3, y4) + step])\n", + " n = int(inp.readline()) # number of tests\n", + " for i, axis in zip(range(0, n), axes.reshape((6))):\n", + " x1, y1, x2, y2 = map(float, inp.readline().split())\n", + " s1 = Segment(Point(x1, y1), Point(x2, y2))\n", + " axis.scatter(x1, y1, c = 'r', s = 40)\n", + " axis.scatter(x2, y2, c = 'r', s = 40)\n", + " axis.plot([x1, x2], [y1, y2], c = 'r')\n", + " x3, y3, x4, y4 = map(float, inp.readline().split())\n", + " s2 = Segment(Point(x3, y3), Point(x4, y4))\n", + " axis.scatter(x3, y3, c = 'b', s = 40)\n", + " axis.scatter(x4, y4, c = 'b', s = 40)\n", + " axis.plot([x3, x4], [y3, y4], c = 'b')\n", + " axis.set_title(\"Segments intersect\" if check_intersection(s1, s2) != 0 else \"Segments don't intersect\")\n", + "\n", "plt.show()" ] }, From 2925a504444a3f8c9ae9ab1d969f79fe2b2cb1ac Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Fri, 13 Jan 2017 12:17:48 +0400 Subject: [PATCH 06/19] code clean up --- 2_segments.in | 8 ++++---- Line_segment_intersection.ipynb | 10 ++++++---- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/2_segments.in b/2_segments.in index f16f6c6..254e07b 100644 --- a/2_segments.in +++ b/2_segments.in @@ -7,7 +7,7 @@ 3 5 2 2 1 1 5 3 3 2 3 0 -1 1 3 3 -2 2 5 5 -1 1 2 2 -3 3 5 5 \ No newline at end of file +1 5 4 2 +3 3 5 1 +3 5 3 4 +3 3 3 1 \ No newline at end of file diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index b0fccaa..cd4fa51 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -333,16 +333,16 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { - "image/png": "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\nERHJkrDvaeqIr1o1FnikuZnNbEvgSfzN232BA4AKM/vUOfdMeGE2b8WKFZw3cCBjKiroFIvRLahG\n8+XVV3MbUH/uubQbORJiungnIiIiIlJMQm00OecmA5Phx8Elm3MOUO2cuyx4/p6Z7QGUA5E2ms4b\nOJBxFRWMcI4z6+vpUF/PD8CawC3ABz/8wN1qMImIiIiIFJ18O8rfBZiWMG0KsGsEsfyourqaMRUV\nDHOO8/EjZIJvMDX+O2bsWGpqaqIJUEREREREQpNvjaYuQG3CtFpgPTNbK4J4AJgwYQKdYjHObOL1\nMqBTLEZlZWUuwxIRERERkRwomnGaysvL6dy582rTSktLKS0tbfVn19bW0i0Wo0N9fdLXOwBbxGLU\n1ia290SKV1VVFVVVVatNq6uriygaERERkfDkW6Ppc6AkYVoJsMg5tzzVG4cPH07v3r1DCaqkpIQF\nDQ18x6quefGWAgsaGigpSQxdpHglOykxb948+vTpE1FEIiIiIuHIt+55LwL7J0w7KJgemb59+7K4\noYGxTbw+FljS0EC/fv1yGZaIiIiIiORAqI0mM+toZjuYWa9gUo/g+ebB69ebWfwYTHcF89xoZr8w\ns3OB44Bbw4yzOT169KB/WRkXm3E78F0wfSlwO3CJGf3LyujevXt0QYqIiIiISCjC7p63IzADcMFj\nWDB9PHAGvvDD5o0zO+fmm9lhwHDgAuB/wJnOucSKejl3x513AnBRRQVXx2JsEYzTtKShgf5lZT++\nLiIiIiIixSXscZqeI8XVLOfc6UmmzQLy7qaI9u3bc/fo0VwxaBCVlZXU1tbSpUsX+vbtqytMIiIi\nIiJFLN8KQeS97t27M3jw4KjDEBERERGRHMm3QhAiIiIiIiJ5RY0mERERERGRFNRoEhERERERSUGN\nJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRoEhERERERSUGN\nJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRoEhERERERSUGN\nphaqqqoq6uVFsUytY/EsU7InX78/xZUZxSVRydfvWHFlRnFFL/RGk5kNNLMaM1tmZi+Z2U4p5t3b\nzBoSHvVmtknYcWZKB9uFv7woltkW1jFqZnalmT1vZkvN7Ouo42mtfP3+FFdmFFdhyuQYJl/l63es\nuDKjuKIXaqPJzE4AhgFDgd8CbwBTzGzjFG9zwDZAl+DR1Tm3MMw4RaSotAceAv4edSAiUrhaeAwj\nIkUq7CtN5cDdzrl7nXPvAmcD3wFnNPO+L5xzCxsfIccoIkXEOfcX59wI4D9RxyIiBa2lxzAiUoRC\nazSZWXugD/Bs4zTnnAOmAbumeivwupl9amZTzWy3sGIUERERSdSKYxgRKVJrhPjZGwPtgNqE6bXA\nL5p4z2fAAOBVYC2gPzDTzHZ2zr3exHvWBnjnnXdaHXAm6urqmDdvXtEuL4plah0Lf5lx++HaOVlg\n9kSSR9IRxW8mHYorM4orfXmSRzI9hlEOyZDiyoziSl9oOcQ5F8oD6Ao0AL9LmH4j8GIGnzMTGJ/i\n9b74+6D00EOP/Hn0zXI+uR6fT5p61APbJrznVODrND9feUQPPfLvkdU8EuYxDMoheuiRj4+s5pAw\nrzR9iT+QKUmYXgJ8nsHnvAzsnuL1KUA/YD7wfQafKyLZtzawJX6/zKZbgHHNzFPdis9XHhHJH2Hl\nkUxkegyjHCKSP0LJIRacIQmFmb0EzHHOXRg8N+Aj4Hbn3M1pfsZUYJFz7rjQAhWRomNmpwLDnXMb\nRh2LiBSebBzDiEjxCPNKE8CtwD1mNhd/xagc6ADcA2Bm1wObOudODZ5fCNQAb+Nbif2BfYEDQ45T\nRIqEmW0ObAh0A9qZ2Q7BS//nnFsaXWQiUmBSHsOISNsSaqPJOfdQMJ7BNfhL2q8DBzvnvghm6QJs\nHveWNfFjImyKL+v5JrC/c25WmHGKSFG5Bjgl7nnjHar7AsolIpKWNI5hRKQNCbV7noiIiIiISKEL\ne3BbERERERGRglYQjSYzG2hmNWa2zMxeMrOdUsy7t5k1JDzqzWyTNJe1p5k9YWafBO89Io337GNm\nc83sezN7P7gBPZP1y2iZWVjHQWb2spktMrNaM3vUzLZN430tWs+WLC8L63i2mb1hZnXB4wUzOySM\n9WvJ8lq7fkk+74rgM25tZr5W/VYzXWa21zMXzOxKM3vezJaa2dcRxpF23sthTBnnxxzE1KJ8loO4\nMs5BUUg3d+QgjqFJcsV/o4wpUSb7ZK5yX0v2yWz+HchWXLnYXi3NFWFvr5bElaPtldPjqLDiyua2\nyvtGk5mdgL/PaSjwW+ANYIr5fsZNccA2+HumugBdnXML01xkR3y/5XODz2kuvi2BJ/Gjhu8AjAAq\nzCyT4hUZLTPQmnXcExgJ/A44AGgPTDWzdZp6QyvXM+PlBVqzjh8DlwO98aO6TwceN7OeyWbOdv4Y\n2wAAIABJREFUwveY0fICrVm/+Nh3As7C7xup5tuS1v9WM1pmICvrmUPtgYeAv0cVQAvzXi60JFeF\nraX5JWwtyQk5leF+nAtv4e8daswVe0QbzioRHIukK4pjlqzHFQh7e+X62Ce0uAJhb69cH0eFElcg\nO9sqqoHjMhhg7iVgRNxzA/4HXNbE/Hvjx1ZYLwvLbgCOaGaeG4E3E6ZVAU+HuMysrWPweRsHy90j\nF+uZ5vKyuo7BZ34FnJ6L7zGN5WVl/YB1gfeA/YAZwK1hf4cZLjPr32OuHmQwOG4Iy84o70UUY7O5\nKqK4ms0vEcbWZE6IIJa09+McxTMUmBf1dkkRX2THIhnEmPNjlizGFcX2yumxT5bjiuRva66Po7IU\nV9a2VV5faTKz9vhW5LON05zfAtOAXVO9FXjdzD41s6lmtluIYe4SxBNvCqnjy4ZsruP6+FZ4qq5I\n2VzPdJYHWVpHM4uZ2Yn4UrEvNjFb1tYvzeVBdtbvTmCSc256GvNmax0zWSbkdn8seK3Ie+Klm19y\nJoOckEuZ7se5sE3QnetDM7vf/PABkSuQY5F0RXXMko5cb69cH/ukK6fHSOnI9XFUluOCLG2rsMdp\naq2NgXZAbcL0WuAXTbznM2AA8CqwFn6sp5lmtrNz7vUQYuzSRHzrmdlazrnlISwza+toZgbcBsx2\nzqXqP56V9cxgea1eRzPbDr8TrQ0sBo52zr3bxOytXr8Ml5eN9TsR6AXsmM78ZGcdM11mrvfHYtCS\nvCdklF9yFU8mOSFnWrAf58JLwGn4q19dgT8Ds8xsOxf9+GqFcCySriiOWdKR0+2V62OfEOLKyfbK\n9XFUSHFlbVvle6MpY86594H34ya9ZGZb4Qely/oNaVHI8jqOAn4F7J6l8LKyvCyt47v4frWdgeOA\ne81srxAPWtJeXmvXz8w2wyfWA5xzK7IRfBjLzJf90fxA2penmMUBPYN4pXDlOp81J9c5qFlR5I50\nOOemxD19y8xeBhYAxwPjoomq5fIl9xWKCLZXvuWKRrk8RkpH3uWwQM6Ot+Lle6PpS3w/xJKE6SXA\n5xl8zsuEt2N8TvL4FuX4jE3G62hmdwCHAns65z5rZvZWr2eGy0smo3V0zq0EqoOnr5nZzsCFwDlJ\nZm/1+mW4vGQyWb8+wM+AecGZKfBnQvcys/OAtYLuI/Fau44tWWYyYe6PTbmF5g+8qpt5PVeylffa\nlCzkl6zLQk4IQ7b241A55+rM7H1g66hjoTCORdKVL8cs6Qhle+X62CekuJLJ+vbK9XFUSHEl06Jt\nldeNJufcCjObC+wPPAE/XrrcH7g9g4/qhb88F4YXgd8nTDuI3Pdbz2gdg53zSGBv59xHabylVevZ\nguUl09rvMYa/NJtMGN9jquUlk8n6TQO2T5h2D/AOcEMTBz2tXceWLDOZMPfHpJxzX+FvFM17Wcx7\nbUaW8ksuZJoTwpCt/ThUZrYuvsF0b9SxFMixSLry5ZglHVnfXrk+9gkxrmRy8fvK9XFUusI83lql\ntZUkwn7gL81/B5wC/BK4G3/w87Pg9euB8XHzXwgcAWwF/BrfDWEFsE+ay+uIv+TXC1+95KLg+eZN\nLG9LfH/KG/F9m88FfsB3fUh3HTNdZmvXcRTwDb7MZUncY+24ea7L1nq2cHmtXcfrguV1A7YLtuFK\nYL8wvscWLK9V69dEDKtVwMrmd9iKZWZ9PcN+AJsH+98QoC74/w5AxxzGkDLvRbhtUuaqiGJqNr9E\nFFfKnJBPj8T9OKIYbgb2CrbXbsAz+PshNop6+wTx5fRYJIO4cn7MElJcoW+vdHJFkr9hoW+vFsaV\ni+2V0+OoEOPK2rbK2kqE+Qg2/HxgGb7FumPca+OA6XHPLwU+AJYCX+Cr3eyVwbL2Dnbw+oTHP5It\nL5i2FzA3iO8D4OQM1y+jZWZhHZMtqx44pant2pr1bMnysrCOFfhLt8vwl4ynEnewku3vMdPltXb9\nmohhOqs3YLL+W810mWGsZ9iPYB2S/V5zGjcp8l6E2yZlrooopmbzS0RxpcwJ+fRI3I8jiqEKX8J7\nGfARMAHoHvW2SYgxZ8ciGcSU82OWMOLKxfZKJ1dEsb1aEleOtldOj6PCiiub28qCDxQREREREZEk\n8nqcJhERERERkaip0SQiIiIiIpKCGk0iIiIiIiIpqNEkIiIiIiKSghpNIiIiIiIiKajRJCIiIiIi\nkoIaTSIiIiIiIimo0SQiIiIiIpKCGk0iIiIiIiIpqNEkIiIiIiKSghpNIiIiIiIiKajRJAXFzO4x\ns5qo4xCRwqU8ItJ2mdlMM5sedRypmFk3M2sws1OijkVWUaMpy8xsezObaGbzzWyZmf3PzKaa2XlR\nx5ZrZtbVzIaa2W+y+LEOaGhhPL83s6FZjCVSZnaOmZ0adRySfcojqyiPhEt5JDraz1cJaT9vigt7\nAWb258QTM2Y2yMyOzOBjWhSnma0TbMu9WvL+fGNmPYP12SLqWNRoyiIz2w14BdgeGA0MBMYA9cAF\nEYYWlU2BoUCvLH5mGfDLFr73UGBIFmOJ2rmADnaKjPLITyiPhEt5JALaz38ijP08So6fNnquBNJq\nNDnnFgDrAPe1YNkd8Ntynxa8Nx/9Cr8+W0YcB2tEHUCRuQr4FtjRObc4/gUz2ziakCJl2f5A51w9\n/o9KS2Q9HgAzW9s5930Yny1tkvLI6pRHpBhpP19dKPtVIXPO/dDCt4aVozo4574L47ObWzQ5uDqY\nFuecHll6AO8Az2Yw/0nAq8B3wFdAFbBZkvkGAh8G870E7AHMBKbHzbM3vrvJH/Et8v8Bi4CHgU7A\nmsBtQC2wGPgH0L4lMQXLfhPoCcwAlgbLuzRJPPXBv43/PyV4fWvgn8BnwDLg42BZnZrZZvcANXHP\nuwWf/SegP/B/wPfAy/g/Ro3zjUsWT9zrBlwEvBXE8zlwF7B+wvLnA08AB+HPEi4DLgheOxD4N/BN\nsI3fBf6W8P41gb8AHwRxfgTcCKzZxHcxJ9i+XwPPAQcEr9XErUfjY3qqbadHYTxQHlEeUR4p+gfa\nz0Pfz4P3nhXsz/HbY0bi7xz4GTA22GeXAa83Lj9unrTyRDDvUKA67nni+jUA/0gRd+OyTombdk/w\nfWwKPBb8fyFwM2AJ70tc1pC4z/kFMDH4zpbhc9DhCcs/NXjfXsCo4LfwVfDausHvoyZY/1pgKtAr\n4TN+B0zGnxxYGvwWdkuyrpsG2/6T4POqg2WuERdH4m9jryj2W11pyq4FwC5m9mvn3NupZjSzq4Br\ngAfwl+R/hr8k/5yZ/dY5tyiY7xxgJP4P3a34y5OP4f+gfpzkowfhk8P1+ERzPrAC/0NbH78j74L/\nIVYDf800JnyLf0PgX8AjwfzHATeY2ZvOuSn4PwhDgs+7G38QAPCCmbXH72DtgdvxSernwB+CGFc7\n65Yg2SVvgH74Hfmu4PXLgX+aWQ/nzyrfhd8xDwjmTTwTMxo4Bf/HYQTQPdh2vcxs9+AzGpf/S2BC\nsF6jgffM7FfAJHyivRpYjt/+uzUuwMwsmGe34L3v4rtmlAPbAMfEzTsU/109H3zeD/gEtB8wDbgQ\nuCPYVn8N1qc2xXaTwqE8ojyiPFL8tJ+HvJ+b2Zn4fXY2MBzogT9Z8TX+REPjfGsH26xHsP3m4xuU\n95hZZ+fcyISPbi5PJHMSvmEwB7+/g2/cZsLhb6uZgm8AXozPRX/CN+DuBr4Azg5ieyR4gG+4Yma/\nxm+P/+G/96XA8cBjZnaMc+7xhGWOwjfM/oLv9kewnGPw2+odYCN8Y7QnPndhZvsBT+Mb1X/G/6ZO\nB6ab2R7OuVeD+briG23rBZ/7Hv77PS5Y3iz8934+/vf3bhDDOxluu+yIoqVWrA/8j/cHfNJ5HrgB\nf9ZwjYT5tgjmuTxh+q+C918RPG+P3wFeBGJx851MwhlBVp2peQNoFze9Et8qfzJhWc+z+lmQtGIK\nps0IPrNv3LT2wKfAQ3HT+pBwpiSYvkMw/egWbONxCXE3nlVZCKwXN/3wIMZD46aNJO6scNz0PYLP\nOCFh+oHB9BPjptUEn3tAwrwXBtM3SBH7ScE23jVh+lnBe3cJnm8FrAQebmZb/AedFS66h/KI8ojy\nSPE/tJ+Hu5/jr1J8jj9oXyNu+plJtkfjfhe/j7YL1rsO6BhMSztPNBHTYlJcXUqYN9mVpnHBcq5M\nmHcu8HLc841IuLoU99o04LUkv7PZwLtxzxuv8MwkuIoV99o3wO3NxP8e8FTCtLXwDcXJcdPGB7+l\n36b4rGOJ8OpS/EOFILLIOTcN2BV4HPgNcCn+jMAnZnZ43KzH4s/oPWxmGzU+8DviB8C+wXw74X/8\nY5xz8ZWeJuB/tMmMd6uf6ZgT/PuPhPnmAJubWeNvIN2YGi1xzk2IW/cV+EvUPZqIK15d8O8hZrZO\nGvOn4wG36swW+DNVlmY8x+EvHz+bsO6vAUv46brXBN91vG+Df48OzgQ3tZx3gPcTljMjiLVxOUcH\nz69JI3YpMsojyiMojxQ97eeh7+c7ApsAdznnVsZNHx/3mY1+D3zunHsgLsZ6/BWOdfGNzHityRPZ\ncHfC83+ns2wz2wD/3TwMdE747qYC2wRXfho5/O8p8ar8t8DvEuaNX04v/FXvqoRldAKexXf5a7xq\nfiTwhHPutebizwfqnpdlzrm5wHFmtgb+DMnR+G4TD5tZL+fcu/jL4DH85dSffAT+TA34szmOhEu4\nzrl6M5vfRAiJl+DrUkyPAZ3xCTXdmBr9L8l83+C7iaTknJtvZsPwl5RPMrN/4y+Z35+QiDKx2vo5\n574Njjk2SOO92+Av8y9MFi4+8carSTLfg/gzWGPw3Q6exV8WnxiXcLbBd8n5opnl9MCf4Ynm8rNE\nTnlEeQTlkaKn/TzU/bxbEMtqMTrnVppZdZJ5P0jyGe/gG0PdEqa3Jk+01vfOua8Spn2T5rK3xq/P\ntcR1tYzTmD8+i5s2P8l8l+Hvr/rYzObiu+Hd65xrzGnbBP/e20QcDWbWGX/laT0gZffUfKJGU0iC\nMxtzgblm9gH+suof8T/WGP6P2SEkHytkSSsW3VR/2qamN57NzDSm5j4vJefcpWZ2D/4sw0H4MzpX\nmNkuzrlP0/mMLMYTw/fj79vE/IkHJ8sSZ3C+6tVeZrYvcBh+O56AP+t8UHDAE8N3hSlvYjnJ+pxL\nG6Y8kpryiPJIMdB+nloI+3lrtWp9Qlp2OhqvFN6Cv6qZTGJDOFmeetjMZuEb+QcBlwCXm9nRzt+j\n1rici/FdQJNZgm80FRQ1mnLj1eDfxkuZH+J3rvnOuWRnahotCObbGn+TIgBm1g5/g2dTP8aWSDem\nTCRe0l39RX/z69vAdWa2C/AC/gbGsMZAaSqeD4H9gRecc8tbtQDnZuC7yVxiZoPwZ3P2BaYHy/lN\nME8qH+KTzq8Ibt5sanGtiVUKjvJIsheVR5qiPFKYtJ8nezHz/bxxe2yDvy8HgOCqXneCggVx8ya7\n6tUz7vVsyNW+1tRyGq+wrXDOTW/VApyrxRebuMt8ifzX8GX0p7DqaufiVMsxsy/wVRu3a25xrYk1\nm3RPUxaZ2T5NvHRY8G9j1Y9H8GdnhjbxORsG/30VXxKyf1xfYvA3Amf7MnC6MWViafDv+gmf1SlI\n5PHeDpYf5pmHpcHy10uY/hD+BMJPkq+ZtQsuI6cU9BVO9AY+aTeu00PAZmbWP8n71zazxso0j+GT\nxJAU9zWAX5/1U7wuBUh55CeUR5RHio7285/I9n7+KkEluaCh1Oj0xGXgu5d1MbMT4pbbDl+xbTFx\njdBWytW+1jiW0mrLcs59gW9ADjCzLolvsjTGBzOzWGLuc859iS/s0fh9zMU3nC4xs45NLSe4cv4Y\ncLiZ9U6x2KX4HBh5ntKVpuwaGfzBehSf8NYEdseXc6zG9wHFOVdtZoPxZ0y6s6refg/gKPxNfrc6\n51aY2Z/xl6JnmNlD+DNGp+Mvoabb+m72knG6MaW5vEYf4m8YPNvMluB/+HPwfbfvMLOHgffxv8NT\n8JWe/pnhMjIxF78tRprZFHwFrAedc7PM7G785f5e+BsiVwDb4m+6voBVZTubMsTM9gKewp+VKgHO\nwZc1nR3Mcx/+t/D3oPvN8/gKPT3xXTEOAuY55z40s78Bg4F/m9kj+NLDOwGfOOeuilufs82Xfv0/\nYGEaZ58l/ymPrE55RHmkGGk/X11W9/Pg3qXB+KshM8zsQfwVptP5aanv0cAAfInxHVlVcnxX4ELn\n3FKyYy5wgJmV4xsZNc65l7P02T9yzn1vZv8FTgi6e34NvBVcrRuILxzxHzMbg/+tleDX9efAb+M+\nKtlvoRPwPzObiD+hswRf9XFH/H1nOOecmZXhG6Nvm9k4/BhMP8dfMa/Dd7UEuDJ4/ywzG42/j2xT\nfM7cPbhv7XV8t8TLzWx9fB57Nmis5Vaq0np6ZPbA/7Eagz8LUofvC/oefnyAjZPMfxT+DMai4PE2\nfmyPrRPmG4j/YX+HTyK74evaPxU3z974H9UxCe89NZjeO2H60GD6hpnGhO828kaS9RkHfJgw7Q/4\n/vfLg+Wdgr+pcgw+AS7Fnw2aBuyTxjZebRnBZ9UD5UnmrQeujnseww/I9jk+4dYnzH8mvqLPEnzy\nfh24DiiJm6caeDzJsvbBHxB9zKrB9+4DtkqYrx2+/++bwff5ZbDMq4B1k3x3r8bNNx3YL+71TfA3\nxH4brKvKBhfBQ3lEeUR5pPgf2s/D38+DzxzAqsFt5+AbptNJGFgY2BiowN+X2Di47ckJ86SdJ5qI\nZdtgeywJ5m9ucNsfB/iN22Z1SeYdCqxMmPa7ICcsCz4nfnDbLYPPahxM9iN8Fcej4+Zp6rfQHl8e\nf16QMxYF/z8rSVy/wVfqWxhs/2r8oMT7JMy3WRDP58F8HwS/o/hS8WcE038gwvLjjSMISwEJulp8\nAfzTOTcg6nhEpPAoj4gUP+3nItkT6j1NZna2mb1hZnXB4wUzOyTF/HubWUPCo97MEku1thlmlqzP\n7qn4EbbVhUIkCTPb1MzuM7Mvzey7IA+l6jNd1JRHRDJXaHlE+7lIuMK+p+lj4HL8JTUDTgMeNz/+\nQFNjRzj8JczFP05wLtm4F23FLmY2HH+J8yv8qNln4LtlTIwyMJF8FPR5fh4/iN7B+C5J29D0AI9t\ngfKISAYKNI9oPxcJUc6755nZV8AlzrlxSV7bG9/XdAPX8sEJi4qZdcP37dwZf7boa/xNwoNcFDfB\nieQ5M7sB2NU5t3fUseQL5RGRzBRiHtF+LhKunDWaghKYx+Nv9vqt8yNdJ86zN/4S8nxgbeAt4M/O\nuRdyEqSIFDwzexuYDGyOv+H5E2CUc64i0sBEpGAoj4hIotAbTWa2HfAivhG0GOjrnJvcxLzb4pPT\nq/h67/2Bk4GdnXOvN/GejfCXzufjq4CISHTWxlfmmeKc+yqKAMxsGb6b7zB8l5Sd8WdfBzjn7mvi\nPcojIvmj4PKIcohIXgklh+Si0bQGsAXQGV93vT++VOBPrjQ18f6ZwALn3KlNvN4XqMxOtCKSJf2c\ncxOiWLCZLQdeds7tGTdtBLCjc273Jt6jPCKSfwomjyiHiOSlrOaQ0Ae3dc6txNdmB3jNzHYGLsQP\n2JeOl/F19ZsyH+D++++nZ8+eLQ0zFOXl5QwfPjzqMH5CcWVGcaXvnXfe4aSTToJgv4zIZ/gB8uK9\nAxyT4j3zQXkkE4orM4orfQWaR+aDckgmFFdmFFf6wsohoTeakojhu96lqxc+eTXle4CePXvSu3d+\nVQLt3Llz3sUEiitTiqtFouye8jzwi4RpvwAWpHiP8kiGFFdmFFeLFFIeUQ7JkOLKjOJqkazmkFAb\nTWZ2HfAv/GjDnYB++HuWDgpevx7YtLHrnZldCNTgR5VeG9+Vb1/gwDDjFJGiMhx43swGAQ/hR0Yv\nw+cTEZF0KI+IyGrCvtK0CTAe6ArU4ccKOMg5Nz14vQu+Mk2jNfE3XW4KfBfMv79zblbIcYpIkXDO\nvWpmRwM3AFfjT8Rc6Jx7INrIRKRQKI+ISKJQG03OubJmXj894fnNwM1hxiQixc859zTwdNRxiEjh\nUh4RkXixqAMoZqWlpVGHkJTiyozikijl6/esuDKjuCQq+fodK67MKK7o5Wxw27CYWW9g7ty5c/P5\nRjSRNmHevHn06dMHoI9zbl7U8aRLeUQkfxRiHlEOEckfYeUQXWkSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1GgSERERERFJQY0mERERERGRFNRo\nEhERERERSUGNJhERERERkRTUaBIREREREUlBjSYREREREZEU1gjzw83sbOAcYMtg0tvANc65ySne\n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\nRERERESkAWqaREREREREGqCmSUREREREpAFqmkRERERERBqgpklERERERKQBappEREREREQa8P8B\nsqg7JJz87VoAAAAASUVORK5CYII=\n", + "image/png": "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\niBvhq1pPA/ZImOTVGtiicucQwhwzOxIvvC4BvgbODSEkZ+wTEalObeWOiEiNQgjvmdlxwK3AAGA2\ncGkI4dF4IxORbJHuxBIFtTx+dhXbpuKLuImI1Ftt5Y6ISF2EEF4EXow7DhHJTmkdzteYFRRk9jot\n0+eL45x6jY3nnJI62fr5Ka76UVwSl2z9jBVX/Siu7GMhhLhjWC1m1gmYPn369Gye2CaSE0pKSujc\nuTNA5xBCSdzx1JXKEZHs0RDLEZUhItkjU2WIeqJERERERETqQZUoERERERGRelAlSkREREREpB5U\niRIREREREakHVaJERERERETqQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETq\nQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETqQZUoERERERGRelgjUycysz7A\nzcDgEMLl1eyzH/B60uYAtA4hzE1ziBKZPXs2Y8eOpbS0lPz8fLp37067du3iDktEREREJCtkpBJl\nZrsB5wEf1mH3AGwDLPptgypQGVFWVkavXhdRVDSSvLzm5OW1paLiCwYOHEhhYQ+GDh1C06ZN4w5T\nRERERCRWaR/OZ2brAWOAQmBBHZ/2fQhhbuUtfdFJIq9AjSKEeygv/5aysn9RXv4NIQymqGgUvXpd\nFHeIIiIiIiKxy8ScqKHAcyGEyXXc34APzOwbM5toZnulMTaJzJo1i6KikYRwF3Ax0Cx6ZF3gEkK4\nk6KikcyePTu+IEVEREREskBaK1FmdirQEehbx6d8C5wPnAAcD3wFTDGzjumJUCqNGzeOvLzmwLnV\n7FFIXl5zxo4dm8mwRERERESyTtrmRJlZG2Aw0DWEUFaX54QQZgIzEza9Y2YdgN7AmTU9t3fv3rRo\n0WKFbQUFBRQUFNQr7lxVWlpKXl5bysubVbNHM/LytqS0tDSjcUn2Ki4upri4eIVtCxcujCkaERER\nkcxJZ2KJzsAmQImZWbStCdDFzC4C1gohhDoc511g79p2GjRoEJ06dVrlYHNdfn4+FRVfAEv5fShf\noiVUVHxBfn5+hiOTbFVVI0VJSQmdO3eOKSIRERGRzEjncL5JwE74cL5dott7eJKJXepYgSJ6/rdp\niVB+061bNyoqFgEPVrPHg1RULKZ79+6ZDEtEREREJOukrScqhLAE+E/iNjNbAswLIXwS3b8Z2DyE\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -699,7 +699,9 @@ " max_y = max(max_y, y1, y2)\n", " min_x = min(min_x, x1, x2)\n", " min_y = min(min_y, y1, y2)\n", - " plt.plot([x1, x2], [y1, y2])\n", + " plt.plot([x1, x2], [y1, y2], c = 'black')\n", + " plt.scatter(x1, y1, c = 'black', s = 30)\n", + " plt.scatter(x2, y2, c = 'black', s = 30)\n", "\n", "events.sort()\n", "status = sortedset()\n", From 98917d1a8cfa0cd33254a75d3d4db51552ca1fb2 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Tue, 24 Jan 2017 22:07:01 +0400 Subject: [PATCH 07/19] little improvements --- Line_segment_intersection.ipynb | 197 ++++++++++++-------------------- samples.py | 82 +++++++++++++ 2 files changed, 157 insertions(+), 122 deletions(-) create mode 100644 samples.py diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index cd4fa51..6c854a8 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -26,7 +26,7 @@ " - Реализация с учетом погрешностей\n", "- Задача о пересечении двух отрезков\n", " - Теория\n", - " - Реализация\n", + " - Упражнение\n", "- Алгоритм Бентли-Оттмана\n", " - Теория\n", " - Упражнение" @@ -44,7 +44,7 @@ " \\begin{cases}\n", " 1, &\\text{если c лежит слева от направленного отрезка ab,}\\\\\n", " -1, &\\text{если c лежит справа от направленного отрезка ab,}\\\\\n", - " 0, &\\text{если три точки лежат на одной плоскости.}\n", + " 0, &\\text{если три точки лежат на одной прямой.}\n", " \\end{cases}\n", "\\end{equation*} $$\n", "\n", @@ -63,7 +63,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 2, "metadata": { "collapsed": false, "scrolled": true @@ -71,9 +71,9 @@ "outputs": [ { "data": { - "image/png": "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\nuyZ+79rHLDL867nnf546hyhnDYDO6vb24w733x1Odx8NV3DTctw18XvXvgz1H/51DlHOGgCd1e3t\nxx3uv7Ex3d3ZWMFNy3HXxO9d+1LMujUQucSeP+6q/bjD/ez5x/txx/vZ8593+GcJUc4aAJ3V7e3H\nHe4fng7dnvan5bjr4veuvZTFhn89I3339tTd2lqvnADoZrm9/bjD/f1BX0fDI3U2Orp5fc1uWo67\nJn5P9yKRvvUc/gcH6na7VZcDAACQhkWGf/0f+AMAAIC1wvAHAABoGQx/AACAlsHwBwAAaBnuw9/M\nftzMvmhmXzezz5vZG7w/EwAAAK7Gdfib2dsk/bykn5X0eklfkPSEmd039Y1E+uKu2o97sp7Y3VC3\ntx93vL8Vkb6SPi/pX5z7b5P0ZUnvueJ6In1xV+vHPVlP7G6o29uPO97fmkhfSfdK+qakzUuvf0LS\n3hXv4Xhf3NX6cU/WcwRvqNvbjzve35rjfSX9WUkvSHrjpdc/IOm/XvEeIn1xN7P2rO5C7G60O3Pt\nWd3Zax+TPtJ3R9LmeN2+rc3NTe3u7i4uIgOyWW5vP+7JemJ3Q93eftzxfg/37u6uNjc3L6ydnZ25\n33/P4h85NyeSnpd0/6XX75f0v6a98XGNbgFIku7cWf4AZDIgm+X29uOerCd2N9Tt7ccd7/dwb29v\na3t7+8Jr5473nc2sWwOrLE1+4O85Sf/wiuvZ88ddrR/3ZD17/qFubz/ueH9r9vzLaJj/sKRTSX9b\n0msl/WtJA0nfecX1RPrirtaPe7Ke2N1Qt7cfd7y/dZG+Zvb3JL1Ho9v9T0v6+6WU37niWiJ9cdfD\nj3uyntjdULe3H3e8n0jfCRDpCwAAsBxE+gIAAMCVMPwBAABaBsMfAACgZTD8AQAAWgbDHwAAoGUw\n/AEAAFpGPYf/8fH6nQRAN8vt7U/q7g162u/vqz/w6XnStqR1e/txx/u9a5+bWacARS55nPBHAHSz\n3N7+pO7B6cDtBL5S0rYlrdvbjzve7117KTU63nfRJc72x121P6nb8+z9UtK2Ja3b24873t+qs/0X\nXReG/3jVOUQ5awB0Vnfm2h3dhyeHF4b+5dU7Wa3nSduS1p259qzu7LWPWWT413PP/zx1C1GO8uOO\n9yd13x1Odx8NV+t50rakdXv7ccf7vWtfhvoP/7qFKEf5ccf7k7pvbEx3dzZW63nStqR1e/txx/u9\n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\n7ng/7ng/kb4TINIXAABgOYj0BQAAgCth+AMAALQMhj8AAEDLYPgDAAC0DIY/AABAy2D4AwAAtIx6\nDv/j47Ure4Oe9vv76g98QpSz5j9ndXv7ccf7ccf7ccf7vWufm1mnAEUuOZzwNzgduJ3AV0re/Oes\nbm8/7ng/7ng/7ni/d+2l1PB433mXHM729zx7v5S8Z0FndXv7ccf7ccf7ccf7W3m2/7zrwvAfrxWC\njg9PDi8M/curd7JaiHLW/Oes7sy1Z3Vnrj2rO3PtWd3Zax+zyPCv557/eVYIUb47nB6ifDRcLQA6\nW/5zdre3H3e8H3e8H3e837v2Zaj/8F8hRPnGxvQQ5c7GagHQ2fKfs7u9/bjj/bjj/bjj/d61L8Ws\nWwORS+z5467Yjzvejzvejzvez57/vMN/TY9BDk+Hrk/7Z81/zur29uOO9+OO9+OO93vXXspiw7+e\nkb57e+puba3V3R/0dTQ8Umejo5vX1x8AnTX/Oavb24873o873o873u/pXiTSt57D/+BA3W636nIA\nAADSsMjwr/8DfwAAALBWGP4AAAAtg+EPAADQMhj+a2R3d7fqEloHPY+HnsdDz+Npes8Z/muk6V8s\ndYSex0PP46Hn8TS957Uc/sd/6BDpGxAB+dWv5ouAzOoe++l5nHvsp+dx7rGfnse5x/6MPV+IWQcB\nRC6dHfKjd63vIJ7YCMi3rNWfNV6SnjfL/VI/Pfd2v9RPz73dL/Xn6fmY9Cf86V3rO4I39jjIt6zV\nn/WoSXreLPdL/fTc2/1SPz33dr/Un6fnYzKf8PcXJP0XvVXSfaPX9t62p9e88jVL+f7gD6S3vvXq\nv9/bk16znPoK/46kx9fi96w9q3uyn57T82a5J/vpOT2fzTPPPKPHHntMkv5iKeW3pl1bt+H/tyR9\nquo6AAAAEvOOUsqvTrugbsP/uqRbkr4k6RvVVgMAAJCKl0n6LklPlFIG0y6s1fAHAAAAf2r5q34A\nAADgB8MfAACgZTD8AQAAWgbDHwAAoGUw/AEAAFoGw98RM/sWM3vazF4ws9dVXU9TMbMHzexjZvas\nmZ2aWd/M3mdm91ZdW5Mwsx83sy+a2dfN7PNm9oaqa2oqZvZeM3vSzP7IzL5iZntm9lDVdbUJM/uZ\ns3+7P1x1LR4w/H35oKQva3TcIvjxWkkm6cckPaLR0VzvlvRPqyyqSZjZ2yT9vKSflfR6SV+Q9ISZ\n3VdpYc3lTZJ+UdIbJb1Z0r2SPm1m31ZpVS3h7Bvbd2n0dd5I+D1/J8zsByR9SNIPSfp9Sd9bSvm9\naqtqD2YUJc/YAAAC6UlEQVT205LeXUrpVF1LEzCzz0v6b6WUf3D23ybpOUn/spTywUqLawFn32R9\nVdL3l1I+V3U9TcbMXi7pQNLflfSPJP1uKeWnqq1q/fCTvwNmdr+kfyPpMUlfr7ictvJKScOqi2gC\nZ9snj0r6T+PXyuinhv8o6fuqqqtlvFKjO4h8TfvzryT9+1LKZ6ouxJN7qi6goXxc0kdLKb9rZg9W\nXUzbMLOOpJ+Q1Ljv1iviPknXJH3l0utfkfTn4stpF2d3WX5B0udKKb9fdT1NxszeLul7Jf35qmvx\nhp/858TM3n/28MdV63kze8jMflLSyyV9YPzWCstOzbw9v/SeV0nal/RrpZRfqqZygLXyUY2eZXl7\n1YU0GTN7tUbfZL2jlPLNquvxhj3/OTkLHbo+47IvSvp1SX/j0uvXJP2xpE+VUt7pUF4jmbPnz5ZS\n/vjs+gckfVbSb9Hn9XF22/9U0g+VUv7dudc/IekVpZS/WVVtTcfMPiLpLZLeVEo5rrqeJmNmPyjp\n30p6Xn/yQ9s1jbZbnpf0raVBA5Phv2bOvnv80+deekDSExo9+PdkKeV/VFJYwzn7if8zkn5b0u0m\n/Z+0DlzxwN+xRg/8/fNKi2soZ4P/ByX95VLKs1XX03TM7DskXd6m/YSkZyT9s1LKM+FFOcKe/5op\npXz5/H+b2dc0+i7yWQa/D2c/8f+mRnde3iPpz4xmk1RKubxPDcvxYUmfMLMDSU9q9OuU367RP46w\nZszso5K2JW1K+trZQ8SS9H9LKcSdO1BK+ZpGv5n1Imf/fg+aNvglhn8U/BTqy1+T9N1n67mz10yj\nvl+rqqgmUUr59bNfN/vHku6X9LSkW6WU/11tZY3l3Rp9/f7mpdffKelXwqtpL439t5vb/gAAAC2D\np/0BAABaBsMfAACgZTD8AQAAWgbDHwAAoGUw/AEAAFoGwx8AAKBlMPwBAABaBsMfAACgZTD8AQAA\nWgbDHwAAoGUw/AEAAFrG/wcGpMm0yIOP4AAAAABJRU5ErkJggg==\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAAFdCAYAAAANJWRbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X9s9ed51/HPhZMt2yo8Od0i0kqZ9rihT8SqNaGqJugQ\nUGSGYANNYj20DHXSRmEbyNPUrX+gtQhUWrp6sFIJVK1laWdtf1AJEI9SQTukanRhT5ZOYpGPfdJq\nrTYKPgc8qW5Rl9z8YTv18XN8fvq6vue67/dL+kqJY799666bO4+/53wvK6UIAAC04491vQAAABCL\nwx8AgMZw+AMA0BgOfwAAGsPhDwBAYzj8AQBoDIc/AACNua/rBVxmZg9K2pH0eUlf7XY1AACk8oCk\n75D0VCllOO0T1+rw19nB/7GuFwEAQGJvlvQr0z5h3Q7/z0vSRz/6Ud2+fbvjpSxud3dXe3t7XS+j\nKex5PPY8HnseL+OeP/fcc3rLW94inZ+l06zb4f9VSbp9+7Yef/zxrteysM3NzZTrzow9j8eex2PP\n4yXf85m3zXnBHwAAjeHwBwCgMRz+AAA0hsP/BvV6va6X0Bz2PB57Ho89j1f7nlsppes1vMTMHpd0\n9+7du5lfaAEAQLhnnnlGTzzxhCQ9UUp5Ztrn8id/AAAaw+EPAEBjOPwBAGgMhz8AAI1Ztyf8+en3\npcFA2t6WXvWqXH3a8X3a8X3a8X3a4f3+sK/BaKDtrW296kGHtc+rlLI2l6THJZW7d++WGzMclrKz\nU4r09Wtnp5TRaP37tOP7tOP7tOP7tMP7w9Nh2Xlyp+ideunaeXKnjE5vaO2llLt37xZJRdLjZdZ5\nO+sTIi+Xw39np5SNjfH/MTc2zj6+7n3a8X3a8X3a8X3a4f2dJ3fKxrs2xg7/jXdtlJ0nb2jthcP/\n6w4Oxv9HvHr1++vbp13X2rO2M689azvz2rO2nfsHxwdjh/7Vq3+84trPLXL41/2Cv8Fg+j8/Olrf\nPu34Pu34Pu34Pu3w/mA0vX00WnHtS6j78L91a/o/395e3z7t+D7t+D7t+D7t8P6trent7a0V176M\nWb8aiLzEPX/aXfdpx/dpx/dph/e55x99+I9Gvq8O9ezTju/Tju/Tju/TDu+PTkdr9Wr/dgb7HB6e\n3bPxel+oZ592fJ92fJ92fJ92eP9weKij0ZHL+/wXGezTzuEPAEDFmOoHAACuxeEPAEBjOPwBAGgM\n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\nTzwA+tbW9Pb21grtxHOrs649a9u7Tzu+Tzu+7732pcz61UDkJe75j6e55x/epx3fpx3fpx3f555/\n9OGfeAD06HTk9mr/zHOrs649a9u7Tzu+Tzu+7732UhY7/NsZ6Zt4APTh8FBHoyOX9/lnnVvt3acd\n36cd36cd3/dsLzLSt53DHwCAii1y+Nf9gj8AAHAPDn8AABrD4Q8AQGM4/AEAaIz74W9m32Bmz5rZ\ni2b2Gu/vBwAAposY6fteSV+U9F0B3+t6znMUGbsb2/bu047v047v047vNzHSV9L3Sfofkl4t6UVJ\nr5nx+elG+jJ2N7bt3acd36cd36cd329mpK+khyR9QdJrJT3S2eHv/ExFHsEb2/bu047v047v047v\nN/N4X0n/SdI7zv+6m8PfeY4iY3dj25nXnrWdee1Z25nXnrWdfe0XFjn8F7rnb2bvlvQz0+4iSLot\n6S9Lepmk91x86SLfZ3d3V5ubm2Mf6/V66vV6i2Tmm6O4wk2XecbuLnv/33PpWdvefdrxfdrxfdrx\nfY/2/v6+9vf3xz52cnIy99cv+oK/90n68IzP+ZykPy/peyT9P7Oxc/+3zOxjpZS3Tgvs7e3dzON9\nnecoMnY3tu3dpx3fpx3fpx3f92hP+gPxpcf7zjbrVwPLXJJeKemxS9cbJb0g6a9LenjK13HP/3I7\n6f0n7svV1fbu047v047vN3PPf+ybdPmCP+c5iozdjW1792nH92nH92nH95sc6Wtmj0h6XtJrSym/\nM+Xz0o70ZexubNu7Tzu+Tzu+Tzu+z0jfCRjpCwDAchjpCwAArsXhDwBAYzj8AQBoDIc/AACN4fAH\nAKAxHP4AADRm0cf7ptUf9jUYDVzehy/lnf+cte3dpx3fpx3fpx3f91773GY9BSjyksMT/oanQ7cn\n8JWSd/5z1rZ3n3Z8n3Z8n3Z833vtpazh433nvTwOf89n75eS91nQWdvefdrxfdrxfdrx/Saf7T/v\nddOH/8Hxwdihf/XqH682RDnr/Oes7cxrz9rOvPas7cxrz9rOvvYLixz+Vb/gbzCaPkT5aHS0Wn+O\nGc20b67t3acd36cd36cd3/de+zKqPvxvbU0fory9tdoA6Gzzn7O3vfu04/u04/u04/vea1/KrF8N\nRF7inj/tjvu04/u04/u04/vc8w8+/EenI9dX+2ed/5y17d2nHd+nHd+nHd/3Xnspix3+zYz0PRwe\n6mh05PY+/6zzn7O2vfu04/u04/u04/ue7UVG+jZz+AMAULNFDv+qX/AHAADuxeEPAEBjOPwBAGgM\nh/8N2t/f73oJzWHP47Hn8djzeLXvOYf/Dar9h2Udsefx2PN47Hm82vecwx8AgMZw+AMA0BgOfwAA\nGnNf1wu44gFJeu6557pex1JOTk70zDNTn6uAG8aex2PP47Hn8TLu+aWz84FZn7tuT/j7W5I+1vU6\nAABI7M2llF+Z9gnrdvg/KGlH0uclfbXb1QAAkMoDkr5D0lOllOG0T1yrwx8AAPjjBX8AADSGwx8A\ngMZw+AMA0BgOfwAAGsPhDwBAYzj8HZnZN5jZs2b2opm9puv11MrMHjGzD5nZ82Z2amaHZvZOM7u/\n67XVxMx+3Mw+Z2ZfMbPPmNnrul5TrczsHWb2tJn9oZl9ycw+bmaPdr2ulpjZz57/u/v9Xa/FA4e/\nr/dK+qIk3k/p69WSTNKPSnpM0q6kt0n6p10uqiZm9kOSfl7Sz0l6raTPSnrKzF7e6cLq9QZJvyjp\n9ZLeKOl+SZ8ws2/qdFWNOP8P2x/T2c95lXifvxMz+z5J75P0g5J+V9J3l1J+p9tVtcPMflrS20op\n212vpQZm9hlJv1lK+Yfnf2+SviDpX5ZS3tvp4hpw/h9Z/0vS95ZSPt31empmZi+TdFfS35P0jyT9\ndinlp7pd1c3jT/4OzOwhSf9G0lskfaXj5bTqWyWNul5EDc5vnzwh6b9cfKyc/anhP0v6nq7W1Zhv\n1dlvEPmZ9vevJP2HUsonu16Ip3Ub7FOLD0v6YCnlt83ska4X0xoz25b0E5Kq+6/1jrxc0oakL135\n+Jck/cn45bTl/LcsvyDp06WU3+16PTUzszdJ+m5Jf7rrtXjjT/5zMrN3n7/447rrBTN71Mz+gaSX\nSXrPxZd2uOzU5t3zK1/zCkl3JP1qKeWXulk5cKM+qLPXsryp64XUzMxeqbP/yHpzKeVrXa/HG/f8\n53Q+dOjBGZ/2OUm/JumvXvn4hqQ/kvSxUspbHZZXpTn3/PlSyh+df/7Dkj4l6TfY55tz/mv/U0k/\nWEr595c+/hFJm6WUv9HV2mpnZh+Q9NckvaGU8ntdr6dmZvYDkv6dpBf09T+0bejsdssLkr6xVHRg\ncvjfsPP/evzjlz70sKSndPbCv6dLKb/fycIqd/4n/k9K+u+S/nZN/yddB9e84O/3dPaCv3/e6eIq\ndX7w/4CkP1dKeb7r9dTOzL5F0tXbtB+R9Jykf1ZKeS58UY6453/DSilfvPz3ZvZlnf1X5PMc/D7O\n/8T/6zqyl/jEAAAA2UlEQVT7zcvbJX372dkklVKu3qfGct4v6SNmdlfS0zp7O+U36+xfjrhhZvZB\nST1J3y/py+cvIpakk1IK484dlFK+rLN3Zr3k/N/fw9oOfonDPwp/CvX1lyR95/n1hfOPmc72faOr\nRdWklPJr5283+8eSHpL0rKSdUsr/7nZl1Xqbzn5+f/3Kx98q6ZfDV9Ouav/dza/9AQBoDK/2BwCg\nMRz+AAA0hsMfAIDGcPgDANAYDn8AABrD4Q8AQGM4/AEAaAyHPwAAjeHwBwCgMRz+AAA0hsMfAIDG\n/H//kDp8WS5vWwAAAABJRU5ErkJggg==\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -118,8 +118,8 @@ "\n", "x = Point(-max_val, -max_val)\n", "y = Point(max_val, max_val)\n", - "for x_i in np.arange(-max_val, max_val, step):\n", - " for y_i in np.arange(-max_val, max_val, step):\n", + "for x_i in np.arange(-max_val + step, max_val, step):\n", + " for y_i in np.arange(-max_val + step, max_val, step):\n", " color = turn(x, y, Point(x_i, y_i))\n", " plt.scatter(x_i, y_i, color = color, s = 20)\n", "\n", @@ -138,7 +138,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": { "collapsed": false, "scrolled": true @@ -148,7 +148,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Point: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", + "Points: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", "Turn: left turn\n" ] } @@ -157,7 +157,7 @@ "p1 = Point(1.1016, 8.1672)\n", "p2 = -p1\n", "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", - "print(\"Point:\", p1, p2, p3)\n", + "print(\"Points:\", p1, p2, p3)\n", "t = turn(p1, p2, p3)\n", "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" ] @@ -234,7 +234,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -275,7 +275,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": { "collapsed": false }, @@ -284,7 +284,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "Point: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", + "Points: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", "Turn: collinear\n" ] } @@ -293,7 +293,7 @@ "p1 = Point(1.1016, 8.1672)\n", "p2 = -p1\n", "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", - "print(\"Point:\", p1, p2, p3)\n", + "print(\"Points:\", p1, p2, p3)\n", "t = turn(p1, p2, p3)\n", "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" ] @@ -324,16 +324,47 @@ " \\begin{cases}\n", " turn(s_1, s_2.a) \\cdot turn(s_1, s_2.b) \\leqslant 0, &\\text{}\\\\\n", " turn(s_2, s_1.a) \\cdot turn(s_2, s_1.b) \\leqslant 0, &\\text{}\\\\\n", - " AABB(s_1) \\cap AABB(s_2) \\ne 0.\n", + " AABB(s_1) \\cap AABB(s_2) \\ne 0. &\\text{}\n", " \\end{cases}\n", "\\end{equation} $$\n", "\n", "Здесь $AABB$ - это *axis-aligned bounding box*. Для этого достаточно проверить, что проекции этих двух отрезков на оси $X$ и $Y$ пересекаются." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Теперь Вам предлагается написать функцию, проверяющую 2 отрезка на пересечение. Функция *samples.check_intersection(Segment, Segment)* решает поставленную задачу и приведена в качестве примера возможной реализации. Однако читателю настоятельно рекомендуется выполнить это несложное упражнение самостоятельно. " + ] + }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# def check_intersection(s1, s2):\n", + "# return 0 if segments don't intersect and 1 otherwise\n", + "\n", + "import samples\n", + "Point = samples.Point\n", + "Segment = samples.Segment\n", + "check_intersection = samples.check_intersection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Чтобы проверить функцию на работоспособность, введите тестовые значения в файле *2_segments.in* в следующем формате: в первой строке задайте количество примеров $n$, в каждой из следующих $2n$ строк укажите координаты начала и конца отрезка. " + ] + }, + { + "cell_type": "code", + "execution_count": 6, "metadata": { "collapsed": false }, @@ -342,7 +373,7 @@ "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1EAAAJaCAYAAADONc3dAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XmclvP+x/HXZ5IlEqER0ansP0uncKzZsnPsy5TdRGQL\nh9LCse+FomXoRDWE7FuSJIfjaHAOR3JUloOJUlrINPP9/fG5hru7Weu+7+ueud/Px+N+1H3d131d\nn3v7zvXdPl8LISAiIiIiIiJ1kxd3ACIiIiIiIg2JKlEiIiIiIiL1oEqUiIiIiIhIPagSJSIiIiIi\nUg+qRImIiIiIiNSDKlEiIiIiIiL1oEqUiIiIiIhIPagSJSIiIiIiUg+qRImIiIiIiNSDKlGSEWY2\nxcwmxx1HTcysrZlVmNkZccciIuljZn8zs9lxxyEiDZPKEIEcrESZ2U5m9oSZzTGzn83sazObaGYX\nxR1bpplZazO71sx2zsDpQrpPYGbXJRdqZtbXzI6px2FWKU4zWyd6L7usyvOzjZltH72eLeOOJRep\nnPpdmsqpAFSsYjyHm9m1KYwlVmZ2gZmdGXcckloqQ36nMiS9crkMyalKlJntBfwT2AkYAfQCRgLl\nwCUxhhaXzYBrgY5xB5IigZUrQdcAdapEhRC+ANYBHlmFczfD38v9V+G52WgH/PX8IeY4co7KqZWk\no5wqBLZbxeceAQxMYSxxuxDIyQugxkplyEpUhqRXzpYha8QdQIb1AxYAu4YQFiU+YGYbxxNSrCzu\nALJNCOHXVXxqWt5LM2sWQliajmPXdmoy0HsoVVI5taKU/7ZCCOX4BeWqSNdvfe0Qwi/pOLbkHJUh\nK1IZIukRQsiZG/AJ8Fo99j8NeA9YCswDioE2VezXC/g82u8dYB9gCjA5YZ/98K7fk/AWka+Bn4DH\ngebAmsBgoBRYBDwENF2VmKJz/wvYHngdWBKd7y9VxFMe/Vv5/zOix7cCngS+BX4GvorO1bwO79t5\nwH+T3o/XE9+PaL9NgAeB76JzfFB5/oR92kaxXQ70iI77C/Au/gcicd9rgVkJ95NfXwXwUA1xV57r\njIRtf4s+j82Ap6P/zwXuACzpecnnGphwnG2BJ6LP7Ge8lfDopPOfGT2vC3B/9F2YFz22XvT9mB29\n/lJgItAx6Rh/Al7G/4Auib4Le1XxWjeL3vv/RcebFZ1zjYQ4kr8bXeL+DefCDZVTaS+n8N/17IT7\ndSpngFFVxZPwuAGXAR9F8XwHDAM2SDr/HOBZ4BC8LPgZuCR67GDgTeDH6D2eAdyU9Pw1gb8Cn0Vx\nfgncBqxZzWfxj+j9nQ+8AXSNHpvNimVWBUnltG4N74bKEJUhKkMycsu1nqgvgD3M7P9CCB/XtKOZ\n9QOuBx7Fu8E3wbvB3zCzP4YQfor2uwC4D/9S3Y0Pf3oa//J+VcWh++KFwi34j/dioAz/4m2AFzp7\n4Beys4Ab6xsT3oPQEngJmBDtfyJwq5n9K4TwCl7IDoyONxz/wQH83cya4hfoTYF78R/x5sBRUYwr\ntGwlvW/n4j/4acAgoD3+Q5+P/0gr91s7es/aR+/fHLzQ/ZuZtQgh3Jd06O54RWJY9PquBp40s/bB\nW4SqchpeUfgHPqQB/A9AfQR82Osr+B+NK4CueEH5X/y9+x7oGcU2IbqBF+6Y2f/h78fX+Oe+BDgZ\neNrMjg8hPJN0zvvxitpf8WGCROc5Hn+vPgE2wv+AbY9XPjGzA4EX8T881+HfqbOByWa2TwjhvWi/\n1nihu3503E/xz/fE6HxT8c/9Yvz7NyOK4ZN6vneyalROpbmcouqhv1B7OTMMb4DoGu2b3KI8AjgD\nvzC8B2gXvXcdzWzvhLIq4EOBxkWvawTwqZntADyH/6YHAMvw93+vyhOYmUX77BU9dwY+bKs3sDVe\nTlTuey3+Wb0VHe9XvKHlQGAScCkwJHqvboxeT2kN75s0DCpDVIaoDMmEuGtxmbzhX9pf8R/yW8Ct\neI19jaT9toz2uTpp+w7R8/tE95viF9BvA3kJ+51OUm2c31tDPgSaJGwfi7dIPJ90rrdYsVelTjFF\n216PjtktYVtT4BtgfMK2ziT1vETbd4m2H1fP93cNvBB6L/E9Bc6t4v24NIrx1IRtTaLXvRBYN9pW\n2bozF1g/Yd+jo+cfUUtMi6ih9ylp36p6okZF57kmad/pwLsJ9zciqfcp4bFJwPtVfM+mATMS7lf2\nAE0h6uVKeOxH4N5a4v8UeCFp21p4xfHlhG2jo+/SH2s41gmo9ymWGyqn0lpORc8dlRR3ncsZ/EKy\nvIpj7hMd45Sk7QdH2xPLutnRcbsm7VtZLm5YQ+ynRe/xnknbz4ueu0d0vwOwHHi8lvfi3+RQy3Eu\n3FSGqAxRGZKZW04llgghTAL2BJ4Bdgb+gvcw/M/Mjk7Y9QS8Nv24mW1UecN/HJ8BB0T77YZfPI8M\nISRmaRmHX/RWZXRYsefkH9G/DyXt9w9gCzOr/IzqGlOlxSGEcQmvvQzvVm5fTVyJFkb/HmZm69Rh\n/0q7Aq2AYSGE5QnbRyccs9LhwHchhEcTYizHW4PWwwviRI+G31ufwFuTjLq9nlQYnnT/zbqc28w2\nxD+bx4EWSZ/dRGDrqGeoUsC/T8ktXAuAPyXtm3iejngLUnHSOZoDr+FDBCtboI4Bng0hvF9b/JJ5\nKqfSXk7VZHXKmRPx3+lrSa/9fWAxK7/22dFnnWhB9O9x0W+1uvN8AsxMOs/rUayV5zkuun99HWKX\nRkRliMoQVIZkRK4N5yOEMB040czWwFshjsO7MB83s44hhBl412cePlxrpUPgrSHgLSaBpCFiIYRy\nM5tTTQjJ3d4La9ieB7TAC6m6xlTp6yr2+xHvsq1RCGGOmd2FD1k7zczexIfkjUkqHJK1jWJZIcYQ\nwnIzm1XFvp9VcYxP8B9t26TtK7w/IYQFUfmwYS0vJxV+CSHMS9r2Yx3PvRX+em4gYbhCgoBXPL9N\n2Daniv2uwsdgf2Vm0/Fhew+HEGZHj28d/ftwNXFUmFkLvGdqfaDGIR4SL5VTaS2narI65czW+BCg\nuVWFi//OE82uYr/H8J77kfiQpNfwYUpPJDSsbI0P4/m+lvO0x1uvNQw3B6kMURmCypC0y7lKVKWo\np2Q6MN3MPsO7Zk/CL3bz8C/OYVS9DsDi1Th1dfN3qtte2ZJQ35hqO16NQgh/MbO/4b0Wh+A9RH3M\nbI8Qwjd1OUaKrdbrSdO566Kyde1OvCWwKsl/LH5O3iGE8LiZTcX/EB4CXAlcbWbHBR/3XXmeK/Bh\nFFVZjFeipIFQOVWzNJRTqxNPHj4XoFs1+ydfsFT1O/8F6GJmBwBH4u/jKXjL9CHRRVAePnymdzXn\nqWp+iuQolSE1UxmiMmR15GwlKsl70b+VQ6U+x79Yc0IIVbWGVPoi2m8rfLIlAGbWBJ90Wd3F7Kqo\na0z1kTxkbMUHfULqx8DNZrYH8Hc8gUJ16xtUvh9b4/N6AIhawtoRJUBI2LeqlqLtEx5PhRpfYwpV\nd57KHriyEMLk1TpBCKX4pNRh5mlq38dT2b7C7y2Ei2o6j5l9j2dK2rG2061OrJIWKqeqerD+5VS6\n4vkcOAj4ewhh2WqdIITX8aE1V5pZX7wX+wBgcnSenaN9avI5frG0A1GSm+pOtzqxSoOiMqSqB1WG\nVEdlSC1yak6Ume1fzUNHRv9WZiGbgLeAXFvNcVpG/30PT73ZI2E8L/ikvVQPM6trTPWxJPp3g6Rj\nNY8Kx0QfR+evqSfjPaJMdVHFqdLZyefAh6NtamanJJy3CZ6FZhEJBfVqWlLFudOhci2nFc4VQvge\nr1Ceb2abJj/J6rBmh5nlmdn6Scf9AZ88W/l5TMcLvCvNbN3qzhO1Qj0NHG1mnWo47RL8D1km3jtJ\noHJqJakup1bXkuj86ydtH483TK504WVmTaLhtDWK5lAm+xD/LVa+pvFAGzPrUcXz1zazyoyeT+MX\nNwNrmBsBmSsjJUNUhqxEZYjKkLTItZ6o+6Ivx1N4IbImsDeebnoWPueEEMIsM+uPt0q04/f1gdoD\nx+JJBu4OIZSZ2XV49+/rZjYeb5U5Gx+iVdfaea3dvHWNqY7nq/Q5Pgmxp5ktxn8I/8DHTw8xs8eB\nmfj35Aw8S8uTNcS4PIpxGP5+PIb3QJ3NyqnFRwDn4ynNd+X3FOd7ApeGEJaQGtOBrmbWG690zA4h\nvJuiY/8mhPCLmf0HOCUaMjEf+Chq4eqFTy79t5mNxL9r+fhr3Rz4Y8KhqvouNAe+NrMn8MJwMZ6t\nZ1d8LDchhGBmhXjl9GMzG4WvAbU53vq0EB+uAHBN9PypZjYCH++8GT7ZdO9oLPgH+LCEq81sAzxN\n6mtR5U3SS+XUilJaTqXAdPy9uM/MXsGzbD0WQphqZsPxoUAd8cQxZcA2+G/rEn5f/qA6A82sC/AC\n3vqfD1yALw8xLdrnEfy78EA0ZOctPLPp9ngZeghQEkL43MxuAvoDb5rZBPx3vBvwvxBCv4TX09M8\nrfR/gbl1aKGW7KYyZEUqQ1SGpEdNqfsa2w3/YozEWxoW4uNJP8XXM9q4iv2PxXtEfopuH+N5+7dK\n2q8XXjAtxX+Ye+Hr8LyQsM9++EXp8UnPPTPa3ilp+7XR9pb1jQnvwv2witczCvg8adtR+NjYZdH5\nzsCTOozEC5UleO/SJGD/Or7P5/P7Yrv/wAvvySQt/gdsDBThY4ArF9s9PWmftlFcvas4TzkwoJZY\ntonej8XR/rUttvvbInwJ79nCKva9FlietO1PeFagn6PjJC62+4foWJWL236JZ046LmGf6r4LTfEU\ntSX4H4Kfov+fV0VcO+OZAOdG7/8sfOHA/ZP2axPF812032fR9ygxNf050fZfUbrzjN1QOZX2cir5\nHNSjnMFHcAyOfjvLSUpVjE/qfhcvcxbg5drNQH7CPrOAZ6o41/74RdJX/L7w5yNAh6T9muDzIv8V\nfZ4/ROfsB6xXxWf3XsJ+k4EDEx5vhU+mXxC91pxMVdyYbipDVIaoDMnMzaI3QFIo6vb8HngyhHB+\n3PGIiCRTOSUiq0NliOS6tM6JMrNrzawi6fafWp6zv5lNN7NfzGymmZ2ZzhhXl5lVNW72THwV7dzo\nzhTJIqtS7jR2KqdE6s/MNjOzR8zsBzNbamYf1jKXtNFSGSKyskzMifoIzzZSORZ2eXU7mtkfgOeB\n+/EUj12BIjP7JoTwanrDXGV7mNkgfAjVPHxl7HPwLtIn4gxMJIfVudzJESqnROohmgv6Fr5Y+aH4\nMKatqX5x2cZOZYhIkkxUopYHz1BWFxcAs0IIV0X3PzWzffBc9tlaiZqDz2+5GG+RmY9P2uwbfH0G\nEcm8+pQ7uWAOKqdE6qMP8GUIoTBhW6qW3miI5qAyRGQFmahEbW1mlZPp38Z/cNUt5LUHPqkv0Sv4\nZMisFEL4Ap8AKSLZoz7lTqOnckqk3o4GXo4y0e2HJwW6P4RQFG9Y8VAZIrKydFei3gHOwrPCtAau\nw9Mq7xiqTmG9KZ6pLVEpsL6ZrRWqWHzMzDbCu9rn4BdMIhKftfFMhK+EEObFFEN9yx2VIyLZJRvK\nkfb46Ji7gJuA3YF7zWxZCOGR5J1VhohklYyUIWmtRIUQXkm4+5GZvYt3h5+Mp4dMhUOBsSk6loik\nRndgXBwnXsVyR+WISPaJrRzBE2+9G0IYEN3/0Mx2BHriKaOTqQwRyT5pLUMyuthuCGGhmc0Etqpm\nl+/whcES5QM/VdULFZkDMGbMGLbffvuUxFkXvXv3ZtCgzI0yzPT54jinXmPDP+cnn3zCaaedBtHv\nMhvUodyBmMqRuojjO1MXiqt+FFfdZUk58i2+EHmiT4Djq9l/DqgMqQ/FVT+Kq+4yVYZktBJlZuvh\nFzIPV7PL28DhSdsOibZX5xeA7bffnk6dMpd5tEWLFo36fHGcU6+x8ZyTLBrOUodyB2IqR+oips+v\nVoqrfhTXKomzHHkL2DZp27ZUn1xCZUg9Ka76UVyrJK1lSLrXibrDzLqYWVsz2wt4CigDiqPHbzaz\n0QlPGQa0N7PbzGxbM7sQOBG4O51xikjjUVu5IyJSB4PwtN59zayDmXUDCoEhMcclIlki3T1RbfCx\niBvhq1pPA/ZImOTVGtiicucQwhwzOxIvvC4BvgbODSEkZ+wTEalObeWOiEiNQgjvmdlxwK3AAGA2\ncGkI4dF4IxORbJHuxBIFtTx+dhXbpuKLuImI1Ftt5Y6ISF2EEF4EXow7DhHJTmkdzteYFRRk9jot\n0+eL45x6jY3nnJI62fr5Ka76UVwSl2z9jBVX/Siu7GMhhLhjWC1m1gmYPn369Gye2CaSE0pKSujc\nuTNA5xBCSdzx1JXKEZHs0RDLEZUhItkjU2WIeqJERERERETqQZUoERERERGRelAlSkREREREpB5U\niRIREREREakHVaJERERERETqQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETq\nQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETqQZUoERERERGRelgjUycysz7A\nzcDgEMLl1eyzH/B60uYAtA4hzE1ziBKZPXs2Y8eOpbS0lPz8fLp37067du3iDktEREREJCtkpBJl\nZrsB5wEf1mH3AGwDLPptgypQGVFWVkavXhdRVDSSvLzm5OW1paLiCwYOHEhhYQ+GDh1C06ZN4w5T\nRERERCRWaR/OZ2brAWOAQmBBHZ/2fQhhbuUtfdFJIq9AjSKEeygv/5aysn9RXv4NIQymqGgUvXpd\nFHeIIiIiIiKxy8ScqKHAcyGEyXXc34APzOwbM5toZnulMTaJzJo1i6KikYRwF3Ax0Cx6ZF3gEkK4\nk6KikcyePTu+IEVEREREskBaK1FmdirQEehbx6d8C5wPnAAcD3wFTDGzjumJUCqNGzeOvLzmwLnV\n7FFIXl5zxo4dm8mwRERERESyTtrmRJlZG2Aw0DWEUFaX54QQZgIzEza9Y2YdgN7AmTU9t3fv3rRo\n0WKFbQUFBRQUFNQr7lxVWlpKXl5bysubVbNHM/LytqS0tDSjcUn2Ki4upri4eIVtCxcujCkaERER\nkcxJZ2KJzsAmQImZWbStCdDFzC4C1gohhDoc511g79p2GjRoEJ06dVrlYHNdfn4+FRVfAEv5fShf\noiVUVHxBfn5+hiOTbFVVI0VJSQmdO3eOKSIRERGRzEjncL5JwE74cL5dott7eJKJXepYgSJ6/rdp\niVB+061bNyoqFgEPVrPHg1RULKZ79+6ZDEtEREREJOukrScqhLAE+E/iNjNbAswLIXwS3b8Z2DyE\n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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -351,88 +382,6 @@ ], "source": [ "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from decimal import *\n", - "\n", - "getcontext().prec = 70\n", - "\n", - "class Point:\n", - " def __init__(self, x = 0.0, y = 0.0):\n", - " self.x = x\n", - " self.y = y\n", - " \n", - " def __sub__(self, p):\n", - " return Point(self.x - p.x, self.y - p.y)\n", - "\n", - " def __repr__(self):\n", - " return \"(%r, %r)\" % (self.x, self.y)\n", - "\n", - "class Segment:\n", - " def __init__(self, a, b):\n", - " self.a = a\n", - " self.b = b\n", - " \n", - " def __lt__(self, s):\n", - " return self.a < s.a or self.a == s.a and self.b < s.b\n", - "\n", - " def __repr__(self):\n", - " return \"[%r, %r]\" % (self.a, self.b)\n", - "\n", - "def calculate_det(a, b):\n", - " return a.x * b.y - b.x * a.y\n", - "\n", - "def calculate_arg(a, b):\n", - " return abs(a.x * b.y) + abs(b.x * a.y)\n", - "\n", - "def turn(s, c):\n", - " a = s.a\n", - " b = s.b\n", - " e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a)\n", - " det = calculate_det(b - a, c - a)\n", - " if det > e:\n", - " return 1\n", - " if det < -e:\n", - " return -1\n", - "\n", - " la = Point(Decimal(a.x), Decimal(a.y))\n", - " lb = Point(Decimal(b.x), Decimal(b.y))\n", - " lc = Point(Decimal(c.x), Decimal(c.y))\n", - " ldet = calculate_det(lb - la, lc - la)\n", - " if ldet > 0:\n", - " return 1\n", - " if ldet < 0:\n", - " return -1\n", - " return 0\n", - "\n", - "def convert_by_x(s): # s.a.x <= s.b.x\n", - " if s.a.x > s.b.x:\n", - " s.a, s.b = s.b, s.a\n", - " return s\n", - "\n", - "def convert_by_y(s): # s.a.y <= s.b.y\n", - " if s.a.y > s.b.y:\n", - " s.a, s.b = s.b, s.a\n", - " return s\n", - "\n", - "def bounding_box(s1, s2):\n", - " convert_by_x(s1)\n", - " convert_by_x(s2)\n", - " if not (s1.a.x <= s2.b.x and s1.b.x >= s2.a.x):\n", - " return 0\n", - " convert_by_y(s1)\n", - " convert_by_y(s2)\n", - " if not (s1.a.y <= s2.b.y and s1.b.y >= s2.a.y):\n", - " return 0\n", - " return 1\n", - "\n", - "def check_intersection(s1, s2):\n", - " if bounding_box(s1, s2) == 0:\n", - " return 0\n", - " if turn(s1, s2.a) * turn(s1, s2.b) > 0:\n", - " return 0\n", - " if turn(s2, s1.a) * turn(s2, s1.b) > 0:\n", - " return 0\n", - " return 1\n", "\n", "f, axes = plt.subplots(2, 3, figsize=(10, 7))\n", "with open(\"2_segments.in\") as inp:\n", @@ -475,7 +424,7 @@ "\n", "На самом деле алгоритм совершает какие-то дейтвия только при достижении $l$ события: обновляется статус прямой и происходят проверки отрезков из множества на наличие пересечений. Например, если событие - \"левый конец отрезка\" $s_i$, то $s_i$ добавляется в статус и проверяется на пересечение с другими; при достижении события \"правый конец\" $s_i$ будет удален из множества. Однако такой алгоритм все еще не output-sensitive, поскольку есть ситуации, при которых происходит проверка $O(n^2)$ пар отрезков, хотя пересечений на самом деле много меньше: простейший пример - множество горизонтальных отрезков, пересекающих ось $Y$. Проблема в том, что два отрезка, пересекающих заметающую прямую, могут находиться далеко друг от друга в вертикальном направлении. \n", "\n", - "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с остальными, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", + "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с соседями, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", "$$ a < b \\Longleftrightarrow \\left[ \n", " \\begin{gathered} \n", " a.x < b.x \\\\ \n", @@ -578,7 +527,7 @@ "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$. \n", "$\\triangleleft$\n", "\n", - "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дописать недостающую часть." + "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дописать недостающую часть. Входные данные должны находиться в файле *segments_set.in* в следующем формате: в первой строке задайте количество примеров $n$, в каждой из следующих $n$ строк укажите координаты начала и конца отрезка." ] }, { @@ -685,6 +634,29 @@ " if type != Type.inter:\n", " return \"Event [%r, type = %r]\" % (self.segment, self.t)\n", " return \"Event inter [%r, %r, point = %r]\" % (self.segment, self.addit_segment, self.inter_point)\n", + " \n", + "def get_intersections(events):\n", + " events.sort()\n", + " status = sortedset()\n", + " intersections = set()\n", + " \n", + " for e in events:\n", + " line_segment = e.segment\n", + " if e.t == Type.left:\n", + " # Находим соседей отрезка сверху и снизу, и, если они есть,\n", + " # проверяем отрезки на наличие пересечения. Добавляем\n", + " # новые события в статус.\n", + " status.add(line_segment)\n", + " if e.t == Type.right:\n", + " status.remove(line_segment)\n", + " # Если у каких-то отрезков поменялись соседи,\n", + " # проверим их. Добавляем новые события\n", + " # в статус.\n", + " if e.t == Type.inter:\n", + " # Меняем порядок отрезков и проверяем\n", + " # каждую пару новых соседей. Новые пересечения\n", + " # добавляем в статус.\n", + " return intersections\n", "\n", "max_x = max_y = min_x = min_y = 0\n", "events = []\n", @@ -702,27 +674,8 @@ " plt.plot([x1, x2], [y1, y2], c = 'black')\n", " plt.scatter(x1, y1, c = 'black', s = 30)\n", " plt.scatter(x2, y2, c = 'black', s = 30)\n", - "\n", - "events.sort()\n", - "status = sortedset()\n", - "intersections = set()\n", - "\n", - "for e in events:\n", - " line_segment = e.segment\n", - " if e.t == Type.left:\n", - " # Находим соседей отрезка сверху и снизу, и, если они есть,\n", - " # проверяем отрезки на наличие пересечения. Добавляем\n", - " # новые события в статус.\n", - " status.add(line_segment)\n", - " if e.t == Type.right:\n", - " status.remove(line_segment)\n", - " # Если у каких-то отрезков поменялись соседи,\n", - " # проверим их. Добавляем новые события\n", - " # в статус.\n", - " if e.t == Type.inter:\n", - " # Меняем порядок отрезков и проверяем\n", - " # каждую пару новых соседей. Новые пересечения\n", - " # добавляем в статус.\n", + " \n", + "intersections = get_intersections(events)\n", "\n", "plt.axis([min_x - step, max_x + step, min_y - step, max_y + step])\n", "plt.show()" diff --git a/samples.py b/samples.py new file mode 100644 index 0000000..6e82b02 --- /dev/null +++ b/samples.py @@ -0,0 +1,82 @@ +import numpy as np +from decimal import * + +getcontext().prec = 70 + +class Point: + def __init__(self, x = 0.0, y = 0.0): + self.x = x + self.y = y + + def __sub__(self, p): + return Point(self.x - p.x, self.y - p.y) + + def __repr__(self): + return "(%r, %r)" % (self.x, self.y) + +class Segment: + def __init__(self, a, b): + self.a = a + self.b = b + + def __lt__(self, s): + return self.a < s.a or self.a == s.a and self.b < s.b + + def __repr__(self): + return "[%r, %r]" % (self.a, self.b) + +def calculate_det(a, b): + return a.x * b.y - b.x * a.y + +def calculate_arg(a, b): + return abs(a.x * b.y) + abs(b.x * a.y) + +def turn(s, c): + a = s.a + b = s.b + e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a) + det = calculate_det(b - a, c - a) + if det > e: + return 1 + if det < -e: + return -1 + + la = Point(Decimal(a.x), Decimal(a.y)) + lb = Point(Decimal(b.x), Decimal(b.y)) + lc = Point(Decimal(c.x), Decimal(c.y)) + ldet = calculate_det(lb - la, lc - la) + if ldet > 0: + return 1 + if ldet < 0: + return -1 + return 0 + +def convert_by_x(s): # s.a.x <= s.b.x + if s.a.x > s.b.x: + s.a, s.b = s.b, s.a + return s + +def convert_by_y(s): # s.a.y <= s.b.y + if s.a.y > s.b.y: + s.a, s.b = s.b, s.a + return s + +def bounding_box(s1, s2): + convert_by_x(s1) + convert_by_x(s2) + if not (s1.a.x <= s2.b.x and s1.b.x >= s2.a.x): + return 0 + convert_by_y(s1) + convert_by_y(s2) + if not (s1.a.y <= s2.b.y and s1.b.y >= s2.a.y): + return 0 + return 1 + +def check_intersection(s1, s2): + if bounding_box(s1, s2) == 0: + return 0 + if turn(s1, s2.a) * turn(s1, s2.b) > 0: + return 0 + if turn(s2, s1.a) * turn(s2, s1.b) > 0: + return 0 + return 1 \ No newline at end of file From d49fadb09df533b4a1dc8bf50b76d9fbb9338104 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Tue, 24 Jan 2017 23:15:23 +0400 Subject: [PATCH 08/19] fix --- Line_segment_intersection.ipynb | 38 ++++++++++++++++----------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index 6c854a8..958a925 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -320,11 +320,12 @@ " \\end{cases}\n", "\\end{equation} \n", "\n", - "$$ s_1 \\cap s_2 \\Longleftrightarrow \\begin{equation}\n", + "$$ s_1 \\cap s_2 \\Longleftrightarrow \n", + "\\begin{equation}\n", " \\begin{cases}\n", - " turn(s_1, s_2.a) \\cdot turn(s_1, s_2.b) \\leqslant 0, &\\text{}\\\\\n", - " turn(s_2, s_1.a) \\cdot turn(s_2, s_1.b) \\leqslant 0, &\\text{}\\\\\n", - " AABB(s_1) \\cap AABB(s_2) \\ne 0. &\\text{}\n", + " turn(s_1, s_2.a) \\cdot turn(s_1, s_2.b) \\leqslant 0, &\\text{ }\\\\\n", + " turn(s_2, s_1.a) \\cdot turn(s_2, s_1.b) \\leqslant 0, &\\text{ }\\\\\n", + " AABB(s_1) \\cap AABB(s_2) \\ne 0. &\\text{ }\n", " \\end{cases}\n", "\\end{equation} $$\n", "\n", @@ -493,40 +494,37 @@ "Теперь, перед тем, как реализовывать алгоритм, нам нужно доказать корректность его работы.\n", "\n", "**Теорема**
\n", - "Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", + ">Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", "\n", "**Доказательство**
\n", - "$\\triangleright$
Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны влять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение.
\n", - "$\\triangleleft$\n", + "$\\Box$ Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны влять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение. $\\Box$ \n", "\n", "Теперь мы понимаем, что в таком виде алгоритм не находит пересечения трех и более отрезков, имеющих одну общую точку. То есть этот алгоритм можно использовать для ответа на вопрос \"есть ли в множестве такая пара отрезков, которая пересекается?\", но чтобы найти все пересечения, нужно добавить еще один шаг. Добавим к событиям еще один тип - пересечение отрезков. Будем проверять, если событие - это точка пересечения двух отрезков, то эти отрезки меняют порядок и у каждого появляется, возможно, новый сосед. Мы проверим каждую пару новых соседей в статусе на пересечение. Нас будут интересовать только пересечения правее заметающей прямой.\n", "\n", "**Теорема**
\n", - "Алгоритм находит все точки точки пересечения и отрезки, которые их содержат. \n", + ">Алгоритм находит все точки точки пересечения и отрезки, которые их содержат. \n", "\n", "**Доказательство**
\n", - "$\\triangleright$
Воспользуемся индукцией по событиям, отсортированным в порядке $ q < p \\Longleftrightarrow \\left[ \n", + "$\\Box$ Воспользуемся индукцией по событиям, отсортированным в порядке $ q < p \\Longleftrightarrow \\left[ \n", " \\begin{gathered} \n", " q.x < p.x \\\\ \n", " q.x = p.x \\wedge q.y < p.y \\\\ \n", " \\end{gathered} \n", "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаы корректно. \n", "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке пара отрезков, пересекающихся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", - "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$.
\n", - "$\\triangleleft$\n", + "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$. $\\Box$ \n", "\n", "**Теорема**
\n", - "Время работы алгоритма - $O((n + I)\\log{n})$, где $I$ - количество пересечений.\n", + ">Время работы алгоритма - $O((n + I)\\log{n})$, где $I$ - количество пересечений.\n", "\n", "**Доказательство**
\n", - "$\\triangleright$
\n", - "На первом шаге алгорим строит множество событий $events$, вместе с сортировкой (или при использовании сбалансированного бинарного дерева в качестве структуры данных) это выполняется за $O(n\\log{n})$. Инициализация статуса занимает константное время. \n", - "\n", - "Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\mid L(p) \\cup C(p) \\cup U(p) \\mid$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$.\n", - "\n", - "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$.
\n", - "$\\triangleleft$\n", - "\n", + "$\\Box$ На первом шаге алгорим строит множество событий $events$, вместе с сортировкой (или при использовании сбалансированного бинарного дерева в качестве структуры данных) это выполняется за $O(n\\log{n})$. Инициализация статуса занимает константное время.
Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\mid L(p) \\cup C(p) \\cup U(p) \\mid$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$.
Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$. $\\Box$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дописать недостающую часть. Входные данные должны находиться в файле *segments_set.in* в следующем формате: в первой строке задайте количество примеров $n$, в каждой из следующих $n$ строк укажите координаты начала и конца отрезка." ] }, From f25dc001a33e221e1c43d5e8381a9721862e42ee Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Wed, 25 Jan 2017 15:33:24 +0400 Subject: [PATCH 09/19] add intersection func --- Line_segment_intersection.ipynb | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index 958a925..e9de051 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -341,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 2, "metadata": { "collapsed": false }, @@ -372,9 +372,9 @@ "outputs": [ { "data": { - "image/png": "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\niBvhq1pPA/ZImOTVGtiicucQwhwzOxIvvC4BvgbODSEkZ+wTEalObeWOiEiNQgjvmdlxwK3AAGA2\ncGkI4dF4IxORbJHuxBIFtTx+dhXbpuKLuImI1Ftt5Y6ISF2EEF4EXow7DhHJTmkdzteYFRRk9jot\n0+eL45x6jY3nnJI62fr5Ka76UVwSl2z9jBVX/Siu7GMhhLhjWC1m1gmYPn369Gye2CaSE0pKSujc\nuTNA5xBCSdzx1JXKEZHs0RDLEZUhItkjU2WIeqJERERERETqQZUoERERERGRelAlSkREREREpB5U\niRIREREREakHVaJERERERETqQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETq\nQZUoERERERGRelAlSkREREREpB5UiRIREREREakHVaJERERERETqQZUoERERERGRelgjUycysz7A\nzcDgEMLl1eyzH/B60uYAtA4hzE1ziBKZPXs2Y8eOpbS0lPz8fLp37067du3iDktEREREJCtkpBJl\nZrsB5wEf1mH3AGwDLPptgypQGVFWVkavXhdRVDSSvLzm5OW1paLiCwYOHEhhYQ+GDh1C06ZN4w5T\nRERERCRWaR/OZ2brAWOAQmBBHZ/2fQhhbuUtfdFJIq9AjSKEeygv/5aysn9RXv4NIQymqGgUvXpd\nFHeIIiIiIiKxy8ScqKHAcyGEyXXc34APzOwbM5toZnulMTaJzJo1i6KikYRwF3Ax0Cx6ZF3gEkK4\nk6KikcyePTu+IEVEREREskBaK1FmdirQEehbx6d8C5wPnAAcD3wFTDGzjumJUCqNGzeOvLzmwLnV\n7FFIXl5zxo4dm8mwRERERESyTtrmRJlZG2Aw0DWEUFaX54QQZgIzEza9Y2YdgN7AmTU9t3fv3rRo\n0WKFbQUFBRQUFNQr7lxVWlpKXl5bysubVbNHM/LytqS0tDSjcUn2Ki4upri4eIVtCxcujCkaERER\nkcxJZ2KJzsAmQImZWbStCdDFzC4C1gohhDoc511g79p2GjRoEJ06dVrlYHNdfn4+FRVfAEv5fShf\noiVUVHxBfn5+hiOTbFVVI0VJSQmdO3eOKSIRERGRzEjncL5JwE74cL5dott7eJKJXepYgSJ6/rdp\niVB+061bNyoqFgEPVrPHg1RULKZ79+6ZDEtEREREJOukrScqhLAE+E/iNjNbAswLIXwS3b8Z2DyE\n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\n", + "image/png": "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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, @@ -383,11 +383,14 @@ ], "source": [ "import matplotlib.pyplot as plt\n", + "from math import *\n", "\n", - "f, axes = plt.subplots(2, 3, figsize=(10, 7))\n", "with open(\"2_segments.in\") as inp:\n", " n = int(inp.readline()) # number of tests\n", - " for i, axis in zip(range(0, n), axes.reshape((6))):\n", + " per_row = 3\n", + " per_column = ceil(n / 3)\n", + " f, axes = plt.subplots(per_column, per_row, figsize=(10, 3 * per_column))\n", + " for i, axis in zip(range(0, n), axes.reshape(per_column * per_row)):\n", " x1, y1, x2, y2 = map(float, inp.readline().split())\n", " s1 = Segment(Point(x1, y1), Point(x2, y2))\n", " axis.scatter(x1, y1, c = 'r', s = 40)\n", @@ -633,6 +636,15 @@ " return \"Event [%r, type = %r]\" % (self.segment, self.t)\n", " return \"Event inter [%r, %r, point = %r]\" % (self.segment, self.addit_segment, self.inter_point)\n", " \n", + "def get_intersection_point(s1, s2):\n", + " left = [[s2.b.x - s2.a.x, s1.a.x - s1.b.x], \n", + " [s2.b.y - s2.a.y, s1.a.y - s1.b.y]]\n", + " right = [[s1.b.x * s1.a.y - s1.b.y * s1.a.x], \n", + " [s2.b.x * s2.a.y - s2.b.y * s2.a.x]]\n", + " numerator = np.matmul(left, right)\n", + " denominator = np.linalg.det([[s1.a.y - s1.b.y, s1.b.x - s1.a.x], [s2.a.y - s2.b.y, s2.b.x - s2.a.x]])\n", + " return Point(numerator[0][0] / denominator, numerator[1][0] / denominator)\n", + " \n", "def get_intersections(events):\n", " events.sort()\n", " status = sortedset()\n", From b0ac3b4131abe30b879cdf8684260c628a28c9b5 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Thu, 26 Jan 2017 18:49:15 +0400 Subject: [PATCH 10/19] tests added --- Bentley_Ottmann_tests.py | 85 +++++++++++++++++++++++++++++++++ Line_segment_intersection.ipynb | 71 ++++++++++++++++++++++----- 2 files changed, 145 insertions(+), 11 deletions(-) create mode 100644 Bentley_Ottmann_tests.py diff --git a/Bentley_Ottmann_tests.py b/Bentley_Ottmann_tests.py new file mode 100644 index 0000000..828d070 --- /dev/null +++ b/Bentley_Ottmann_tests.py @@ -0,0 +1,85 @@ +def test(id) : + return { + 1: [4, + ["1 2 5 6", + "4 3 3 6", + "5 6 5 4", + "3 2 5 4"], + ["3.5 4.5", + "5 6", + "5 4", + "4 3"]], + 2: [7, + ["4 5 1 3", + "3 3 4 5", + "4 3 4 5", + "4 5 5 3", + "4 1 3 3", + "5 3 4 1", + "4 1 4 3"], + ["4 5", + "3 3", + "4 3", + "5 3", + "4 1"]], + 3: [4, + ["12 455 35 -61", + "123 46 -166 -181", + "-100 -13 56 700", + "-100 1 80 -1"], + ["33.368712948265 -24.402429621950", + "-96.944314895998 0.966047943288", + "32.301958334230 -0.470021759269", + "63.397847386456 -0.815531637627"]], + 4: [14, + ["-300 0 -300 100", + "-300 100 -200 200", + "-200 200 -100 200", + "-100 200 0 100", + "0 100 100 200", + "100 200 200 200", + "200 200 300 100", + "300 100 300 0", + "300 0 200 -100", + "200 -100 100 -200", + "100 -200 0 -300", + "0 -300 -100 -200", + "-100 -200 -200 -100", + "-200 -100 -300 0"], + ["-300 100", + "-200 200", + "-100 200", + "0 100", + "100 200", + "200 200", + "300 100", + "300 0", + "200 -100", + "100 -200", + "0 -300", + "-100 -200", + "-200 -100", + "-300 0"]], + 5: [8, + ["-20 0 -20 39", + "-20 40 29 40", + "30 40 30 11", + "30 10 -9 10", + "-10 10 -10 29", + "-10 30 19 30", + "20 30 20 21", + "20 20 0 20"], + []], + 6: [9, + ["-230 48 -84 116", + "-137 18 -94 342", + "-300 270.4532564500349 -31 0", + "200 200 600 500", + "300 200 500 500", + "400 200 400 500", + "500 200 300 500", + "600 200 200 500", + "200 350 600 350"], + ["-126.628841820639 96.145470932852", + "400 350"]] + }.get(id) \ No newline at end of file diff --git a/Line_segment_intersection.ipynb b/Line_segment_intersection.ipynb index e9de051..67b5083 100644 --- a/Line_segment_intersection.ipynb +++ b/Line_segment_intersection.ipynb @@ -229,7 +229,7 @@ "\n", "$$ e = (|(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|) \\times 8 \\varepsilon $$\n", "\n", - "С учетом полученных результатов, предекат будет выглядить так:" + "С учетом полученных результатов, предикат будет выглядеть так:" ] }, { @@ -341,7 +341,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 6, "metadata": { "collapsed": false }, @@ -419,16 +419,16 @@ "collapsed": true }, "source": [ - "### Алгоритм Бенли-Оттмана\n", - "Данный алгоритм позволяет решить задачу, которая была аннонсирована во вступлении. Напомню ее формулировку: дано множество $S = \\{ s_1, s_2, \\dots s_n \\}$, состоящее из $n$ отрезков на плоскости. Нужно найти множество точек, в которых эти отрезки пересекаются. \n", + "### Алгоритм Бентли-Оттмана\n", + "Данный алгоритм позволяет решить задачу, которая была анонсирована во вступлении. Напомню ее формулировку: дано множество $S = \\{ s_1, s_2, \\dots s_n \\}$, состоящее из $n$ отрезков на плоскости. Нужно найти множество точек, в которых эти отрезки пересекаются. \n", "\n", - "Заметим, что пересекаться могут только ближайшие отрезки, поэтому нет смысла проверять на наличие пересечения отрезки, находящиеся далеко друг от друга. Для начала оформально определим понятия \"ближайших\" и \"находящихся далеко друг от друга\" отрезков. Будем рассматривать ортогональные проекции отрезков на ось $X$. Если проекции двух отрезков не пересекаются, то будем говорить, что такие отрезки далеко друг от друга (очевидно, они не могут иметь общих точек). Следовательно, мы должны рассматривать только те отрезки, проекции которых пересекаются, то есть существует параллельная оси $Y$ прямая, пересекающая оба отрезка. Чтобы найти все такие отрезки, представим прямую $l$, скользящую по плоскости параллельно оси $Y$, начинающую свое движение из $-\\infty$. Эта прямая называется заметающей прямой (*sweep line*). Благодаря ей мы сможем отслеживать интересующие нас отрезки в каждый момент времени, что позволит нам найти все пересечения.\n", + "Заметим, что пересекаться могут только ближайшие отрезки, поэтому нет смысла проверять на наличие пересечения отрезки, находящиеся далеко друг от друга. Для начала формально определим понятия \"ближайших\" и \"находящихся далеко друг от друга\" отрезков. Будем рассматривать ортогональные проекции отрезков на ось $X$. Если проекции двух отрезков не пересекаются, то будем говорить, что такие отрезки далеко друг от друга (очевидно, они не могут иметь общих точек). Следовательно, мы должны рассматривать только те отрезки, проекции которых пересекаются, то есть существует параллельная оси $Y$ прямая, пересекающая оба отрезка. Чтобы найти все такие отрезки, представим прямую $l$, скользящую по плоскости параллельно оси $Y$, начинающую свое движение из $-\\infty$. Эта прямая называется заметающей прямой (*sweep line*). Благодаря ей мы сможем отслеживать интересующие нас отрезки в каждый момент времени, что позволит нам найти все пересечения.\n", "\n", "Будем называть статусом заметающей прямой множество отрезков, пересекающих заметающую прямую в данный момент времени. Статус меняется при достижении так называемых событий (*event points*), для нас событиями являются точки начала и конца отрезков.\n", "\n", "На самом деле алгоритм совершает какие-то дейтвия только при достижении $l$ события: обновляется статус прямой и происходят проверки отрезков из множества на наличие пересечений. Например, если событие - \"левый конец отрезка\" $s_i$, то $s_i$ добавляется в статус и проверяется на пересечение с другими; при достижении события \"правый конец\" $s_i$ будет удален из множества. Однако такой алгоритм все еще не output-sensitive, поскольку есть ситуации, при которых происходит проверка $O(n^2)$ пар отрезков, хотя пересечений на самом деле много меньше: простейший пример - множество горизонтальных отрезков, пересекающих ось $Y$. Проблема в том, что два отрезка, пересекающих заметающую прямую, могут находиться далеко друг от друга в вертикальном направлении. \n", "\n", - "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с соседями, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", + "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: в зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с соседями, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", "$$ a < b \\Longleftrightarrow \\left[ \n", " \\begin{gathered} \n", " a.x < b.x \\\\ \n", @@ -500,12 +500,12 @@ ">Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", "\n", "**Доказательство**
\n", - "$\\Box$ Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны влять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение. $\\Box$ \n", + "$\\Box$ Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны взять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение. $\\Box$ \n", "\n", "Теперь мы понимаем, что в таком виде алгоритм не находит пересечения трех и более отрезков, имеющих одну общую точку. То есть этот алгоритм можно использовать для ответа на вопрос \"есть ли в множестве такая пара отрезков, которая пересекается?\", но чтобы найти все пересечения, нужно добавить еще один шаг. Добавим к событиям еще один тип - пересечение отрезков. Будем проверять, если событие - это точка пересечения двух отрезков, то эти отрезки меняют порядок и у каждого появляется, возможно, новый сосед. Мы проверим каждую пару новых соседей в статусе на пересечение. Нас будут интересовать только пересечения правее заметающей прямой.\n", "\n", "**Теорема**
\n", - ">Алгоритм находит все точки точки пересечения и отрезки, которые их содержат. \n", + ">Алгоритм находит все точки пересечения и отрезки, которые их содержат. \n", "\n", "**Доказательство**
\n", "$\\Box$ Воспользуемся индукцией по событиям, отсортированным в порядке $ q < p \\Longleftrightarrow \\left[ \n", @@ -513,8 +513,8 @@ " q.x < p.x \\\\ \n", " q.x = p.x \\wedge q.y < p.y \\\\ \n", " \\end{gathered} \n", - "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаы корректно. \n", - "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке пара отрезков, пересекающихся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", + "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаны корректно. \n", + "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке отрезки, пересекающиеся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$. $\\Box$ \n", "\n", "**Теорема**
\n", @@ -578,6 +578,9 @@ "\n", " def __repr__(self):\n", " return \"(%r, %r)\" % (self.x, self.y)\n", + " \n", + " def __hash__(self):\n", + " return hash(str(self))\n", "\n", "class Segment:\n", " __slots__ = (\"a\", \"b\", \"id\")\n", @@ -603,7 +606,7 @@ " return not (self < p or self == p)\n", "\n", " def __repr__(self):\n", - " return \"[%r, %r]\" % (self.a, self.b)\n", + " return \"[%r: %r, %r]\" % (self.id, self.a, self.b)\n", "\n", "class Event:\n", " __slots__ = (\"segment\", \"t\", \"addit_segment\", \"inter_point\") # addit_segment & inter_point are used only for type = inter\n", @@ -690,6 +693,52 @@ "plt.axis([min_x - step, max_x + step, min_y - step, max_y + step])\n", "plt.show()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Чтобы удостовериться в корректности написанного Вами алгоритма, запустите его на наборе тестов:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import Bentley_Ottmann_tests\n", + "test = Bentley_Ottmann_tests.test\n", + "\n", + "f, axes = plt.subplots(2, 3, figsize=(10, 6))\n", + "for i, axis in zip(range(1, 7), axes.reshape(6)):\n", + " axis.set_title(\"Test \" + str(i))\n", + " events = []\n", + " input = test(i)\n", + " n = input[0] # number of segments\n", + " for j in range(0, n):\n", + " x1, y1, x2, y2 = map(float, input[1][j].split())\n", + " s = Segment(Point(x1, y1), Point(x2, y2), j)\n", + " events.append(Event(s, Type.left))\n", + " events.append(Event(s, Type.right))\n", + " axis.scatter(x1, y1, s = 35)\n", + " axis.scatter(x2, y2, s = 35)\n", + " axis.plot([x1, x2], [y1, y2])\n", + " intersection_points = set()\n", + " for p in input[2]:\n", + " x, y = map(float, p.split())\n", + " intersection_points.add(Point(x, y))\n", + " intersections = get_intersections(events)\n", + " if intersection_points == intersections:\n", + " print(\"Test\", i, \"Ok\")\n", + " else:\n", + " print(\"Test\", i, \"Fail:\")\n", + " print(\"\\t\", intersection_points, \"expected but\")\n", + " print(\"\\t\", intersections if len(intersections) > 0 else \"{}\", \"found\")\n", + "plt.show()" + ] } ], "metadata": { From 5b42aba59bd7e209bdd7104ef5b4c1ab222f1c3a Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Fri, 27 Jan 2017 00:11:33 +0400 Subject: [PATCH 11/19] add folder --- 2_segments.in => 22_segment_intersect/2_segments.in | 0 .../Bentley_Ottmann_tests.py | 0 .../Line_segment_intersection.ipynb | 0 samples.py => 22_segment_intersect/samples.py | 0 segments_set.in => 22_segment_intersect/segments_set.in | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename 2_segments.in => 22_segment_intersect/2_segments.in (100%) rename Bentley_Ottmann_tests.py => 22_segment_intersect/Bentley_Ottmann_tests.py (100%) rename Line_segment_intersection.ipynb => 22_segment_intersect/Line_segment_intersection.ipynb (100%) rename samples.py => 22_segment_intersect/samples.py (100%) rename segments_set.in => 22_segment_intersect/segments_set.in (100%) diff --git a/2_segments.in b/22_segment_intersect/2_segments.in similarity index 100% rename from 2_segments.in rename to 22_segment_intersect/2_segments.in diff --git a/Bentley_Ottmann_tests.py b/22_segment_intersect/Bentley_Ottmann_tests.py similarity index 100% rename from Bentley_Ottmann_tests.py rename to 22_segment_intersect/Bentley_Ottmann_tests.py diff --git a/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb similarity index 100% rename from Line_segment_intersection.ipynb rename to 22_segment_intersect/Line_segment_intersection.ipynb diff --git a/samples.py b/22_segment_intersect/samples.py similarity index 100% rename from samples.py rename to 22_segment_intersect/samples.py diff --git a/segments_set.in b/22_segment_intersect/segments_set.in similarity index 100% rename from segments_set.in rename to 22_segment_intersect/segments_set.in From 112098b0224ebdad4c86663e204d55a274009d77 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Thu, 9 Feb 2017 23:20:46 +0400 Subject: [PATCH 12/19] first part of changes --- 22_segment_intersect/2_segments.in | 13 - .../Line_segment_intersection.ipynb | 722 +++++------------- 22_segment_intersect/samples.py | 82 -- 3 files changed, 186 insertions(+), 631 deletions(-) delete mode 100644 22_segment_intersect/2_segments.in delete mode 100644 22_segment_intersect/samples.py diff --git a/22_segment_intersect/2_segments.in b/22_segment_intersect/2_segments.in deleted file mode 100644 index 254e07b..0000000 --- a/22_segment_intersect/2_segments.in +++ /dev/null @@ -1,13 +0,0 @@ -6 -1 1 4 4 -2 3 2 4.5 -0 0 4 4 -4 1 1 4 -1 1 3 5 -3 5 2 2 -1 1 5 3 -3 2 3 0 -1 5 4 2 -3 3 5 1 -3 5 3 4 -3 3 3 1 \ No newline at end of file diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index 67b5083..a8c971a 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -1,165 +1,39 @@ { "cells": [ - { - "cell_type": "markdown", - "metadata": { - "collapsed": false - }, - "source": [ - "# Пересечение множества отрезков\n", - "Перед нами стоит задача: дано множество $S$, состоящее из $n$ отрезков на плоскости. Нам нужно найти все точки их пересечений. \n", - "\n", - "Очевидно, что наивный алгоритм, переберающий все пары отрезков, имеет сложность $O(n^2)$. В некотором смысле это оптимальная оценка, так как в случае, когда каждая пара отрезков из множества пересекается, любой алгоритм займет $\\Omega(n^2)$ времени. Однако на практике такие ситуации встречаются редко, обычно пересечений гораздо меньше. Поэтому хотелось бы уметь решать данную задачу быстрее в таких ситуациях. Другими словами, нужен алгоритм, время работы которого будет зависеть не только от $n$, но и от количества пересечений. Такие алгоритмы называются *output-sensitive*. \n", - "\n", - "В этом конспекте мы научимся решать поставленную задачу за время $O((n + I)\\log{n})$, где $I$ - количество персечений. Кроме этого мы рассмотрим несколько смежных задач." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## План конспекта\n", - "- Предикат \"левый поворот\"\n", - " - Наивная реализация\n", - " - Проблемы наивной реализации\n", - " - Расчет погрешности вычисления поворота в числах с плавающей точкой\n", - " - Реализация с учетом погрешностей\n", - "- Задача о пересечении двух отрезков\n", - " - Теория\n", - " - Упражнение\n", - "- Алгоритм Бентли-Оттмана\n", - " - Теория\n", - " - Упражнение" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Предикат \"Левый поворот\"\n", - "Это простейший геометрический предикат, который позволяет проверять, пересекается ли пара отрезков, лежит ли точка внутри треугольника и многое другое. Он принимает на вход три точки плоскости $(a, b, c)$ и возвращает следующие значения:\n", - "\n", - "$$ \\begin{equation*}\n", - "turn(a, b, c) = \n", - " \\begin{cases}\n", - " 1, &\\text{если c лежит слева от направленного отрезка ab,}\\\\\n", - " -1, &\\text{если c лежит справа от направленного отрезка ab,}\\\\\n", - " 0, &\\text{если три точки лежат на одной прямой.}\n", - " \\end{cases}\n", - "\\end{equation*} $$\n", - "\n", - "Предикат вычисляется с помощью векторного произведения:\n", - "\n", - "$$ turn(a, b, c) = sign((b - a) \\times (c - a)) = sign \n", - "\\left( \\begin{array}{cc}\n", - " \\left| \\begin{array}{cc}\n", - " b_x - a_x & c_x - a_x\\\\\n", - " b_y - a_y & c_y - a_y\n", - " \\end{array} \\right| \n", - "\\end{array} \\right) $$\n", - "\n", - "Рассмотрим результат такого наивного вычисления поворота от отрезка и точки плоскости: красный цвет - левый поворот, синий - правый, зеленый - точка и отрезок принадлежат одной прямой: " - ] - }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": { - "collapsed": false, - "scrolled": true + "collapsed": true }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf8AAAFdCAYAAAANJWRbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzt3X9s9ed51/HPhZMt2yo8Od0i0kqZ9rihT8SqNaGqJugQ\nUGSGYANNYj20DHXSRmEbyNPUrX+gtQhUWrp6sFIJVK1laWdtf1AJEI9SQTukanRhT5ZOYpGPfdJq\nrTYKPgc8qW5Rl9z8YTv18XN8fvq6vue67/dL+kqJY799666bO4+/53wvK6UIAAC04491vQAAABCL\nwx8AgMZw+AMA0BgOfwAAGsPhDwBAYzj8AQBoDIc/AACNua/rBVxmZg9K2pH0eUlf7XY1AACk8oCk\n75D0VCllOO0T1+rw19nB/7GuFwEAQGJvlvQr0z5h3Q7/z0vSRz/6Ud2+fbvjpSxud3dXe3t7XS+j\nKex5PPY8HnseL+OeP/fcc3rLW94inZ+l06zb4f9VSbp9+7Yef/zxrteysM3NzZTrzow9j8eex2PP\n4yXf85m3zXnBHwAAjeHwBwCgMRz+AAA0hsP/BvV6va6X0Bz2PB57Ho89j1f7nlsppes1vMTMHpd0\n9+7du5lfaAEAQLhnnnlGTzzxhCQ9UUp5Ztrn8id/AAAaw+EPAEBjOPwBAGgMhz8AAI1Ztyf8+en3\npcFA2t6WXvWqXH3a8X3a8X3a8X3a4f3+sK/BaKDtrW296kGHtc+rlLI2l6THJZW7d++WGzMclrKz\nU4r09Wtnp5TRaP37tOP7tOP7tOP7tMP7w9Nh2Xlyp+ideunaeXKnjE5vaO2llLt37xZJRdLjZdZ5\nO+sTIi+Xw39np5SNjfH/MTc2zj6+7n3a8X3a8X3a8X3a4f2dJ3fKxrs2xg7/jXdtlJ0nb2jthcP/\n6w4Oxv9HvHr1++vbp13X2rO2M689azvz2rO2nfsHxwdjh/7Vq3+84trPLXL41/2Cv8Fg+j8/Olrf\nPu34Pu34Pu34Pu3w/mA0vX00WnHtS6j78L91a/o/395e3z7t+D7t+D7t+D7t8P6trent7a0V176M\nWb8aiLzEPX/aXfdpx/dpx/dph/e55x99+I9Gvq8O9ezTju/Tju/Tju/TDu+PTkdr9Wr/dgb7HB6e\n3bPxel+oZ592fJ92fJ92fJ92eP9weKij0ZHL+/wXGezTzuEPAEDFmOoHAACuxeEPAEBjOPwBAGgM\n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\nTzwA+tbW9Pb21grtxHOrs649a9u7Tzu+Tzu+7732pcz61UDkJe75j6e55x/epx3fpx3fpx3f555/\n9OGfeAD06HTk9mr/zHOrs649a9u7Tzu+Tzu+7732UhY7/NsZ6Zt4APTh8FBHoyOX9/lnnVvt3acd\n36cd36cd3/dsLzLSt53DHwCAii1y+Nf9gj8AAHAPDn8AABrD4Q8AQGM4/AEAaIz74W9m32Bmz5rZ\ni2b2Gu/vBwAAposY6fteSV+U9F0B3+t6znMUGbsb2/bu047v047v047vNzHSV9L3Sfofkl4t6UVJ\nr5nx+elG+jJ2N7bt3acd36cd36cd329mpK+khyR9QdJrJT3S2eHv/ExFHsEb2/bu047v047v047v\nN/N4X0n/SdI7zv+6m8PfeY4iY3dj25nXnrWdee1Z25nXnrWdfe0XFjn8F7rnb2bvlvQz0+4iSLot\n6S9Lepmk91x86SLfZ3d3V5ubm2Mf6/V66vV6i2Tmm6O4wk2XecbuLnv/33PpWdvefdrxfdrxfdrx\nfY/2/v6+9vf3xz52cnIy99cv+oK/90n68IzP+ZykPy/peyT9P7Oxc/+3zOxjpZS3Tgvs7e3dzON9\nnecoMnY3tu3dpx3fpx3fpx3f92hP+gPxpcf7zjbrVwPLXJJeKemxS9cbJb0g6a9LenjK13HP/3I7\n6f0n7svV1fbu047v047vN3PPf+ybdPmCP+c5iozdjW1792nH92nH92nH95sc6Wtmj0h6XtJrSym/\nM+Xz0o70ZexubNu7Tzu+Tzu+Tzu+z0jfCRjpCwDAchjpCwAArsXhDwBAYzj8AQBoDIc/AACN4fAH\nAKAxHP4AADRm0cf7ptUf9jUYDVzehy/lnf+cte3dpx3fpx3fpx3f91773GY9BSjyksMT/oanQ7cn\n8JWSd/5z1rZ3n3Z8n3Z8n3Z833vtpazh433nvTwOf89n75eS91nQWdvefdrxfdrxfdrx/Saf7T/v\nddOH/8Hxwdihf/XqH682RDnr/Oes7cxrz9rOvPas7cxrz9rOvvYLixz+Vb/gbzCaPkT5aHS0Wn+O\nGc20b67t3acd36cd36cd3/de+zKqPvxvbU0fory9tdoA6Gzzn7O3vfu04/u04/u04/vea1/KrF8N\nRF7inj/tjvu04/u04/u04/vc8w8+/EenI9dX+2ed/5y17d2nHd+nHd+nHd/3Xnspix3+zYz0PRwe\n6mh05PY+/6zzn7O2vfu04/u04/u04/ue7UVG+jZz+AMAULNFDv+qX/AHAADuxeEPAEBjOPwBAGgM\nh/8N2t/f73oJzWHP47Hn8djzeLXvOYf/Dar9h2Udsefx2PN47Hm82vecwx8AgMZw+AMA0BgOfwAA\nGnNf1wu44gFJeu6557pex1JOTk70zDNTn6uAG8aex2PP47Hn8TLu+aWz84FZn7tuT/j7W5I+1vU6\nAABI7M2llF+Z9gnrdvg/KGlH0uclfbXb1QAAkMoDkr5D0lOllOG0T1yrwx8AAPjjBX8AADSGwx8A\ngMZw+AMA0BgOfwAAGsPhDwBAYzj8HZnZN5jZs2b2opm9puv11MrMHjGzD5nZ82Z2amaHZvZOM7u/\n67XVxMx+3Mw+Z2ZfMbPPmNnrul5TrczsHWb2tJn9oZl9ycw+bmaPdr2ulpjZz57/u/v9Xa/FA4e/\nr/dK+qIk3k/p69WSTNKPSnpM0q6kt0n6p10uqiZm9kOSfl7Sz0l6raTPSnrKzF7e6cLq9QZJvyjp\n9ZLeKOl+SZ8ws2/qdFWNOP8P2x/T2c95lXifvxMz+z5J75P0g5J+V9J3l1J+p9tVtcPMflrS20op\n212vpQZm9hlJv1lK+Yfnf2+SviDpX5ZS3tvp4hpw/h9Z/0vS95ZSPt31empmZi+TdFfS35P0jyT9\ndinlp7pd1c3jT/4OzOwhSf9G0lskfaXj5bTqWyWNul5EDc5vnzwh6b9cfKyc/anhP0v6nq7W1Zhv\n1dlvEPmZ9vevJP2HUsonu16Ip3Ub7FOLD0v6YCnlt83ska4X0xoz25b0E5Kq+6/1jrxc0oakL135\n+Jck/cn45bTl/LcsvyDp06WU3+16PTUzszdJ+m5Jf7rrtXjjT/5zMrN3n7/447rrBTN71Mz+gaSX\nSXrPxZd2uOzU5t3zK1/zCkl3JP1qKeWXulk5cKM+qLPXsryp64XUzMxeqbP/yHpzKeVrXa/HG/f8\n53Q+dOjBGZ/2OUm/JumvXvn4hqQ/kvSxUspbHZZXpTn3/PlSyh+df/7Dkj4l6TfY55tz/mv/U0k/\nWEr595c+/hFJm6WUv9HV2mpnZh+Q9NckvaGU8ntdr6dmZvYDkv6dpBf09T+0bejsdssLkr6xVHRg\ncvjfsPP/evzjlz70sKSndPbCv6dLKb/fycIqd/4n/k9K+u+S/nZN/yddB9e84O/3dPaCv3/e6eIq\ndX7w/4CkP1dKeb7r9dTOzL5F0tXbtB+R9Jykf1ZKeS58UY6453/DSilfvPz3ZvZlnf1X5PMc/D7O\n/8T/6zqyl/jEAAAA2UlEQVT7zcvbJX372dkklVKu3qfGct4v6SNmdlfS0zp7O+U36+xfjrhhZvZB\nST1J3y/py+cvIpakk1IK484dlFK+rLN3Zr3k/N/fw9oOfonDPwp/CvX1lyR95/n1hfOPmc72faOr\nRdWklPJr5283+8eSHpL0rKSdUsr/7nZl1Xqbzn5+f/3Kx98q6ZfDV9Ouav/dza/9AQBoDK/2BwCg\nMRz+AAA0hsMfAIDGcPgDANAYDn8AABrD4Q8AQGM4/AEAaAyHPwAAjeHwBwCgMRz+AAA0hsMfAIDG\n/H//kDp8WS5vWwAAAABJRU5ErkJggg==\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", + "import bintrees\n", "\n", - "class Point:\n", - " def __init__(self, x = 0.0, y = 0.0):\n", - " self.x = x\n", - " self.y = y\n", - "\n", - " def __add__(self, p):\n", - " return Point(self.x + p.x, self.y + p.y)\n", - "\n", - " def __sub__(self, p):\n", - " return Point(self.x - p.x, self.y - p.y)\n", - "\n", - " def __neg__(self):\n", - " return Point(-self.x, -self.y)\n", - "\n", - " def __repr__(self):\n", - " return \"(%r, %r)\" % (self.x, self.y)\n", - "\n", - "max_val = 5\n", - "step = 0.5\n", - "colors = [\"r\",\"g\", \"b\"]\n", - "\n", - "def calculate_det(a, b):\n", - " return a.x * b.y - b.x * a.y\n", - "\n", - "def turn(a, b, c):\n", - " det = calculate_det(b - a, c - a)\n", - " if det > 0:\n", - " return colors[0]\n", - " if det < 0:\n", - " return colors[2]\n", - " return colors[1]\n", - "\n", - "x = Point(-max_val, -max_val)\n", - "y = Point(max_val, max_val)\n", - "for x_i in np.arange(-max_val + step, max_val, step):\n", - " for y_i in np.arange(-max_val + step, max_val, step):\n", - " color = turn(x, y, Point(x_i, y_i))\n", - " plt.scatter(x_i, y_i, color = color, s = 20)\n", - "\n", - "plt.axis([-max_val, max_val, -max_val, max_val])\n", - "plt.show()" + "import entities" ] }, { "cell_type": "markdown", "metadata": { - "collapsed": true + "collapsed": false }, "source": [ - "Однако у такого решения есть проблема: попробуем посчитать поворот точек $p1 = (1.1016, 8.1672)$, $p2 = -p1$ и $p3 = p1 * (1 << 52)$:" + "# Пересечение множества отрезков\n", + "Перед нами стоит задача: дано множество $S$, состоящее из $n$ отрезков на плоскости. Нам нужно найти все точки их пересечений. \n", + "\n", + "Очевидно, что наивный алгоритм, перебирающий все пары отрезков, имеет сложность $O(n^2)$. В некотором смысле это оптимальная оценка, так как в случае, когда каждая пара отрезков из множества пересекается, любой алгоритм займет $\\Omega(n^2)$ времени. Однако на практике такие ситуации встречаются редко, обычно пересечений гораздо меньше. Поэтому хотелось бы уметь решать данную задачу быстрее в таких ситуациях. Другими словами, нужен алгоритм, время работы которого будет зависеть не только от $n$, но и от количества пересечений. Такие алгоритмы называются *output-sensitive*. \n", + "\n", + "В этом конспекте мы рассмотрим алгоритм Бентли-Оттмана (*англ. Bentley-Ottmann*), который позволяет решать поставленную задачу за время $O((n + I)\\log{n})$, где $I$ - количество персечений." ] }, { - "cell_type": "code", - "execution_count": 5, - "metadata": { - "collapsed": false, - "scrolled": true - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Points: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", - "Turn: left turn\n" - ] - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "p1 = Point(1.1016, 8.1672)\n", - "p2 = -p1\n", - "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", - "print(\"Points:\", p1, p2, p3)\n", - "t = turn(p1, p2, p3)\n", - "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" + "Перед тем, как приступить к изучению этого материала, настоятельно рекомендуется ознакомиться с конспектом про [афинное пространство](https://github.com/CT-18/cg/tree/5_affine_space), а именно с предикатом \"левый поворот\" и задачей о пересечении двух отрезков." ] }, { @@ -168,296 +42,162 @@ "collapsed": true }, "source": [ - "Несмотря на то, что точки лежат на одной прямой, результат не равен $collinear$. Проблема кроется в ограниченной точности арифметики с плавающей точкой. Достаточно часто реализацию алгоритмов вычислительной геометрии затрудняют такие вычисления, так как их погрешность приводит к нарушению инвариантов алгоритма. \n", - "\n", - "Но заметим, что $collinear$ - достаточно редкий результат. Поэтому если бы мы могли большую часть ответов выдавать, сравнивая векторное произведение с некоторой константой $e$, а оставшуюся часть считать каким-нибудь менее эффективным, но точным способом (например, воспользовавшись длинной арифметикой), то мы могли бы считать нашу задачу выполненной, так как в среднем время расчета поворота увеличилось бы незначительно. Поэтому наша следующая задача - вычислить константу $e$.\n", - "\n", - "Двоичное число с плавающей точкой представляется в виде $a = \\pm 1.a_1a_2a_3 \\dots a_{p - 1} \\times 2^\\gamma$, где $a_i \\in \\{ 0, 1 \\}$. Обозначим за $D$ множество всех чисел c плавающей точкой, операции над ними (в противовес обычным операциям над вещественными числами) обычно обозначают как $\\oplus$, $\\ominus$ и $\\otimes$. Машинный эпсилон $\\varepsilon = 2^{-p}$. Тогда погрешности операций для $\\forall a, b \\in D$ при условии округления к ближайшему можно выразить так:\n", - "* $(a \\oplus b) = (a + b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", - "* $(a \\ominus b) = (a - b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", - "* $(a \\otimes b) = (a \\times b) \\cdot (1 + \\delta)$, $\\mid \\delta \\mid \\leqslant \\varepsilon$\n", - "\n", - "Нам нужно показать, что справедливо следующее утверждение:\n", - "\n", - "$$ \\forall a, b, c \\in D^2, \\widetilde{v} = (b_x \\ominus a_x) \\otimes (c_y \\ominus a_y) \\ominus (b_y \\ominus a_y) \\otimes (c_x \\ominus a_x) $$ \n", - "$$ \\begin{equation*}\n", - "\\exists e \\in D :\n", - " \\begin{cases}\n", - " \\widetilde{v} > e &{\\Rightarrow (b - a) \\times (c - a) > 0}\\\\\n", - " \\widetilde{v} < -e &{\\Rightarrow (b - a) \\times (c - a) < 0}\n", - " \\end{cases}\n", - "\\end{equation*} $$\n", - "\n", - "Обозначим $v = (b - a) \\times (c - a) = (b_x - a_x) (c_y - a_y) - (b_y - a_y) (c_x - a_x)$. Распишем выражение для $\\widetilde{v}$ в арифметике с плавающей точкой: \n", - "\n", - "$$ \\begin{array}{c}\n", - " \\widetilde{v} = (b_x \\ominus a_x) \\otimes (c_y \\ominus a_y) \\ominus (b_y \\ominus a_y) \\otimes (c_x \\ominus a_x) = \\\\\n", - " = [ (b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) - (b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) ] (1 + \\delta_7),\n", - "\\end{array}\n", - "$$\n", + "## Алгоритм Бентли-Оттмана\n", + "\n", "\n", - "где $ \\mid \\delta_i \\mid \\leqslant \\varepsilon.$ Заметим, что $v \\approx \\widetilde{v}$. Оценим абсолютную погрешность $|v - \\widetilde{v}|$.\n", + "Посмотрим на множество $S$. Нам нужно найти такое свойство или правило, по которому мы смогли бы отметать отрезки, которые точно не имеют общих точек, и не проверять их на пересечение.\n", "\n", - "$$ \\begin{array}{c} \n", - "|v - \\widetilde{v}| = |(b_x - a_x) (c_y - a_y) - (b_y - a_y) (c_x - a_x) - (b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7) + \\\\ + (b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7)| = \\\\ = |(b_x - a_x) (c_y - a_y) (1 - (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7)) - (b_y - a_y) (c_x - a_x) (1 - (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7))| \\leqslant \\\\ \n", - "\\leqslant |(b_x - a_x) (c_y - a_y) (1 - (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7))| + |(b_y - a_y) (c_x - a_x) (1 - (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7))| = \\\\ \n", - "= |(b_x - a_x) (c_y - a_y)| \\cdot |((1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3) (1 + \\delta_7) - 1)| + |(b_y - a_y) (c_x - a_x)| \\cdot |((1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6) (1 + \\delta_7) - 1)| = \\\\ \n", - "= |(b_x - a_x) (c_y - a_y)| \\cdot |\\delta_1 + \\delta_2 + \\delta_3 + \\delta_7 + \\delta_1 \\delta_2 \\ldots| + |(b_y - a_y) (c_x - a_x)| \\cdot |\\delta_4 + \\delta_5 + \\delta_6 + \\delta_7 + \\delta_4 \\delta_5 \\ldots| \\leqslant \\\\ \n", - "\\leqslant |(b_x - a_x) (c_y - a_y)| \\cdot (|\\delta_1| + |\\delta_2| + |\\delta_3| + |\\delta_7| + |\\delta_1 \\delta_2| \\ldots) + |(b_y - a_y) (c_x - a_x)| \\cdot (|\\delta_4| + |\\delta_5| + |\\delta_6| + |\\delta_7| + |\\delta_4 \\delta_5| \\ldots) \\leqslant \\\\\n", - "\\leqslant |(b_x - a_x) (c_y - a_y)| \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) + |(b_y - a_y) (c_x - a_x)| \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) = \\\\ \n", - "= (|(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|)(4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4)\n", - "\\end{array}\n", - "$$\n", + "Начнем с достаточно простого наблюдения. Спроецируем все отрезки на ось $X$. Заметим, что отрезки, проекции которых не пересекаются, не могут иметь общих точек. А для отрезков, проекции которых накладываются друг на друга, существует параллельная оси $Y$ прямая, пересекающая их. \n", "\n", - "Заметим, что $e$ должна удовлетворять неравенству $|\\widetilde{v} - v| \\leqslant e \\leqslant |\\widetilde{v}|$. Таким образом, мы получили нижнюю границу числа $e$ в вещественных числах, но $e$ является числом с плавающей точкой. Обозначим $t = |(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|$. Тогда $|v - \\widetilde{v}| \\leqslant t \\cdot (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4)$. Пусть $\\widetilde{t} = |(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|$. Распишем:\n", + "Представим прямую $l$, скользящую по плоскости параллельно оси $Y$, начинающую свое движение из $-\\infty$. Будем называть её заметающей прямой (*sweep line*). Тогда, принимая во внимание наше наблюдение, мы можем утверждать, что пересекаются только такие отрезки, для которых существует положение прямой $l$, при котором она одновременно их пересекает. Таким образом, во время движения $l$ вдоль плоскости мы сможем отслеживать все отрезки, пересекающие её в один момент времени, и находить их пересечения.\n", "\n", - "$$ \\begin{array}{c} \n", - "\\widetilde{t} = [|(b_x - a_x) (c_y - a_y) (1 + \\delta_1) (1 + \\delta_2) (1 + \\delta_3)| + |(b_y - a_y) (c_x - a_x) (1 + \\delta_4) (1 + \\delta_5) (1 + \\delta_6)|] (1 + \\delta_7) \\geqslant \\\\\n", - "\\geqslant |(b_x - a_x) (c_y - a_y) (1 - \\varepsilon)^3)| \\cdot (1 - \\varepsilon) + |(b_y - a_y) (c_x - a_x) (1 - \\varepsilon)^3)| \\cdot (1 - \\varepsilon) = \\\\\n", - "= |(b_x - a_x) (c_y - a_y)| \\cdot (1 - \\varepsilon)^4 + |(b_y - a_y) (c_x - a_x)| \\cdot (1 - \\varepsilon)^4 = \\\\\n", - "= (|(b_x - a_x) (c_y - a_y)| + |(b_y - a_y) (c_x - a_x)|) \\cdot (1 - \\varepsilon)^4 = t \\cdot (1 - \\varepsilon)^4\n", - "\\end{array}\n", - "$$\n", + "Будем называть статусом (*status*) заметающей прямой множество отрезков, пересекающих $l$ в данный момент времени, и событиями (*event points*) - точки, в которых статус меняется. Очевидно, что в нашем случае это точки начал и концов отрезков. \n", "\n", - "Получили, что $t \\leqslant \\Large \\frac{\\widetilde{t}}{(1 - \\varepsilon)^4}$. Отсюда следует:\n", - "$$ \\begin{array}{c} \n", - "|v - \\widetilde{v}| \\leqslant e \\leqslant \\widetilde{t} \\times \\Large \\frac{4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4}{(1 - \\varepsilon)^4} = \\\\ = \\widetilde{t} \\times (4 \\varepsilon + 6 \\varepsilon^2 + 4 \\varepsilon^3 + \\varepsilon^4) \\times (1 + 4 \\varepsilon + 10 \\varepsilon^2 + 20 \\varepsilon^3 + O(\\varepsilon^4)) \\leqslant (|(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|) \\times 8 \\varepsilon \n", - "\\end{array}\n", - "$$\n", + "Заметим, что алгоритм совершает какие-то дейтвия только при достижении $l$ события: обновляется статус прямой и происходят проверки отрезков на наличие пересечений. Например, если событие - \"левый конец отрезка\" $s_i$, то это значит, что $s_i$ начал пересекать заметающую прямую и должен быть добавен в статус. После добавления $s_i$ проверяется на пересечение с отрезками, уже имеющимися в статусе. При достижении события \"правый конец\", отрезок перестает пересекать $l$ и должен быть удален из статуса. Таким образом, мы проверяем на пересечение только такие отрезки, для которых существует вертикальная прямая, пересекающая их.\n", "\n", - "Таким образом, константа $e$ может быть вычислена следующим образом: \n", + "Однако такой алгоритм все еще не output-sensitive, поскольку есть ситуации, при которых происходит проверка $O(n^2)$ пар отрезков, хотя пересечений на самом деле много меньше: простейший пример - множество горизонтальных отрезков, пересекающих ось $Y$. Проблема в том, что два отрезка, пересекающих заметающую прямую, могут находиться далеко друг от друга в вертикальном направлении. \n", "\n", - "$$ e = (|(b_x \\ominus a_x) \\otimes (c_y \\ominus a_y)| \\oplus |(b_y \\ominus a_y) \\otimes (c_x \\ominus a_x)|) \\times 8 \\varepsilon $$\n", + "\n", + "Упорядочим отрезки, пересекающие $l$, снизу вверх: это поможет нам понять, какие отрезки находятся близко. Теперь будем проверять на пересечение только ближайших соседей, то есть каждый новодобавленный в статус отрезок будем проверять только с его непосредственными соседями снизу и сверху, если они есть. Позже у этого отрезка могут измениться соседи, и тогда они снова будут проверены на пересечение. Такой подход отразится на статусе заметающей прямой: теперь статус - это упорядоченная последовательность отрезков, пересекающих $l$. Соответственно, теперь он меняется не только при достижении концов отрезков, но и в точках пересечения, так как в них меняется порядок пересекающихся отрезков. Следовательно, мы должны проверить эти два отрезка на пересечение с их новыми соседями. Таким образом, теперь у нас появился третий тип событий - точки пересечения отрезков.\n", "\n", - "С учетом полученных результатов, предикат будет выглядеть так:" + "Итак, мы разработали так называемый *plane sweep algorithm*. Для полного понимания принципа его работы, ниже представлена визуализация движения заметающей прямой:\n", + "" ] }, { - "cell_type": "code", - "execution_count": 6, + "cell_type": "markdown", "metadata": { - "collapsed": false + "collapsed": true }, - "outputs": [], "source": [ - "from decimal import *\n", - "\n", - "getcontext().prec = 70\n", - "\n", - "def calculate_arg(a, b):\n", - " return abs(a.x * b.y) + abs(b.x * a.y)\n", - "\n", - "def turn(a, b, c):\n", - " e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a)\n", - " det = calculate_det(b - a, c - a)\n", - " if det > e:\n", - " return colors[0]\n", - " if det < -e:\n", - " return colors[2]\n", - "\n", - " la = Point(Decimal(a.x), Decimal(a.y))\n", - " lb = Point(Decimal(b.x), Decimal(b.y))\n", - " lc = Point(Decimal(c.x), Decimal(c.y))\n", - " ldet = calculate_det(lb - la, lc - la)\n", - " if ldet > 0:\n", - " return colors[0]\n", - " if ldet < 0:\n", - " return colors[2]\n", - " return colors[1]" + "Теперь давайте подробнее разберем, что именно должно происходить при достижении заметающей прямой каждого типа события. Так как статус, как ранее было сказано, это упорядоченный набор пересекающих заметающую прямую отрезков в конкретный момент времени, то два отрезка являются соседними в статусе, если они являются ближайшими вдоль $l$.\n", + "1. Если событие - начало отрезка, то это значит, что новый отрезок начал пересекать заметающую прямую. Поэтому он должен быть добавлен в статус и проверен на пересечение с двумя своими непосредственными соседями сверху и снизу, если они есть. Нас интересуют только пересечения правее заметающей прямой, так как если пересение находится левее, то оно уже было обнаружено (этот достаточно очевидный факт будет доказан чуть позже). Например, если отрезки $s_k$ и $s_l$ были соседними в статусе, и в какой-то момент между ними появился новый отрезок $s_i$, то мы должны проверить, не пересекается ли $s_i$ с $s_k$ и $s_i$ с $s_l$. Если мы находим точку пересечения левее $l$, то мы должны запомнить это событие (позже мы разберем подробнее, что это значит) и впоследствии обработать его.

\n", + "2. Если событие - точка пересечения, то это значит, что эти отрезки поменяли свой порядок вдоль $l$. У каждого из них появился как максимум один новый сосед, с которым нужно проверить соответствующий отрезок на пересечение. Опять же нас интересуют только пересечения правее заметающей прямой (по той же причине). Приведём пример: предположим, что четыре отрезка идут в статусе в порядке $s_i$, $s_k$, $s_j$, $s_m$ в момент, когда $l$ достигает точки пересечения $s_k$ и $s_j$ (как на рисунке справа). В следующий момент эти два отрезка меняются в статусе местами, и мы должны проверить на перечечение $s_i$ с $s_j$ и $s_k$ с $s_m$. Если мы находим новые точки пересечений, то запоминаем их для дальнейшей обрабртки. Однако здесь стоит не забывать о том, что эти новые пересечения мы могли уже обнаружить ранее.

\n", + "3. Если событие - конец отрезка, то это значит, что он перестал пересекать заметающую прямую. Следовательно, его соседи сверху и снизу, если они оба есть, теперь являются ближайшими вдоль $l$ и должны быть проверены на пересечение. Если мы обнаружили пересечение правее заметающей прямой, то, опять же, запоминаем это событие для дальнейшей обработки. Предположим, что в статусе отрезки $s_k$, $s_j$ и $s_m$ идут в указанном порядке, когда заметающая прямая достигает канца отрезка $s_j$. Тогда отрезки $s_k$ и $s_m$ должны быть проверены на пересечение. Здесь снова стоит помнить, что новое событие \"пересечение отрезков\" могло быть уже обраружено ранее." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Если мы посчитаем поворот точек $p1$, $p2$ и $p3$ теперь, то получим верный результат:" + "Теперь давайте обсудим, какие структуры данных нам понадобятся для реализации алгоритма. На самом деле их всего две: очередь событий $\\Omega$ и статус $T$. \n", + "\n", + "Как раньше было показано, алгоритм совершает какие-то действия только при достижении заметающей прямой какого-либо события. Следовательно, программно сэмитировать движение $l$ мы можем просто рассматривая события в том порядке, в котором прямая настигла бы их по ходу своего движения справа налево. Определим отношение \"меньше\" для двух событий $p$ и $q$: будем считать, что событие \"левый конец\" меньше события \"пересечение\", а последнее меньше собятия \"правый конец\". Если события одного типа, то \n", + "$$ p < q \\Longleftrightarrow \\left[ \n", + " \\begin{align} \n", + " &p_x < q_x \\\\ \n", + " &p_x = q_x \\wedge p_y < q_y \\\\ \n", + " \\end{align} \n", + "\\right. $$\n", + "Таким образом, для очереди нам нужна такая структура данных, в которой мы могли бы хранить события в соответствии с определённым выше порядком. Кроме того надо помнить, что события \"пересечение отрезков\" появляются динамически, то есть мы должны уметь вставлять в очередь новые элементы, а также некоторые события могут быть вычислены больше одного раза, но в очереди при этом они должны встречаться лишь единожды. И ещё нам нужна операция поиска следующего события в очереди. Мы будем использовать сбалансированное бинарное дерево поиска, в котором обе операции - вставка нового элемента и поиск и удаление следующего элемента - занимают $O(\\log{m})$ времени, где $m$ - количество событий в $\\Omega$. \n", + "\n", + "Статус заметающей прямой нужен нам для поиска соседей данного отрезка. Структура данных статуса должна быть динамической, так как отрезки добавляются и удаляются из него в ходе работы алгоритма. Отрезки в статусе упорядочены, поэтому мы снова будем использовать сбалансированное бинарное дерево поиска. " ] }, { - "cell_type": "code", - "execution_count": 7, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Points: (1.1016, 8.1672) (-1.1016, -8.1672) (4961165349511338.0, 3.678179887666031e+16)\n", - "Turn: collinear\n" - ] - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "p1 = Point(1.1016, 8.1672)\n", - "p2 = -p1\n", - "p3 = Point(p1.x * (1 << 52), p1.y * (1 << 52))\n", - "print(\"Points:\", p1, p2, p3)\n", - "t = turn(p1, p2, p3)\n", - "print(\"Turn:\", (\"left turn\" if t == \"r\" else (\"collinear\" if t == \"g\" else \"right turn\")))" + "Итак, мы придумали эффективный алгоритм, сильно сократив количество проверок (строгая оценка будет даначуть позже). Теперь нужно убедиться в том, что он по-прежнему находит все точки пересечений. Для начала уберем из рассмотрения перекрывающиеся (имеющие больше одной общей точки) и вертикальные отрезки, а также случай, когда больше двух отрезков пересекаются в одной точке. Эти три случая обрабатываются несложно, не выбиваясь из общего алгоритма. Однако для простоты рассуждений временно будем считать, что таких ситуаций быть не может, и покажем, что в таком предположении алгоритм работает корректно." ] }, { "cell_type": "markdown", - "metadata": { - "collapsed": true - }, + "metadata": {}, "source": [ - "## Задача о пересечении двух отрезков\n", - "Теперь научимся определять, пересекаются ли два отрезка, используя предикат \"левый поворот\". \n", - "\n", - "Отрезок $s$ задается начальной и конечной точками $a, b \\in \\mathbb{R}^2$ и определяется как множество точек $s = \\{ (1 - t)a + tb, t \\in [0, 1] \\}$. Отрезки $s_1$ и $s_2$ пересекаются, если существует непустое множество их общих точек. \n", - "\n", - "Иначе говоря, отрезки пересекаются тогда и только тогда, когда для каждого из них концы другого не лежат с одной от стороны от первого. Отдельно стоит рассматривать только граничный случай, когда оба отрезка лежат на одной прямой, потому как в таком случае проверка с помощью поворота ответа не даст (это обычно называют проверкой на *bounding box*). Немного модифицируем определение поворота и запишем условие пересечения двух отрезков:\n", + "### Теорема\n", + "> Пусть $s_i$ и $s_j$ - два невертикальных пересекающихся в точке $p$ отрезка, причем $p$ - единственная их общая точка. Также предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", "\n", - "\\begin{equation}\n", - "turn(s, c) = \n", - " \\begin{cases}\n", - " 1, &\\text{если c лежит слева от направленного отрезка s,}\\\\\n", - " -1, &\\text{если c лежит справа от направленного отрезка s,}\\\\\n", - " 0, &\\text{s и c коллинеарны.}\n", - " \\end{cases}\n", - "\\end{equation} \n", - "\n", - "$$ s_1 \\cap s_2 \\Longleftrightarrow \n", - "\\begin{equation}\n", - " \\begin{cases}\n", - " turn(s_1, s_2.a) \\cdot turn(s_1, s_2.b) \\leqslant 0, &\\text{ }\\\\\n", - " turn(s_2, s_1.a) \\cdot turn(s_2, s_1.b) \\leqslant 0, &\\text{ }\\\\\n", - " AABB(s_1) \\cap AABB(s_2) \\ne 0. &\\text{ }\n", - " \\end{cases}\n", - "\\end{equation} $$\n", - "\n", - "Здесь $AABB$ - это *axis-aligned bounding box*. Для этого достаточно проверить, что проекции этих двух отрезков на оси $X$ и $Y$ пересекаются." + "$\\triangleright$
\n", + "Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны взять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение.\n", + "
\n", + "$\\triangleleft$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Теперь Вам предлагается написать функцию, проверяющую 2 отрезка на пересечение. Функция *samples.check_intersection(Segment, Segment)* решает поставленную задачу и приведена в качестве примера возможной реализации. Однако читателю настоятельно рекомендуется выполнить это несложное упражнение самостоятельно. " + "Отметим, что началом отрезка будем считать тот его конец, который меньше второго в лексикографическом порядке.\n", + "\n", + "Теперь вернемся к трем случаям, о которых мы временно забывали, и рассмотрим, как обрабатывается каждый из них:\n", + "1. Если в множестве $S$ есть вертикальный отрезок $s_i$, то в очереди $\\Omega$ у нас будут лежать два события с одинаковыми $x$-координатами, отвечающие за начало и конец $s_i$. Благодаря вышеопределенному порядку, сначала будет рассмотрено событие \"начало отрезка\", так как его $y$-координата меньше, и отрезок будет проверен на пересечение с соседями. Через какое-то время будет рассмотрено событие \"конец отрезка\" и будут проведены соответствующие проверки. То есть случай вертикального отрезка ничем не отличается от случая невертикального, и нам не нужно совершать никаких дополнительных действий для его обработки. Для лучшего понимания можно просто представить, что заметающая прямая не вертикальная, а наклонена от вертикальной оси под очень небольшим углом влево, как на рисунке справа (такой прием называется *skew*). Тогда очевидно, что нижний конец вертикального отрезка всегда будет достигаться первым.

\n", + "2. Для случая, когда два отрезка накладываются друг на друга, мы просто заранее должны решить, что мы хотим от алгоритма в таких ситуациях. То есть для корректной обработки в этом случае нужно четкое определение того, что ожидается на выходе. Это может быть любая точка из общих точек двух отрезков, может быть конкретно обозначенная. Кроме того может быть кому-то понадобится возвращать список пар пересекающихся отрезков, в таком случае это опять же не будет выбиваться из общей картины.

\n", + "3. Теперь разберем случай, когда в одной точке пересекается больше двух отрезков. Так как у нас события отсортированы в порядке \"начало отрезка\" < \"пересечение отрезков\" < \"конец отрезка\", то случаи, когда в точке пересечения отрезков начинаются или заканчиваются другие отрезки, вписывается в общую картину и не требуют отдельного рассмотрения. Теперь вспомним, что в точке пересечения мы меняем порядок пересекающихся отрезков в статусе и проверяем их на пересечение с новыми соседями. Поэтому сколько бы отрезков не пересекалось в точке, благодаря таким перестановкам все пары пересекающихся отрезков будут найдены. Рассмотрим пример справа. Кратко опишем действия алгоритма: сначала в пустой статус добавляется отрезок $s_1$, далее - отрезок $s_2$, после проверки находится пересечение $s_2$ с $s_1$, далее в статус добавляется $s_3$ и находится пересечение $s_3$ с $s_1$. После этого добавляются $s_4$, $s_5$ и $s_6$, при добавлении последнего находятся пересечения $s_6$ с $s_1$ и $s_6$ с $s_3$. Если бы мы не рассматривали события \"пересечение отрезков\", то далее алгоритм прошел бы по событиям \"конец отрезка\", не нашел бы больше пересечений (поскольку мы берем только пересечения правее) и завершил свою работу. Но так как у нас три типа событий, то после добавления $s_6$ алгоритм перейдет к обработке события \"пересечение отрезков $s_2$ и $s_1$\", и проверит на пересечение $s_2$ и $s_3$ (найдет новое пересечение) и $s_1$ и $s_4$, далее будут обработаны события \"пересечение $s_1$ и $s_3$\" и \"пересечение $s_6$ и $s_1$\". Во время проверки последнего $s_6$ и $s_1$ поменяются местами и на пересечение будут проверены пары $s_6$ с $s_2$ (найдет новое пересечение) и $s_1$ с $s_3$. Далее будут проверены события \"пересечение $s_6$ и $s_3$\" (указанные отрезки поменяются местами и будут проверены пары $s_3$ с $s_1$ и $s_6$ с $s_5$), \"пересечение $s_6$ и $s_2$\", после чего отрезки в порядке $s_2$, $s_4$, $s_3$, $s_5$, $s_1$, $s_6$ будут удалены из статуса. Таким образом, алгоритм найдет шесть пар пересекающихся отрезков." ] }, { - "cell_type": "code", - "execution_count": 6, - "metadata": { - "collapsed": false - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "# def check_intersection(s1, s2):\n", - "# return 0 if segments don't intersect and 1 otherwise\n", + "### Реализация алгоритма\n", + "Ранее мы подробно обсудили идею алгоритма, теперь давайте соберем все вместе и начнем практическую реализацию. Здесь будет дан каркас основных моментов и описание их ожидаемой функциональности, читателю в качестве тренировки предлагается самому дописать недостающие части. Входные данные содержатся в файле *segments_set.in* в следующем формате: в первой строке задано $n$ - количество отрезков в множестве $S$, в каждой из следующих $n$ строк указаны координаты начала и конца соответствующего отрезка.\n", "\n", - "import samples\n", - "Point = samples.Point\n", - "Segment = samples.Segment\n", - "check_intersection = samples.check_intersection" + "**Input:** Множество отрезков на плоскости $S$.
\n", + "**Output:** Множество точек пересечения отрезков из $S$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Чтобы проверить функцию на работоспособность, введите тестовые значения в файле *2_segments.in* в следующем формате: в первой строке задайте количество примеров $n$, в каждой из следующих $2n$ строк укажите координаты начала и конца отрезка. " + "Итак, опишем алгоритм *in general*, пока не рассматривая обработку событий и другие детали: \n", + "1. Инициализируем $status$ пустым множеством.\n", + "2. Инициализируем множество событий $events$ пустым множеством.\n", + "3. Вставим в $events$ события начал и концов отрезков из $S$.\n", + "4. Пока очередь событий не пуста, будем делать следующее:\n", + " 1. Достаем из очереди следующее событие $p$\n", + " 2. Обрабатываем $p$\n", + " \n", + "Для простоты реализации можно просто удалять пройденные события и на каждом шаге брать минимальное. Реализация этой части может быть следующей:" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "metadata": { "collapsed": false }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1EAAAINCAYAAADfvvWSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xd4VGX2wPHvCRsVEFFUghUR3RXLqmBbC6Ii9l4DrIiE\noiCCHQu46lp+goACKxBA0RB7YW0gIKBYWEBlV8BGwIYBQaIExZA5vz/OjQxD2pDM3ElyPs8zD+TO\nO3NPpry5bzuvqCrOOeecc8455yonLewAnHPOOeecc64m8UaUc84555xzzsXBG1HOOeecc845Fwdv\nRDnnnHPOOedcHLwR5ZxzzjnnnHNx8EaUc84555xzzsXBG1HOOeecc845FwdvRDnnnHPOOedcHLwR\n5ZxzzjnnnHNx8EaUSwoRmSkiM8KOozwi0lxEIiJyRdixOOcSR0QeF5G8sONwztVMXoc4qIONKBE5\nRESeF5FlIvKriHwrIlNFpE/YsSWbiOwmIoNE5K9JOJ0m+gQicldspSYiA0TkvDieZqviFJH6wWvZ\ndmsen2pEpFXw++wddix1kddTmySonlIgspXxnCEig6oxllCJyNUi0iXsOFz18jpkE69DEqsu1yF1\nqhElIscC/wEOAcYAvYGxQDHQN8TQwrI7MAg4LOxAqomyZSPoNqBSjShVXQ7UB57cinM3wF7Ldlvx\n2FR0IPb77BNyHHWO11NbSEQ9lQUcsJWPPRMYWI2xhO0aoE5eANVWXodsweuQxKqzdcifwg4gyW4H\n1gJHqOov0XeIyC7hhBQqCTuAVKOqv2/lQxPyWopIA1Vdn4jnrujUJGH00JXK66nNVft3S1WLsQvK\nrZGo7/p2qvpbIp7b1Tleh2zO6xCXGKpaZ27AYmB6HOU7A/OA9cBqIBfYs5RyvYGvgnIfAMcDM4EZ\nUWVOxIZ+L8F6RL4FfgaeAxoB2wDDgHzgF2A8kL41MQXnXgi0At4GCoPz3VRKPMXBvyX/vyK4fz/g\nBWAF8CvwTXCuRpV43XoAX8a8Hm9Hvx5BuV2BccAPwTk+Ljl/VJnmQWzXA92D5/0NmIv9gYguOwhY\nGvVz7O8XAcaXE3fJua6IOvZ48H7sDrwc/H8l8BAgMY+LPdfAqOf5C/B88J79ivUSnhNz/i7B49oC\no4LPwurgvu2Dz0de8PvnA1OBw2Ke42jgTewPaGHwWTi2lN919+C1/y54vqXBOf8UFUfsZ6Nt2N/h\nunDD66mE11PY9zov6udK1TPAhNLiibpfgH7A/4J4fgAeA3aMOf8yYDLQAasLfgX6BvedCrwD/BS8\nxkuAf8Y8fhvgH8AXQZxfAw8C25TxXnwYvL5rgFlA++C+PDavsyLE1NN+q3k3vA7xOsTrkKTc6tpI\n1HLgGBE5SFU/La+giNwO3A08jQ2D74oNg88SkcNV9eeg3NXAo9iH6mFs+tPL2If3m1KeegBWKdyP\nfXmvBYqwD96OWKVzDHYhuxS4N96YsBGEJsAbwItB+YuBB0RkoapOwSrZgcHzjca+cADviUg6doGe\nDjyCfYn3AM4OYtysZyvmdeuGfeHfBYYC+2Jf9DXYl7Sk3HbBa7Zv8Potwyrdx0Wksao+GvPUnbCG\nxGPB73cL8IKI7KvWI1SazlhD4UNsSgPYH4B4KDbtdQr2R+MGoD1WUX6JvXargF5BbC8GN7DKHRE5\nCHs9vsXe90LgUuBlEblQVV+JOecorKH2D2yaIMF5LsReq8XAztgfsFZY4xMRORl4HfvDcxf2meoK\nzBCR41V1XlBuN6zS3SF43s+w9/fi4Hyzsff9WuzztySIYXGcr53bOl5PJbieovSpv1BxPfMY1gHR\nPigb26M8BrgCuzAcDrQIXrvDROS4qLpKsalAk4LfawzwmYgcCPwb+07fCWzAXv9jS04gIhKUOTZ4\n7BJs2lZ/YH+snigpOwh7r+YEz/c71tFyMjANuA4YEbxW9wa/T345r5urGbwO8TrE65BkCLsVl8wb\n9qH9HfsizwEewFrsf4opt3dQ5paY4wcGj781+Dkdu4B+H0iLKvd3YlrjbOoN+QSoF3U8B+uReDXm\nXHPYfFSlUjEFx94OnrNj1LF04Hvg2ahjbYgZeQmOHxocvyDO1/dPWCU0L/o1BbqV8npcF8R4edSx\nesHvXQA0DI6V9O6sBHaIKntO8PgzK4jpF8oZfYopW9pI1ITgPLfFlJ0PzI36eWdiRp+i7psGfFTK\n5+xdYEnUzyUjQDMJRrmi7vsJeKSC+D8DXos5ti3WcHwz6tgTwWfp8HKe6yJ89CmUG15PJbSeCh47\nISbuStcz2IVkcSnPeXzwHJfFHD81OB5d1+UFz9s+pmxJvbhTObF3Dl7jv8Uc7xE89pjg55bARuC5\nCl6L/1KHeo7rws3rEK9DvA5Jzq1OJZZQ1WnA34BXgL8CN2EjDN+JyDlRRS/CWtPPicjOJTfsy/EF\ncFJQ7kjs4nmsqkZnaZmEXfSW5gndfOTkw+Df8THlPgT2EpGS96iyMZVYp6qTon73ImxYed8y4opW\nEPx7uojUr0T5EkcATYHHVHVj1PEnop6zxBnAD6r6dFSMxVhv0PZYRRztad3U+wTWmyRU7vepDqNj\nfn6nMucWkZ2w9+Y5oHHMezcV2D8YGSqh2OcptodrLXB0TNno8xyG9SDlxpyjETAdmyJY0gN1HjBZ\nVT+qKH6XfF5PJbyeKk9V6pmLse/p9Jjf/SNgHVv+7nnBex1tbfDvBcF3tazzLAY+jznP20GsJee5\nIPj57krE7moRr0O8DsHrkKSoa9P5UNX5wMUi8iesF+ICbAjzORE5TFWXYEOfadh0rS2eAusNAesx\nUWKmiKlqsYgsKyOE2GHvgnKOpwGNsUqqsjGV+LaUcj9hQ7blUtVlIjIEm7LWWUTewabkPRVTOcRq\nHsSyWYyqulFElpZS9otSnmMx9qVtHnN8s9dHVdcG9cNOFfw61eE3VV0dc+ynSp57P+z3uYeo6QpR\nFGt4rog6tqyUcjdjc7C/EZH52LS9iaqaF9y/f/DvxDLiiIhIY2xkageg3CkeLlxeTyW0nipPVeqZ\n/bEpQCtLCxf7nkfLK6XcM9jI/VhsStJ0bJrS81EdK/tj03hWVXCefbHea5+GWwd5HeJ1CF6HJFyd\na0SVCEZK5gPzReQLbGj2EuxiNw374JxO6fsArKvCqctav1PW8ZKehHhjquj5yqWqN4nI49ioRQds\nhOhWETlGVb+vzHNUsyr9Pgk6d2WU9K4NxnoCSxP7x+LX2AKq+pyIzMb+EHYAbgRuEZEL1OZ9l5zn\nBmwaRWnWYY0oV0N4PVW+BNRTVYknDVsL0LGM8rEXLKV9z38D2orIScBZ2Ot4GdYz3SG4CErDps/0\nL+M8pa1PcXWU1yHl8zrE65CqqLONqBjzgn9Lpkp9hX2wlqlqab0hJZYH5fbDFlsCICL1sEWXZV3M\nbo3KxhSP2Cljm99pC1I/Be4TkWOA97AECmXtb1DyeuyPresBIOgJa0GQACGqbGk9Ra2i7q8O5f6O\n1ais85SMwBWp6owqnUA1H1uU+phYmtqPsFS2U9jUQ/hLeecRkVVYpqSDKzpdVWJ1CeH1VGl3xl9P\nJSqer4BTgPdUdUOVTqD6Nja15kYRGYCNYp8EzAjO89egTHm+wi6WDiRIclPW6aoSq6tRvA4p7U6v\nQ8ridUgF6tSaKBFpV8ZdZwX/lmQhexHrARlUxvM0Cf47D0u92T1qPi/Yor3qnmZW2ZjiURj8u2PM\nczUKKsdonwbnL28kYx5Bprqg4VSia+w5sOlozUTksqjz1sOy0PxCVEVdRYWlnDsRSvZy2uxcqroK\na1D2FJFmsQ+SSuzZISJpIrJDzPP+iC2eLXk/5mMV3o0i0rCs8wS9UC8D54hI63JOW4j9IUvGa+ei\neD21hequp6qqMDj/DjHHn8U6Jre48BKResF02nIFayhjfYJ9F0t+p2eBPUWkeymP305ESjJ6voxd\n3AwsZ20EJK+OdEnidcgWvA7xOiQh6tpI1KPBh+MlrBLZBjgOSze9FFtzgqouFZE7sF6JFmzaH2hf\n4HwsycDDqlokIndhw79vi8izWK9MV2yKVmVb5xUO81Y2pkqer8RX2CLEXiKyDvsifIjNnx4hIs8B\nn2OfkyuwLC0vlBPjxiDGx7DX4xlsBKorW6YWHwP0xFKaH8GmFOd/A65T1UKqx3ygvYj0xxodeao6\nt5qe+w+q+puILAIuC6ZMrAH+F/Rw9cYWl/5XRMZin7UM7HfdAzg86qlK+yw0Ar4VkeexynAdlq3n\nCGwuN6qqIpKFNU4/FZEJ2B5Qe2C9TwXYdAWA24LHzxaRMdh8592xxabHBXPBP8amJdwiIjtiaVKn\nB403l1heT22uWuupajAfey0eFZEpWJatZ1R1toiMxqYCHYYljikC/ox9t/qyafuDsgwUkbbAa1jv\nfwZwNbY9xLtBmSexz8K/gik7c7DMpq2wOrQDsEBVvxKRfwJ3AO+IyIvY9/hI4DtVvT3q9+klllb6\nS2BlJXqoXWrzOmRzXod4HZIY5aXuq2037IMxFutpKMDmk36G7We0Synlz8dGRH4Obp9iefv3iynX\nG6uY1mNfzGOxfXheiypzInZRemHMY7sEx1vHHB8UHG8Sb0zYEO4npfw+E4CvYo6djc2N3RCc7wos\nqcNYrFIpxEaXpgHtKvk692TTZrsfYpX3DGI2/wN2AbKxOcAlm+3+PaZM8yCu/qWcpxi4s4JY/hy8\nHuuC8hVttvvHJnxRr1lBKWUHARtjjh2NZQX6NXie6M129wmeq2Rz26+xzEkXRJUp67OQjqWoXYD9\nIfg5+H+PUuL6K5YJcGXw+i/FNg5sF1NuzyCeH4JyXwSfo+jU9FcFx3/H050n7YbXUwmvp2LPQRz1\nDDaDY1jw3dlITKpibFH3XKzOWYvVa/cBGVFllgKvlHKudthF0jds2vjzSaBlTLl62LrIhcH7+WNw\nztuB7Ut57+ZFlZsBnBx1f1NsMf3a4Hetk6mKa9PN6xCvQ7wOSc5NghfAVaNg2HMV8IKq9gw7Huec\ni+X1lHOuKrwOcXVdQtdEicggEYnE3BZV8Jh2IjJfRH4Tkc9FpEsiY6wqESlt3mwXbBftujGc6VwK\n2Zp6p7bzesq5+InI7iLypIj8KCLrReSTCtaS1lpehzi3pWSsifoflm2kZC7sxrIKisg+wKvAKCzF\nY3sgW0S+V9W3EhvmVjtGRIZiU6hWYztjX4UNkT4fZmDO1WGVrnfqCK+nnItDsBZ0DrZZ+WnYNKb9\nKXtz2drO6xDnYiSjEbVRLUNZZVwNLFXVm4OfPxOR47Fc9qnaiFqGrW+5FuuRWYMt2hygtj+Dcy75\n4ql36oJleD3lXDxuBb5W1ayoY9W19UZNtAyvQ5zbTDIaUfuLSMli+vexL1xZG3kdgy3qizYFWwyZ\nklR1ObYA0jmXOuKpd2o9r6eci9s5wJtBJroTsaRAo1Q1O9ywwuF1iHNbSnQj6gPgSiwrzG7AXVha\n5YO19BTWzbBMbdHygR1EZFstZfMxEdkZG2pfhl0wOefCsx2WiXCKqq4OKYZ46x2vR5xLLalQj+yL\nzY4ZAvwTOAp4REQ2qOqTsYW9DnEupSSlDkloI0pVp0T9+D8RmYsNh1+KpYesDqcBOdX0XM656tEJ\nmBTGibey3vF6xLnUE1o9giXemquqdwY/fyIiBwO9sJTRsbwOcS71JLQOSepmu6paICKfA/uVUeQH\nbGOwaBnAz6WNQgWWATz11FO0atWqWuKsjP79+zN0aPJmGSb7fGGc03/Hmn/OxYsX07lzZwi+l6mg\nEvUOhFSPVEYYn5nK8Lji43FVXorUIyuwjcijLQYuLKP8MvA6JB4eV3w8rspLVh2S1EaUiGyPXchM\nLKPI+8AZMcc6BMfL8htAq1ataN06eZlHGzduXKvPF8Y5/XesPeckhaazVKLegZDqkcoI6f2rkMcV\nH49rq4RZj8wB/hJz7C+UnVzC65A4eVzx8bi2SkLrkETvE/WQiLQVkeYicizwElAE5Ab33yciT0Q9\n5DFgXxF5UET+IiLXABcDDycyTudc7VFRveOcc5UwFEvrPUBEWopIRyALGBFyXM65FJHokag9sbmI\nO2O7Wr8LHBO1yGs3YK+Swqq6TETOwiqvvsC3QDdVjc3Y55xzZamo3nHOuXKp6jwRuQB4ALgTyAOu\nU9Wnw43MOZcqEp1YIrOC+7uWcmw2tombc87FraJ6xznnKkNVXwdeDzsO51xqSuh0vtosMzO512nJ\nPl8Y5/Tfsfac01WfVH3/PK74eFwuLKn6Hntc8fG4Uo+oatgxVImItAbmz58/P5UXtjlXJyxYsIA2\nbdoAtFHVBWHHU1lejziXOmpiPeJ1iHOpI1l1iI9EOeecc84551wcvBHlnHPOOeecc3HwRpRzzjnn\nnHPOxcEbUc4555xzzjkXB29EOeecc84551wcvBHlnHPOOeecc3HwRpRzzjnnnHPOxcEbUc4555xz\nzjkXB29EOeecc84551wcvBHlnHPOOeecc3FIWiNKRG4VkYiIPFxOmRODMtG3YhFpmqw4nXPOOeec\nc648f0rGSUTkSKAH8EkliivwZ+CXPw6orkxQaK4UeXl55OTkkJ+fT0ZGBp06daJFixZhh+Wcc845\n51xKSHgjSkS2B54CsoA7K/mwVar6c+KicqUpKiqid+8+ZGePJS2tEWlpzYlEljNw4ECysrozcuQI\n0tPTww7TOeecc865UCVjOt9I4N+qOqOS5QX4WES+F5GpInJsAmNzUawBNQHV4RQXr6CoaCHFxd+j\nOozs7An07t0n7BCdc84555wLXUIbUSJyOXAYMKCSD1kB9AQuAi4EvgFmishhiYnQlVi6dCnZ2WNR\nHQJcCzQI7mkI9EV1MNnZY8nLywsvSOecc84551JAwhpRIrInMAzopKpFlXmMqn6uqmNV9SNV/UBV\nuwHvAf0TFaczkyZNIi2tEdCtjBJZpKU1IicnJ5lhOeecc845l3ISuSaqDbArsEBEJDhWD2grIn2A\nbVVVK/E8c4HjKirUv39/GjduvNmxzMxMMjMz44u6jsrPzyctrTnFxQ3KKNGAtLS9yc/PT2pcLnXl\n5uaSm5u72bGCgoKQonHOOeecS55ENqKmAYfEHHscWAw8UMkGFNh0wBUVFRo6dCitW7eOK0C3SUZG\nBpHIcmA9m6byRSskEllORkZGkiNzqaq0TooFCxbQpk2bkCJyzjnnnEuOhE3nU9VCVV0UfQMKgdWq\nuhhARO4TkSdKHiMi14nIuSLSUkQOEpFhwEnAiETF6UzHjh2JRH4BxpVRYhyRyDo6deqUzLCcc845\n55xLOUnbbDcQO/q0G7BX1M/bAEOAhcBMbCTrFFWdmYzg6rJ9992XrKzuiNwAPAL8GtzzK/AIIjeS\nldXd94tyzjnnnHN1XlI22y2hqifH/Nw15ueHgIeSGZPbZORIG/DLzu6HyPNEIrNJS+uA6pw/9oly\nzjnnnHOurkv2SJRLYenp6YwZM5qvvvqKnj2vAKBXryv56quvGDNmtG+065xzzjnnHN6IcqVo0aIF\nWVlZAHTr1s2n8LkaTURuFZGIiDwcdizOuZpBRAYF9Ub0bVHYcTnnUkdSp/M551wyiciRQA/gk7Bj\nqS3y8vLIyckhPz+fjIwMOnXq5B0tNZC/j5XyP+AUoGSblo0hxuJcSpk9ezZ33303K1eupGnTpgwc\nOJC2bduGHVZSeSPKOVcricj2wFNAFnBnyOHUeEVFRfTu3Yfs7LGkpTUiLa05kchyBg4c+MeaSZ/y\nm/qKioro07s3Y7OzaZSWRvO0NJZHIgwcOJDuWVmMGDnS38dNNqrqqrCDcC6VrF+/njZt2rBkyRKg\nIbAn8AHTp5/IAQccwPz582nQoKw9R2sXn87nnKutRgL/VtUZYQdSG1gDagKqwykuXkFR0UKKi79H\ndRjZ2RPo3btP2CG6SujTuzcTsrMZrsqK4mIWFhXxfXExw1SZkJ1Nn969ww4xlewvIt+JyFci8pSI\n7FXxQ5yr3awB9QWWyXklsATIB4azZMkXdWqvSG9EOedqHRG5HNuoe0DYsdQGS5cuJTt7LKpDgGvZ\ntCF3Q6AvqoPJzh5LXl5eeEG6Ci1dupSx2dkMUS3lXYTBqozNzvb30XwAXAmcBvQCWgCzRaRhmEE5\nF6aZM2cGI1BDKflbsCv5bKpFHmbJkiXMnj07zDCTxhtRzrlaRUT2BIYBnVS1KOx4aoNJkyaRltYI\n6FZGiSzS0hqRk5OTzLBcnCZNmkSjtLRy3kVolJbm7yOgqlNU9QVV/Z+qvgWcCewEXBpyaM6F5t57\n78UaTN0A5Rwm8zvbsgsrgxJZQEPuvvvu0GJMJl8T5ZyrbdoAuwILRKRkQXg9oK2I9AG2VdXYjb8B\n6N+/P40bN97sWGZmJpmZmYmMN+Xl5+eTltac4uKy5rk3IC1tb/Lz85Mal4tPfn4+zdPSaFBcXOr9\nDYC909KS+j7m5uaSm5u72bGCgoKknb+yVLVARD4H9iuvnNchrjZbuXIlsCdpbMtt3MND3EwrFvMx\nhwclGgB7BOWSI8w6xBtRzrnaZhpwSMyxx4HFwANlNaAAhg4dSuvWrRMYWs2UkZFBJLIcWM+mSWDR\nColElpORkZHkyFw8MjIy2Ke4GGVTurlohcDySCSp72NpDYwFCxak3LqKIFHNfsDE8sp5HeJqs6ZN\nm5LO+4zj7/wfA6jPr1ENKLBa5FuaNv1b0mIKsw7x6XzOuVpFVQtVdVH0DavZV6vq4rDjq4k6duxI\nJPILMK6MEoUUF9enU6dOyQzLxSlr5515LhJheRn3jwPWRSL+PgIi8pCItBWR5iJyLPASUATkVvBQ\n52qtgTfcwGTW8z7HsogDWctOMSXGAesZOHBgGOElnTeinHN1QZmjT65i++67L1lZ3RG5AcvItD64\npxDIAYpp3PgT6tXzfYZS1vjxNOvTh09atuQgtnwXHwFuFKF7VpbvF2X2BCZhqceeBlYBx6jq6lCj\nci4sP/1E23vuYZ2cw7/oQ4TZbFmLXM8BBxxQZ/aL8kaUc67WU9WTVfX6sOOoyUaOHEFWVldE+lGv\n3m6kpx9CvXq7IfJ3LrtsBE2aZHDccbBkSdiRui0MGQLdukHPnhz+v//RuXt3+omwW716HJKezm71\n6tFPhK7BPlEOVDVTVfdU1fqqureqdlRVT1vo6qYVK+DEE1mxpICrd3iB7befAZwMNAX+Evx7HQcc\nsD/z588PNdRk8jVRzjnnKpSens6YMaMZMOBWcnJyyM/Pp1mzZnTs2JEWLVrw/fdw2mlwwgnwxhtw\nxBFhR+xQhTvugPvus3/vvpt0EUaPGcOtAwaU+j4659xmli6FU08l8tvvdGm1mPS8dBYvPJlFi2Zx\n9913s3LlSjIyjuXOO++sMyNQJZLWiBKRW4H7gGHl9QiLSDtgCHAQ8DXwT1V9IilBOleL5OXl/XGR\nlJGRQadOnfwiyVVZixYtuOOOO7Y4vvvuMGsWnHUWnHQSTJ5s/7qQFBdD794wejQ8/DD077/Z3WW9\nj84594f//td6x7bfnoevXMhb923PW2/BLrtA27ZtmTZtWtgRhiop0/lE5EigB/BJBeX2AV4FpgOH\nAsOBbBE5NcEhOldrFBUV0bNHD1q2bMlDd93FrNGjeeiuu2jZsiU9e/SgqMi3TnKJ0aQJTJsGxx4L\nZ5wBr7wSdkR11O+/Q6dOMHYsTJiwRQPKOecq9P770LYtZGQwf+QH3PbQTtx0E7RvH3ZgqSPhjagg\nLehT2A5caysofjWwVFVvVtXPVHUk8DzgfwGcq6Q+vXszITub4aqsKC5mYVER3xcXM0yVCdnZ9Ond\nO+wQXS3WsKGNQp17Llx0ETzh8wiSq7DQXvyXXoIXXoArrww7IudcTTN1qrWWDjmEda/OJLN3Ew45\nBO69N+zAUksyRqJGAv9W1RmVKHsMtsdLtClA8hLOO1eDLV26lLHZ2QxR5Vo27ejTEOgLDFZlbHY2\neXm+PtolzrbbQm4uXHWVXcMPHRp2RHXETz/BqafCnDm2MO3888OOyDlX0zz7LJx9Npx8MkyZQr9B\njfnuO6vTt9km7OBSS0IbUSJyOXAYMKCSD2kGxG6Vng/sICLbVmdsztVGkyZNolFaGt3KuD8LaJSW\nRk5OTjLDcnVQvXq2HOfWW+H66y2vQdnbHLsqC7Jn8fnnMGOGXQA551w8xoyByy+HSy+FF1/kuVfr\nM24cPPoo/PnPYQeXehKWWEJE9gSGAe1VNeGLMPr370/jxo03O1baLsbO1Wb5+fk0T0ujQXFxqfc3\nAPZOSyM/P7avIn65ubnk5m6+72RBQUGVn9fVHiJw//22Vurmm2HNGhgxAtJ8c43qFWTPYsMGeOcd\naNUq7IicczWJKjz4IAwYANdeC8OG8fW3afToAZdcAl27hh1gakpkdr42wK7AAhGR4Fg9oK2I9AG2\nVd2iX/IHICPmWAbws6puKO9kQ4cOpXXr1tUQtnM1V0ZGBj8UF7OR0r/chcDySISMjNivWfxK66RY\nsGABbdq0qfJzu9rlpptgp52gZ0+bcfbEEz4tpNpEZc9izhxo3jzsiJxzNYmq9XINHgyDBsGgQRRH\nhM6doVEjm1Hwx1W820wi+wOnAYdg0/kODW7zsCQTh5bSgAJ4Hzgl5liH4LhzrgJ/b9+eVyKRMu8f\nB6yLROjUqVPygnIOyMqyqfYvvmhLddavr/gxrgJR2bN4911vQDnn4rNxo1XOgwfD8OFw110gwv33\nW59MTo51gLnSJawRpaqFqroo+oZ1hK9W1cUAInKfiETnbnoM2FdEHhSRv4jINcDFwMOJitO5WmP+\nfJpffDEHNGjACcAjQMl1amHw840idM/K8v2iXCguugheew1mz4YOHWBtRflaXdmismcxcyY0bRp2\nRM65mmTDBrjsMpsa8OST0LcvYH0zd90Ft99um6e7siV7Znrs6NNuwF5/3Km6DDgLaA98jKU276aq\ndXs3L+cq8swzVtvtsQfbL1rEX7t3p58Iu9WrxyHp6exWrx79ROialcWIkSPDjtbVYe3bw/TpsHgx\ntGsHP/zWwfuPAAAgAElEQVQQdkQ10HPPbZY9i5j1wM45V65ffrGd0V9/3bZD6NwZgIIC6NgRjjoK\nBg4MOcYaIJFroragqifH/LzFUjVVnY2tp3LOVSQSsTnM9977x+aa6fXrM3rMGG4dMICcnBzy8/Np\n1qwZHTt29BEolxKOPnrTaNTxx8Nbb4F/NCtp7FhbXNapE4wfD+npYUfknKtJVq+GM8+EJUusE6Zt\n2z/u6t3b7p4xA/6U1BZCzeQvkXM11bp1cMUV8PLL8MADtjA0avVnixYtuOOOO0IM0LmyHXSQzbk/\n9VRrSE2dasdcOR580HLGB9mzPM2hcy4u331nvVerVsHbb0NUQrannrI1UDk53qlVWV4DO1cTLVsG\nxx1nXfivvAK33OLpc1yNs88+lg9h112tM/TDD8OOKEWVZM+69VZbrDB8uDegnHPx+eILu25Yt84q\n3qgG1FdfwTXXwN//btP5XOV4LexcTfPOO3DkkVYRfvABnHNO2BE5t9UyMiwvQqtWcMopMM1XwG6u\nuBi6d4eHHoJHHrHpu95h4pyLx8cf25B//frWgIraObeoyGYH77qr7ePnKs8bUc7VJNnZdqV58MEw\nd67Pf3K1wo472nS+tm1trfMLL4QdUYrYsAEuvRQef9yyZ117bdgROedqmnfftSw+e+9tnbB77bXZ\n3f/4B8ybB5MmwQ47hBNiTeWNKOdqgo0b4brrrEc6K8uuOHfeOeyonKs2DRrY8r6LLrJ2Q3Z22BGF\nrIzsWc45V2mvv25roFq3tmwRu+yy2d2zZsF998Hdd1vCHxcfTyzhXKr76Sfby2HGDBg1Cq6+OuyI\nnEuIbbaxxc077WT9BWvW2FKgOqec7FnOOVcpkyZBly7WGfP007DddpvdvWaN9c2ceKItq3bx80aU\nc6lsyRI491y7qHrrLTjppLAjci6h0tJsXn6TJvaHfc0auP/+OrQMqJzsWc45VykjR9r03y5dbFuE\nmHzlqtZRVVhoM4Xr1QspzhrOG1HOpao334TLL4c99rD1Ty1bhh2Rc0khAvfcYzNW+/e3htS//lUH\n/tB/8YXlfFfdYvG3c85VSNX2jRw40CrPwYNLzeQ5bhy8+KKtP91zzxDirCV8TZRzqUYVHn7YhuBP\nOAHef98bUK5O6tfPciqMHw+ZmZZnodYqJ3uWc85VKBKxhtPAgdaQGjKk1AbUkiW2xLpHD7jwwhDi\nrEW8EeVcKtmwAa66Cm64AW66yVbae7ocV4d16WK9pZMnWzb/devCjigBKsie5Zxz5dq4Ebp2tW0Q\nRo2C228vdQ70hg3WIbX33tZX66rGG1HOpYr8fDj5ZMjNtUnKDzxQB+YvOVex886z2a0ffGCz3das\nCTuialRB9iznnCvXb79ZWtNJkyAnp9zkU7fdBosWWdGGDZMYYy3ljSjnUsFHH9kGukuXWs5RT2fs\n3GbatbM8C19+admkvv8+7IiqQW6utRA7dLDGVKNGYUfknKtJfv4ZzjjDEk9NnmzDTGWYMsVGnx54\nAA4/PIkx1mIJbUSJSC8R+URECoLbeyJyejnlTxSRSMytWESaJjJO50L1/PO2FqJpU/jPf3yzhiqK\nt95xNUebNjbbbe1a+8p89VXYEVXBqFHQqZN1mDz//Bbph11qEZFbg2sSnwTlUsOqVTZ75aOPrBF1\nxhllFl250qZGn3aarYdy1SPRI1HfALcArYE2wAzgFRFpVc5jFNgfaBbcdlPVlQmO07nki0Tgrrvg\nkkssjfk773ianOqxNfWOqyEOOADmzIH0dGtILVwYdkRxKsme1bu3Zc4YN26L9MMutYjIkUAP4JOw\nY3EOgG++scRT335rs1eOO67Moqq2XCoSsUQ9peSacFspoS+lqr6mqm+q6leq+qWq3gGsA46p4KGr\nVHVlyS2RMToXisJCuPRS+Mc/4J//tAnK9euHHVWtUIV6x9UQJfkXdt/dpva9917YEVVSJALXXw93\n3mnf+zKyZ7nUISLbA08BWcDakMNxDj77zBpNGzZYUppDDy23+IgRNlv48cehWbPkhFhXJK32FpE0\nEbkcaAC8X15R4GMR+V5EporIscmJ0Lkk+fpr60J/803LvnfbbXVoJ9HkiqPecTVM06a2RurQQ6F9\ne/s6pbSNGy3z5vDhNpXPv/c1xUjg36o6I+xAnGPBArt+2GEHa0Dtt1+5xRcutES/ffvCmWcmKcY6\nJOGNKBE5WER+ATYAo4ALVHVJGcVXAD2Bi4ALsWk5M0XksETH6VxSzJljCSTWrrX9n847L+yIaqU4\n6x1XQ+2wA7zxhjWizj0Xnnkm7IjKUJI9KyfHRp3LyZ7lUkfQAXMYMCDsWJxj1izLsNOyJcyeDXvs\nUW7xX3+1PBN//jM8+GByQqxrkjERewlwKNAYuBiYKCJtS7ugUdXPgc+jDn0gIi2B/kCXJMTqXOJM\nmAA9e8Lf/mYLyXfdNeyIarNK1zuuZqtf3/aR6tbNLhh++gl69Qo7qig//2ydJR9+aNmzyln87VKH\niOwJDAPaq2pR2PG4Om7yZFsCcMIJ8NJLsP32FT7kxhst4e+8eZ63JlES3ohS1Y3A0uDHj0TkKOA6\noLJdcXOBslfMBfr370/jxo03O5aZmUlmOekenUuKjRvh5pth6FDo3t0mKG+zTdhRVVlubi65ubmb\nHSsoKAgpms1tbb3j9UjNlJ5u8/132skGedasgQEDUmC23KpV1mj68kvLnlXO4u+6KoXrkTbArsAC\nkT8+SfWAtiLSB9hWVTX2QV6HuGo3caJNBT7/fBvN3nbbCh8yebLNGh41Cg46KAkxhijUOkRVk3oD\npgPj4yg/FXi+nPtbAzp//nx11Wf+fFWwf10V/PST6mmnqdarp/rII6qRSNgRJdT8+fMVy7DZWpNc\nt5R3q6je8XqkdohEVP/xD6u7rr8+5K/b11+r/uUvqhkZqh9/HGIgNU8q1CNAQ+DAmNtc4AmgVSnl\nvQ5x1W/YMKvQunVT3bixUg/57jvVnXdWPffcWn/JUaZk1SEJHYkSkfuAN4CvgUZAJ+BEoENw//3A\n7qraJfj5OiAP+BTYDugOnAScmsg4nUuIzz+3hRorV9qq9/btw46oTqio3nG1lwgMHAhNmsC119rU\nvjFjQsgg/tlncOqpUK9epRZ/u9SjqoXAouhjIlIIrFbVxeFE5eoMVRg0CO65x2ayPPBApYbWIxG4\n4gqb7DJuXAqMxtdyif7T0hTrtdkNKAAWAh10U5abZsBeUeW3AYYAuwPrg/KnqOrsBMfpXPWaOhUu\nu8zyiX74Iey/f9gR1SUV1TuuluvTx6b2deliDanc3CSuCViwwHa0zMiAKVMqXPztapQtpu85V+0i\nEUunN3KkNZ5uuaXSDx0yBGbMsNnDu+ySwBgdkOBGlKpmVXB/15ifHwIeSmRMziWUKjzyiO0Fc9pp\ndvUWMz/eJVZF9Y6rGzp1gh13hIsvhrPOst0EGjVK8ElnzYJzzoEDD7SNWZo0SfAJXTKp6slhx+Bq\nuaIiuPJKu3YYM8bWUVfSvHm2c8JNN8EppyQuRLeJ7/LnXHX5/Xer8Pr1s0bUv//tDSjnQnTWWTYo\nPG+eXVT8+GMCTzZ5snWcHH00TJvmDSjnXHzWr4cLLoDnnoNnn42rAbVuHXTsaPvm3XNPAmN0m/FG\nlHPVYeVKu0p78klLE/bQQ7YewjkXqhNOgJkzYflyaNsWvv02ASd58km48EI4+2x49dVKpR92zrk/\nrF1rnTAzZ8Jrr9kQehyuuw6+/94GsGpB8t8awxtRzlXVJ5/AUUfBF19YBdjFtzRzLpUcfrjld1i/\n3rKMf/55xY+ptOHDbSX3lVfabr+VSD/snHN/yM+Hk06CTz+1UexT48ul9uyzMH687Z7iy6+TyxtR\nzlXFSy/ZVVmTJvCf/9hGus65lLP//taQatgQjj8ePvqoik9Ykj2rXz/LnjV2rI8+O+fis2yZVUj5\n+TB7NhxzTFwPX74cevSwPFbef5t83ohybmuo2sTjCy+EM8+Ed96Bvfaq+HHOudDsuaddp+yzD7Rr\nZ1/brVKSPevuu+HBB+3muYSdc/FYtMgaUKowZw4cfHBcDy8uhs6dben1Y495FRQGb0Q5F6/16+Hy\ny21Dmrvvtik8DRuGHZVzrhJ22QWmT4cjjoAOHWz5QVyKiuDvf4dRo2z06eabExKnc64WmzvXFmzu\nvLMNkbdoEfdT3HcfvPce5ORYJlKXfN6Ici4e335rFd+rr8Lzz8Odd3r3j3M1TKNG1ng64ww47zy7\nCKmU6OxZzzwDWZ5N3zkXp+nT4eST4YADbB11s2ZxP8V778E//mGXIMcfX/0husrxRpRzlfXBB9Z9\n/eOPNvR+0UVhR+Sc20rbbWcLsq+4wqbEPPpoBQ+oYvYs55zjpZdsCcAJJ9j+CzvtFPdTFBTYPnhH\nHw133JGAGF2lJXSzXedqjYkTbc+GI4+EF1+Epk3Djsg5V0V/+hOMG2d5Yfr2hTVrbJbuFoPL+flw\n+um2invatLgXfzvnHOPH23XEJZfYNcVW5CJXhV69rK56+22rw1x4/OV3rjzFxTBggO37dNVVtg7C\nUxg7V2uI2Nd7553httvs4mToUEgrmaexbJmlHC4stKwUcS7+ds45Bg+Gm26yFtCIEVudyfPJJ+Hp\np20/qH32qd4QXfy8EeVcWQoKbAvwN9+EYcOsq9rXPzlX64hYX8lOO8E111hDavx4SP9ikWWf2G47\nm8K7FYu/nXN1mCrcfjvcf7/9e889W30d8eWX0Lu3pTK//PJqjtNtFW9EOVeaL7+Ec8+1LcBff93W\nQjjnarVevawh1bkzFCz/iWf+dyr199oFpkzZqsXfzrk6rLjYWj2jR8OQIXD99Vv9VEVF1qebkVGJ\n9ZsuabwR5Vys6dNtzvKuu8KHH8Jf/hJ2RM65JLnsMmi89CMuuu3PnL7Dq0yevA+Nm8W/+Ns5V4f9\n/rtthfD88zas3bVrlZ5u0CDbIHzOHMsu6lJDQrPziUgvEflERAqC23sicnoFj2knIvNF5DcR+VxE\nfA/mJMvLyyM7OxuA7Oxs8vLyQo4oSVRh5EgbdTrySMvG5w0o5+qWl17i9LuO4a2j72Rh2mGcdMFO\nrFwZdlDOuRqjsNBmsrz8sjWiqtiAevtteOABmwl41FHVFKOrFolOcf4NcAvQGmgDzABeEZFWpRUW\nkX2AV4HpwKHAcCBbRE5NcJwOKCoqokePnrRs2ZLRoycCMHr0RFq2bEmPHj0pKioKOcIE+v13uPpq\n6NPH1j699tpWpR51ztVg48db6vILLuDY2Q8wa5awYoVlI/7667CDc86lvJ9+skQ0c+bAG2/YvnJV\nsHq1DWi1a2d5KVxqSWgjSlVfU9U3VfUrVf1SVe8A1gFl5Ye9Gliqqjer6meqOhJ4HuifyDid6d27\nD9nZE1AdTiQyBYBIZAqqw8jOnkDv3n1CjjBBfvzRFo+PH2/5jh9+2POGOlfXDBkC3bpBjx62++42\n2/DXv8K779p6hOOOgyVLwg7SOZeyVqyAE0+Ezz+HGTNsQ90qULWM6L/+ahnRtzKhn0ugpG22KyJp\nInI50AB4v4xixwDTYo5NAf6WyNgcLF26lOzssagOAa4F6gf31Af6ojqY7OyxtW9q33//a1P3Fi2y\nSu+qq8KOyDmXTKqW2/zGGy171qhRm12ttGxpDakdd7QRqXnzQozVOZeali6F44+31J7vvGPXFVU0\ndqztzZudDXvuWQ0xumqX8EaUiBwsIr8AG4BRwAWqWlZ/XjMgP+ZYPrCDiPjmPAk0adIk0tIaAd3K\nKJFFWlojcnJykhlWYr3yChx7LDRuDP/5j1WAzrm6o7jYpvHef7+NRN17b6nph3ffHWbNgv32g5NO\nsjUKzjkHWGfs8cdb58ucOdCq1BUrcVm8GPr1g549qzwj0CVQMuYsLcHWNzUGLgYmikjbchpSW6V/\n//40btx4s2OZmZlkZmZW52lqrfz8fNLSmlNc3KCMEg1IS9ub/PzYNm4NpGqrNG+/3WqnJ56A7bcP\nO6oaJzc3l9zc3M2OFRQUhBSNc3GKM3tWkyYwbRpceCGccQY88wycd16SYnXOpab334czz7Sdb6dM\ngaZNq/yUGzZAZiY0b26rC1zqSngjSlU3AkuDHz8SkaOA67D1T7F+ADJijmUAP6vqhvLOM3ToUFq3\nbl3VcOusjIwMIpHlwHpsxmWsQiKR5WRkxL49Ncyvv9q6h9xcyxk6cCCkJW1Wa61SWifFggULaNOm\nTUgROVdJhYVw0UU2pPT885Xu6m3YECZPtrbXRRfZEsounj/Wubpp6lSrO9q0gX//22a1VIMBA2wk\n6sMPoUFZ/douJYRx9ZgGlDU1733glJhjHSh7DZWrJh07diQS+QUYV0aJcUQi6+jUqVMyw6pe330H\nbdta2tFnn4W77vIGlHN1TRWzZ227rfXBXHUVXHklDB2amDCdcynsuefg7LMtecSUKdXWgHrzTatT\nHnwQDjusWp7SJVBCR6JE5D7gDeBroBHQCTgRaxghIvcDu6tqSV/eY0BvEXkQGI81qC4GzkxknA72\n3XdfsrK6k519A6oKZGEjUoXAOERuJCurOy1atAg30K01dy6cf77NWX73XfBRS+fqnhUrbB+477+3\nRDJbufi7Xj0YPRp23hmuv97SEN9zT6nLqZxztc2YMdCrF3TsCBMmQHp6tTxtfr6NbJ9xBlx3XbU8\npUuwRE/nawo8AewGFAALgQ6qOiO4vxmwV0lhVV0mImcBQ4G+wLdAN1WNzdjnEmDkyBEAZGf3Iy3t\nTtLS9iYSWU4kso6srO5/3F/j5OTYFL7WreHFF6FZs7Ajcs4l29KlNgK1YYNlz6ri4m8Ry0fRpAnc\nfLMl5Roxwge3nau1VG2IaMAAuPZaGDas2r7wqpuWZU6Y4B0yNUVCG1GqmlXB/Vus5FXV2djGvC7J\n0tPTGTNmNAMG3EpOTg75+fk0a9aMjh071swRqEjEkkc88IB174webXNxnHN1y3//ayNQ229v0/ia\nN6+2p77pJtuXu2dPmyn4xBOwzTbV9vTOuVSgar0lgwfbeupBg6q1pfPooza7+I03oKYvPa9LfEdR\nt4UWLVpwxx13hB1G1fz8M3TuDK+9ZpXe9dd7145zdVECsmfFysqyhlTHjlBQYLkqfEG4c7XExo3W\nSzJ+PAwfDn37VuvTL1xonTH9+sHpp1frU7sE84kHrvZZutT2f5o1C159FW64wRtQdYiIDBCRuSLy\ns4jki8hLIvLnsONyIZg6Fdq3h0MOgZkzE9KAKnHRRdZnM3s2dOgAa9cm7FQuCUSkl4h8IiIFwe09\nEfFL3Lpmwwa47DIbYp44sdobUOvXWzrzVq1s0oyrWbwR5WqXmTPhqKOs4vvgA1uh6eqaE4BHgaOB\n9kA6MFVE6ocalUuuBGXPKk/79jB9uqUnbtcOfvgh4ad0ifMNcAvQGltiMAN4RUSqvpOqqxl++QXO\nOgtefx1eesn2NqhmN94IeXkwaZKvNqiJvBHlao9//csWjh9+uG2wUA27hruaR1XPVNUnVXWxqv4X\nuBLYG19rWXeMGWO9x5deaslk6iev/Xz00TYatWoVHH+8XSC5mkdVX1PVN1X1K1X9UlXvANYBx4Qd\nm0uC1autV+Q//7FOmHPOqfZTvPyyXbYMHQoHHljtT++SwBtRruYrKoLeveGaa+Dqq21lZpMmYUfl\nUseOgAJrwg7EJZiqzYnp2RP69LHpN9WUfjgeBx1k+StErCH16adJD8FVIxFJE5HLsX0/fN/K2q5k\nT8m8PNuQu23bhJyiWzfbeaVHj2p/epck3ohyNdvq1ZZ1a8wYuz3yCPzJ86U4IyICDAPeVdVFYcfj\nEqgke9aAAZY5a/jwUPON77OPbUm36652Dfbhh6GF4raSiBwsIr8AG4BRwAWquiTksFwiffEFHHcc\nrFuXsD0li4ttZuB220F2ti/Zrsn8atPVXIsW2RD7zz/bQoQE9Ba5Gm8UcCBwXGUK9+/fn8Yxa2cy\nMzPJzMxMQGiu2iQ4e9bWysiwZZpnnw2nnGLTd9q3Dzuq1JKbm0tubu5mxwoKCkKKZgtLgEOBxsDF\nwEQRaVteQ8rrkBrs44+tU7ZJE0tKs9deFT9mKwwebPXCtGm2YbermjDrEFHVpJwoUUSkNTB//vz5\ntE5Aj4FLUa++avmE99kHJk+2f13oFixYQJs2bQDaqOqCMGMRkRHAOcAJqvp1BWW9HqmpNmywuuCV\nV2yXygQs/q6q9evh4outr2fSJMvk58qWSvVINBF5C/hSVa8u5T6vQ2qyd9+13o7997clAbvskpDT\n/Oc/ljz4xhtts26XGMmqQ3w6n6tZSnYMP/dcy7r13nvegHJbCBpQ5wEnVdSAcjVYSfas115LWPas\n6tCggY1CXXSR5brIzg47IreV0gDPoVbbvP667UvQujXMmJGwBtQvv1h/z+GHw913J+QULsl8Op+r\nOX77Dbp3h6eegttvt1ooxDUPLjWJyCggEzgXKBSRkv3fC1T1t/Aic9Vq9WrbRHfJEsuedeKJYUdU\nrm22saprp52sGluzxpZwudQkIvcBbwBfA42ATsCJQIcw43LVLDcXrrjCOmOeftoWKiVI376wYoUN\ndIWQ78YlgDeiXM2wYoWlsVm40Cq9yy8POyKXunph2fhmxhzvCkxMejSu+n33nfUcr1pl2bNqyPSp\ntDQYMcKWXNxyizWk7r/fF5anqKbAE8BuQAGwEOigqjNCjcpVn1GjLItnly4wdmxCk1I9/TQ8/rjd\n9tsvYadxSeaNKJf65s2zBhTAO+/AEUeEG49Laarqw5O12Rdf2H5wqraO4c9/DjuiuIjAPffYgvL+\n/a0h9a9/Qb16YUfmoqlqVtgxuARRhXvvhYED7Us4eHBCZ7UsWwa9elnf7xVXJOw0LgQJvdgQkQEi\nMldEfhaRfBF5SUTK/YsnIieKSCTmViwiTRMZq0tRTz8NJ5wAe+xhKzK9AeVc3fXxx7bxUv36NbIB\nFa1fP+uVHj8eMjMtP4ZzLsEiEWs4DRxoDakhQxLagNq4ETp3hh13tM4SH3WuXRLdY3sC8ChwNNAe\nSAemikhF28crsD/QLLjtpqorExmoSzGRiK17ysy0tFazZsFuu4UdlXMuLO++C+3awd5724h0gtIP\nJ1OXLvDCC5Zg9JxzbGsa51yCbNwIXbvafpKjRtk1RoJbNf/8J7z/PuTkWEPK1S4Jnc6nqmdG/ywi\nVwIrgTbAuxU8fJWq/pyg0Fwq++UXy7I1ebJl4rvpJu++ca4ue/1160w55hhLZd6oUdgRVZvzzoM3\n37SEo6eeaokGmzQJOyrnapnffoPLLrO6JCfHOmgTbM4cy381cKDt3+tqn2SvHdgRG2VaU0E5AT4W\nke9FZKqIHJv40FxKyMuz2mbGDGtE3XyzN6Ccq8smTbKWRocOdgFUixpQJdq1s/wYX35pSQa//z7s\niJyrRX7+Gc44A956y64rktCAWrsWOnWCv/3NBrxc7ZS0RpSICDAMeFdVF5VTdAXQE7gIuBD4Bpgp\nIoclPkoXqtmz4aijoLDQxr/PPjvsiJxzYRo50hYUdO4Mzz+f0PTDYWvTxmYprl1ry76++irsiJyr\nBVatsj0lP/rIGlFnnJHwU6paIom1a23QK4FJ/1zIkjkSNQo4ECg3N7Wqfq6qY1X1I1X9QFW7Ae8B\n/ZMRpAvJ2LFwyilwyCEwdy4cdFDYETnnwqJqKez69LEMDOPG1YkrkQMOsClA6enWkFq4MOyInKvB\nvvnGElN9+62tq07SnLqJE+GZZ2DMGGjePCmndCFJyl8lERkBnAmcoKortuIp5gLlfvr79+9P48aN\nNzuWmZlJZhKGbV0VbNwI118Pjz4K11wDw4b5LnQ1RG5uLrm5uZsdKygoCCkaV2tEIlYnDB9u2bNu\nu61OTektyZtxxhk2te+11+BYn9DuXHw++8wWGdarZ0lpkrQ505dfQu/elr/i0kuTckoXooQ3ooIG\n1HnAiar69VY+zWHYNL8yDR06lNY1ZMNFF1izxhZ6zpxpuT979Qo7IheH0jopFixYQJs2bUKKyNV4\nGzdCt27w5JOWPevqq8OOKBRNm9oaqXPPhfbt4cUX4fTTw47KuRpiwQI47TTIyIApU2yLlCT4/Xdb\nbrX77pYA0NV+CW1EicgoIBM4FygUkYzgrgJV/S0ocx+wh6p2CX6+DsgDPgW2A7oDJwGnJjJWl2SL\nF9sVwpo1Nk+5XbuwI3LOhSmE7FmpbIcd4I037CU591xrV152WdhROZfiZs2y/QIOPNDqkiSmuhw0\nyLaye/992H77pJ3WhSjRa6J6ATsAM4Hvo27Rg5y7AdEbfmwDDAEWBo87BDhFVWcmOFaXLG+8YamK\nt93WNtD1BpRzdVt09qxXXqnzDagS9evbPlKXX24vyWOPhR2Rcyls8mQbgTr6aJg2LakNqBkzbEeW\nf/4Tjjgiaad1IUv0PlEVNtJUtWvMzw8BDyUsKBceVXj4YUtbftZZ8NRT1t3qnKu7Vq2yBtSXX8LU\nqZZRwf0hPR0efxx22slmN65ZAwMG1KllYs5VbOJEuOoqOP98G8nedtuknXr1atva8qST4MYbk3Za\nlwJqf7ojlxo2bICePeGJJ+DWW23BeL16YUflnAvTN9/Y4u+1a20azqGHhh1RSkpLs5w7O+9se86s\nXg2DB3tDyjnAktD062frKUePTuq1hSpkZdklzsSJ9l11dYc3olzi/fADXHihLfZ86inbgc45V7eF\nlD2rphKBgQNthtK118JPP1kK5TqQ+d250qnaQqR77rEZLg88kPSehdGj4eWX7Zak/BUuhXj16xJr\nwQI47zwoLt60ma5zrm4LKXtWbdCnj03t69LFGlK5ubV6D2LnSheJQN++tiH3Aw/ALbckPYRFi6B/\nf5tme955ST+9SwE+8OgS57nnbH1Ds2aWQMIbUM65WbMsmUzLltax4g2ouHXqZPk33nzTlpf+8kvY\nEc9ThYsAACAASURBVDmXREVFtghp1Cgbjg2hAfXbb5bsZd99bWqtq5u8EeWqXyRiQ+yXXmqLPP1C\nyTkHoWbPqm3OOsvycMybB6ecAj/+GHZEziXB+vVwwQXWSfvMM9C9eyhh3HqrzUjOzYUGDUIJwaUA\nb0S56lVYCJdcYnOU77vPsuTUrx92VM65sE2caGsjzz4bXn3VN1KpBiecYHuVL18ObdvCt9+GHZFz\nCbR2rXXCvP221SGXXBJKGK+/brks/u//4K9/DSUElyK8EeWqz/LlcNxx1j368sueh9c5Z4YPt0U8\nV15pvcdJTD9c2x1+uOXlWL/eqt/PPw87IucSID/fcoh/+ilMnw4dOoQWRteutivDtdeGEoJLId6I\nctVjzhw48kgoKID33oNzzw07Iudc2FQtpVy/fpY9a+xY39ogAfbf3xpSDRvaMtSPPgo7Iueq0bJl\n9sHOz7flAcccE0oYkYj1A4nY3m3eR+y8EeWqbvx46yE68EBLIHHIIWFH5JwLWyRiXbX33GPZsx58\n0K86EmjPPe36cp99LG/HO++EHZFz1WDRImtAqVpn7cEHhxbKI49YMpfHH4emTUMLw6UQb0S5rbdx\no+X37NbNdgqfOhV22SXsqJxzYUuB7Fl10S672EynI46w2U6vvhp2RM5Vwdy5tvBv551tqLVFi9BC\n+fhjq8b694fTTw8tDJdivBHlts7atZYe6tFHYcQI+Ne/YJttwo7KORe2FMmeVVc1agSvvWZrNs4/\n33L7OFfjTJ8OJ58MBxxg2VOaNQstlPXrLZ15q1Zw//2hheFSkG+26+L32We25mnVKtso85RTwo7I\nOZcK1q6Fc86xzXRffTW0xd913XbbwbPPQo8e0LkzrFnji+BdDfLSS3D55daIev55W+wXouuvt7xZ\n8+d7Thy3OW9EufhMnWr7P+2+uw2177df2BE551JBfr7Nc1m+3PaA+tvfwo6oTvvTn2DcONuKq29f\na0gNHOjL0lyKGz/eRq8vucS2RQh5hstLL8Ho0XZr1SrUUFwKSmgjSkQGABcABwC/Au8Bt6hquUlY\nRaQdMAQ4CPga+KeqPpHIWF0FVC1N8Q032IXSpEnQuHHYUTlXKhE5AbgJaAPsBpyvqpPDjaoWW7YM\nTj3V9ombPTvUxd9uExF46CFbUnLbbdaQGjoU0tIgLy+PnJwc8vPzycjIoFOnTrQIcc1Jqtna6xdX\nBYMHw003Qa9etkwgyZk8Y78TJ598BVlZe3PhhT4r2ZUu0SNRJwCPAvOCc90PTBWRVqr6a2kPEJF9\ngFeBUUBHoD2QLSLfq+pbCY7XlWbDBrjmGushuukmmxTsaYpdamsIfAyMA14MOZbabdEim7a37ba2\n+HvffcOOyEURsS37dtrJqvEff4xQv35vxo8fTVpaI9LSmhOJLGfgwIFkZXVn5MgRpKenhx12Koj7\n+sVtJVW4/Xa7trj9dsvomcQh06KiInr37kN29tg/vhPFxd9w553H0rBhI0aN2h4R/064LSW0EaWq\nZ0b/LCJXAiux3uF3y3jY1cBSVb05+PkzETke6A94IyrZVq6ECy+01OVPPAFXXBF2RM5VSFXfBN4E\nEPEJTAkzd65lMNhjD1sfudtuYUfkytCrlzWkOnaMEImcBRxCcfGVFBc3AAqBcWRn3wjAmDGjwww1\nJWzl9YuLV3Ex9O5t8+WGDLEFSElmDagJqA6nuLhb8J34HUinsPBU7ryzpX8nXKmSnZ1vR0CBNeWU\nOQaYFnNsCuAT7JPt449tA90vv4RZs7wB5ZzbJDp71qxZ3oCqAY48cimRyNnAacA1QIPgnoZAX1QH\nk509lry8vNBiTGGVuX5x8fj9d+jY0TbhHj8+lAbU0qVLyc4ei+oQ4Fo2fSe2AQQ4178TrkxJa0QF\nvcHDgHdVdVE5RZsB+THH8oEdRMTzoiTLiy/CccfZxiPz5oW2Q7hzLgW9+CKceabt4TJ1qg1xuJQ3\nadIk6tV7Hyguo0QWaWmNyPG86JuJ4/rFVVZhoWX5fflly8DXtWsoYUyaNIm0tEZAtzJK+HfClS2Z\n2flGAQcCxyXiyfv370/jmEQHmZmZZGZmJuJ0tZeqzUceNAguu8x6hxo0qPhxrs7Jzc0lN/f/2bvz\nOCmK84/jn2dwFVFE8VjUAIJXNEYJxFtERYn3bRTwIiyKgiJqohgU7yMeCAoKrOIFa9R4xah4IKJE\nJYJ4/VRUFuK5EtCVS4Wd+v1RvTiMs7szu9PTM7Pf9+s1L5ienqmne6af7eqqrqpYY1l1dXVE0WSH\n8kga8mz0LElfVVVVcL9HyzrWaEUs1oGqquTrmOEpkDyS9vmLckgavv3WzzP57rvwzDO+RTsiPx8T\ndZ3n5P6YkMxEmUNyUokys9uBQ4HuzrmvGlj9a6A0aVkp8L1z7se63jRy5Ei6du3atECbu2XL/NWg\nhx/2Fam//lXj4UqdUp0YzJ49m27dukUUUdMpjzQg4tGzpGlKS0uJxxcAy/m521KiZcTjCygtTf4T\nHJ58zyMZnr8ohzTkq6/gD3+AL7+EqVP9LQMRysdjQjITZQ4JvTtfkICOAvZ3zv03jbe8BiTP3tor\nWC5h+ewz3zXn6ad9V53hw1WBEhHPOT9G9p//7C+ujB2rClQB6tOnD/H4EvyglancRTy+lL59++Yy\nrLzViPMXqc+8ebDPPn6s/VdeibwCBTompGlCrUSZ2VigL36o8mVmVho8Wiasc62ZJc4BdSfQ2cxu\nMLPtzexs4HjgljBjbdZee80ns8WL4d//hmOOiToikSYxs/XMbBcz6xIs6hw8bx9pYIWopgbOOssP\nP3zzzXD11brAUqA6d+5MWdkAzC4ARuOvvoMfnW80ZhdSVjZA80WR3vmLZODdd30FqkULmDEjb2au\n1TEhTRF2d76B+NFspiUt7wfcF/x/c2D1iY1zbr6ZHQaMBM4FPgf6O+eSR+yTbLj3XjjjDNh9d39z\n52abRR2RSDb8HngJn38cfvJugHuBP0UVVMH56Sc45RSfG+6+O7KbvyV7xoy5HYDy8vOIxS4lFutA\nPL6AeHzp6nmiBEjv/EXS8dprfiCarbbyUyHk2XmGjglprLDniWqwpcs594u/ys656fi5GCQsNTVw\n0UX+ynJZGYwZoxvEpWg4514m91M4FJdly+C44+Cll3wlSi3URaGkpITx48cxbNjFTJo0iaqqKtq1\na0efPn10tT1BOucvkobnnvO5o1s3+Oc/IWnQjXygY0IaK5ej80m+qK6G3r39FaFRo+Ccc9Q9R0R+\nljh61tNPQ8/k21Sl0HXq1Inhw4dHHYYUs4cfhr59/UASDz0E664bdUT10jEhmVIlqrn5+GM/N8PX\nX8Ozz8JBB0UdkYjkkzwbPUtECtD48X4Uzz59YOJEKCmJOiKRrFNzdXPywgv+3ifn4I03VIESkTUl\njp41fboqUCKSGefg+uvhzDNh8GA/l5wqUFKkVIlqDpyD226Dgw/2lajXX4fttos6KhHJJ8mjZ+24\nY9QRiUghcQ7+8hcYNgxGjPC3C8R0minFS7/uYvfTT/6K0LnnwpAh8NRTsOGGUUclIvnktddg332h\ntNTP39KxY9QRiUghWbXKD1J1002+8nT55brXWoqe7okqZgsXwvHH+5YnDU8sIqlMmQLHHpvXo2eJ\nSB778Ud/79MTT/jue6ecEnVEIjmhSlSxeucdOOooWL7cD1G8115RRyQi+eahh+Dkkwtm9CwRyTNL\nlvghzF99FR57DI44IuqIRHJG3fmK0eOP+0rThhvCf/6jCpSI/NL48XDSSfDHP8Kjj6oCJSKZWbQI\nDjzQn2dMmaIKlDQ7qkQVE+fgmmv8VaFDDvFXhjp0iDoqEcknGj1LRJrqiy/8fZSVlb63S48eUUck\nknPqzlcsli+H/v3hwQf9DZ2XXqpRcURkTbWjZ910kx89a8QI3fwtIpn5+GM/RYpz/mKtRvuVZkqV\nqGLwxRf+/qcPPvAzhB9/fNQRiUi+WbXKtz7dfbcfPevcc6OOSEQKzZw5/h7Ktm3hueegffuoIxKJ\njCpRhe6NN+Doo313nBkzoEuXqCMSkXyj0bNEpKlefRUOPxy23RaeeQY22STqiEQiFWp/LzPrbmZP\nmtkXZhY3syMbWL9HsF7io8bMNgszzoL1wAO+H3Lnzv7GTlWgRCTZkiVw2GHwr3/50bNUgRKRTD39\nNPTqBV27wtSpqkCJEP7AEusBc4CzAZfmexywLdAueGzunPsmnPAKVE0NXHSRPxnq08cntNLSqKMS\nkXxTO3rWzJkaPUtEGqeiwt8y0KuXr0y1bh11RCJ5IdTufM65Z4FnAcwyunt5oXPu+3CiKnDff+8r\nTs88A7fcAuedpxvDReSXvvjCn/QsXAjTpvkryCIimRg71o/iedppMGECrKW7QERq5ePwbQbMMbMv\nzew5M9MkR7U+/RT23NP3S/7Xv2DoUFWgROSXPv4Y9t7bd+V75RVVoEQkM87BVVfBoEH+Yu1dd6kC\nJZIk3ypRXwFnAscBxwKfAdPMTDf7TJ0Ku+0GK1f6wSQOPjjqiEQkH82ZA/vs4yfPnTEDtt8+6ohE\npJDE4/4i7WWXwdVXw803a8oUkRTy6rKCc24uMDdh0etmtjUwFDgtmqjywNixfjjiAw6Av/8dNtoo\n6ohEJB+98sqao2dtumnUEYlIIVm1ys85ef/9/tzjrLOijkgkb+VVJaoOM4G9G1pp6NChtGnTZo1l\nvXv3pnfv3mHFFb6VK33l6c47YcgQP0GmmtMlT1RUVFBRUbHGsurq6oiiEf71Lz9H3B57+KHMN9gg\n6ohEpJD88AOceKIfPGLSJCjk8yeRHCiEM/Iu+G5+9Ro5ciRdi6nf///+Byec4LvjlJf7K0MieSTV\nRYrZs2fTrVu3iCJqxiZP9jd+H3YYPPggtGwZdUQiUki+/96PwPfGG/4izKGHRh2RSN4LtRJlZusB\n2+AHiwDobGa7AIudc5+Z2XXAFs6504L1hwCVwPtAS2AAsD9wUJhx5p333/dDES9dCi++CN27Rx2R\niOSrMWPgnHM0epaINM7ChXDIIfDJJ/Dcc/6eShFpUNh3Cv4eeAuYhZ//6WZgNnBF8Ho7oH3C+msH\n67wDTAN+C/R0zk0LOc788c9/+u44rVv7CXRVgRKRVGpHzxo8WKNniUjjfPaZP8/4/HN4+WVVoEQy\nEPY8US9TT0XNOdcv6fmNwI1hxpS3nIMbboBLLoGjj4b77oP11486KhHJR/E4nH8+jBrlR8+65BJN\ndyAimfnoIzjoIGjRwk+dss02UUckUlA0ZmU+WLECTjkFhg2D4cPhkUdUgRKR1Fatgn79YPRoP3rW\nX/+qCpSIZGb2bN/qtMEGqkCJNJIqUVH78kvo0QMefdQPX37llZqPQSQLzGyQmVWa2Qoze93Mdo06\npib74Qc47jg/kMSkSRp+WCQkZtbdzJ40sy/MLG5mR0YdU9a8/DLstx9svTVMnw5bbhl1RCIFSR3o\no/Sf//iue7GYn99Fo5qJZIWZnYi/v/IM/DQJQ4EpZradc+5/kQaXpsrKSiZNmkRVVRWlpaWcfOSR\nbDVkiEbPEsmN9YA5wF3AoxHH0ijJOaRv3750evdd+OMf/X1Qjz2mXi8iTaBKVFQmT/bDlnfp4hNZ\nu3ZRRyRSTIYC45xz9wGY2UDgMOBPwN+iDKwhK1euZPCgQUwoL6d1LEbHWIylNTUcfOmlbLb22qw9\nZQpr7bdf1GGKFDXn3LPAswBmhdVfNlUOWRCPM/fSS5lohh19NLGKClhnnahDFSlo6jeWa/G4vwm8\nb19/Neill1SBEskiMysBugEv1i5zzjngBWDPqOJK1+BBg5hYXs4o5/iqpoZ3Vq7kk3icHYB9f/qJ\nQZMnRx2iiOSxVDnkm5oa7gPudY6z27ZVBUokC1SJyqUlS+CYY+D66+HGG+GeezQppkj2bQK0AKqS\nllfhp1XIW/PmzWNCeTk3O8c5QKtgeQzft+hUYEJ5OZWVlZHFKCL5q64cUltlWgqMv/tu5RCRLFAl\nKlcqK2GvvWDaNHjqKbjwQo2oJSJrmDx5Mq1jMfrX8XoZ0DoWY9KkSbkMS0QKhHKISO7onqhcePll\nP6LWhhvC66/DDjtEHZFIMfsfUAOUJi0vBb6u741Dhw6lTZs2ayzr3bs3vXv3zmqAdamqqqJjLEar\nmpqUr7cCOsRiVFUlN7KJFKaKigoqKirWWFZdXR1RNE2nHCKSW1HmEFWiwjZuHAwe7Icxf+ghaNs2\n6ohEippzbqWZzQJ6Ak/C6hvDewKj63vvyJEj6dq1a/hB1qG0tJQF8TjL+bkbTqJlwIJ4nNLS5Pqh\nSGFKVcGYPXs23Qp0tFrlEJHcijKHqDtfWFau9JWngQP945lnVIESyZ1bgAFmdqqZ/Rq4E39OcU+k\nUTWgT58+LInHuauO1+8Clsbj9O3bN5dhiTQ7Zraeme1iZl2CRZ2D5+0jDawByiEiuaNKVBgWL4aD\nD/atUHfeCbfdBiUlUUcl0mw45x4CLgSuBN4Cdgb+4JxbGGlgDejcuTMDysq4wIzRwPJg+TJ8E9qF\nZgwoK6NTp07RBSnSPPwenztmAQ4/79xs4Ioog2qIcohI7qg7X7Z98AEccQR89x288ILvxiciOeec\nGwuMjTqOTN0+ZgwA55WXc2ksRodgjpel8TgDyspWvy4i4XHOvUyBXmhWDhHJDVWisunpp+Gkk6Bj\nR3j+edCVHhHJUElJCePGj+fiYcOYNGkSVVVVtGvXjj59+ujqsYg0SDlEJDdCrUSZWXfgz/iJLzcH\njnbOPdnAe/bDN5v/BvgvcI1z7t4w48xEZWXl6qRUWlpK37596bTVVnDTTXDRRb4V6oEHoHXrqEMV\nkQLWqVMnhg8fHnUYIlKglENEwhV2S9R6wBz8vYyPNrSymW0FPIXvgtMHOBAoN7MvnXPPhxdmw1au\nXMngQYOYUF5O61iMjkHz+DWXXsrUbbZhz08+gUsugauuglhB9gAQEREREZE0hFqJcs49CzwLq4cY\nbshZwDzn3F+C5x+Z2T7AUCDSStTgQYOYWF7OKOfoX1NDq5oalgPVwIaffEL5/vtTds01UYYoIiIi\nIiI5kG9NJnsALyQtmwLsGUEsq82bN48J5eXc7Bzn8PPcC63wfRSfAM6YNo3KysrIYhQRERERkdzI\nt0pUOyB5Gu0qYAMzWyeCeACYPHkyrWMx+tfx+pFA61iMSZMm5TIsERERERGJQNGMzjd06FDatGmz\nxrJUsxg3RlVVFR1jMVrV1KR8vRXQIRajqiq5/idSvCoqKqioqFhjWXV1dUTRiIiIiOROvlWivgZK\nk5aVAt87536s740jR46ka9euoQRVWlrKgnic5fzclS/RMmBBPE5paXLoIsUr1UWK2bNn061bt4gi\nEhEREcmNfOvO9xrQM2lZr2B5ZPr06cOSeJy76nj9LmBpPE7fvn1zGZaIiIiIiEQg1EqUma1nZruY\nWZdgUefgefvg9evMLHEOqDuDdW4ws+3N7GzgeOCWMONsSOfOnRlQVsYFZowGlgfLlwGjgQvNGFBW\npknsRERERESagbC78/0eeAlwwePmYPm9wJ/wA0m0r13ZOTffzA4DRgLnAp8D/Z1zySP25dztY8YA\ncF55OZfGYnQI5olaGo8zoKxs9esiIiIiIlLcwp4n6mXqae1yzvVLsWw6kHc3VZSUlDBu/HguHjaM\nSZMmUVVVRbt27ejTp49aoEREREREmpF8G1gi73Xq1Inhw4dHHYaIiIiIiEQk3waWEBERERERyWuq\nRImIiIiIiGRAlSgREREREZEMqBIlIiIiIiKSAVWiREREREREMqBKlIiIiIiISAZUiRIREREREcmA\nKlEiIiIiIiIZUCVKREREREQkA6pEiYiIiIiIZECVKBERERERkQyEXokys0FmVmlmK8zsdTPbtZ51\ne5hZPOlRY2abhR1npioqKoq6vCjK1DYWT5lRMrNLzGyGmS0zs8VRx9NU+fr9Ka7MKK7ClMk5TL7K\n1+9YcWVGceWfUCtRZnYicDMwAvgd8DYwxcw2qedtDtgWaBc8NnfOfRNmnI2hk+/CLy+KMpvDNuaB\nEuAh4I6oA8mGfP3+FFdmFFfhaeQ5TN7J1+9YcWVGceWfsFuihgLjnHP3Oec+BAYCy4E/NfC+hc65\nb2ofIccoIkXEOXeFc24U8G7UsYhIQWvsOYyINAOhVaLMrAToBrxYu8w554AXgD3reyswx8y+NLPn\nzGyvsGIUERERSdaEcxgRaSbCbInaBGgBVCUtr8J300vlK+BM4DjgWOAzYJqZdQkrSBEREZEkjTmH\nEZFmZK2oA0jknJsLzE1Y9LqZbY1vUj+tjre1BPjggw9Cjm5N1dXVzJ49u2jLi6JMbWPhl5lwHLbM\n5uea2XXARfWs4oAdghzSGJHkkXRE8ZtJh+LKjOJKX1h5JGTKIRlSXJlRXOnLVQ4x3zodwgf7pvDl\nwHHOuScTlt8DtHHOHZPm5/wN2Ns5t3cdr/cBJjU9YhHJor7OucnZ+jAz2xjYuIHV5jnnViW85zRg\npHOubRqfrzwikn+ymkcykek5jHKISF4KNYeE1hLlnFtpZrOAnsCTAGZmwfPRGXxUF3w3v7pMAfoC\n84EfGhWsiGRLS2Ar/HGZNc65RcCibH5mEuURkfwRSh7JRCPOYZRDRPJHTnJIaC1RAGb2R+Ae/Ig2\nM/Hd8o4Hfu2cWxh00dnCOXdasP4QoBJ4H78DBgCDgIOcc9NCC1REioaZtQfaAkcBFwD7Bi994pxb\nFllgIlJQGjqHiTA0EckDod4T5Zx7KJhP4UqgFJgD/CEh+bQD2ie8ZW38nAxb4JvR3wF6Ouemhxmn\niBSVK4FTE57XdtbeH1AuEZG0pHEOIyLNWKgtUSIiIiIiIsUm7Ml2RUREREREiooqUSIiIiIiIhko\niEqUmQ0ys0ozW2Fmr5vZrvWs28PM4kmPGjPbLM2yupvZk2b2RfDeI9N4z35mNsvMfjCzucHQypls\nX0ZlZmEbh5nZTDP73syqzOwxM9sujfc1ajsbU14WtnGgmb1tZtXB499mdnAY29eY8pq6fSk+7+Lg\nM25pYL0m/VYzLTPb25kLZnaJmc0ws2VmtjjCONLOezmMKeP8mIOYGpXPchBXxjkoCunmjhzEMSJF\nrvi/KGNKlskxmavc15hjMpt/B7IVVy72V2NzRdj7qzFx5Wh/5fQ8Kqy4wtxXeV+JMrMT8YNNjAB+\nB7wNTDF/s2ddHLAtfuCKdsDmzrlv0ixyPfzNo2cHn9NQfFsBTwEvArsAo4ByMzsozfIyLjPQlG3s\nDtwG7A4cCJQAz5nZunW9oYnbmXF5gaZs42f4yVm7At2AqcATZrZDqpWz8D1mVF6gKduXGPuuwBn4\nY6O+9bai6b/VjMoMZGU7c6gEeAi4I6oAGpn3cqExuSpsjc0vYWtMTsipDI/jXHgPP4BDba7YJ9pw\nfhbBuUi6ojhnyXpcgbD3V67PfUKLKxD2/sr1eVQocQXC2VfOubx+AK8DoxKeG/A58Jc61u8B1AAb\nZKHsOHBkA+vcALyTtKwCeDrEMrO2jcHnbRKUu08utjPN8rK6jcFnLgL65eJ7TKO8rGwfsD7wEXAA\n8BJwS9jfYYZlZv17zNUDOA1YHFHZGeW9iGJsMFdFFFeD+SXC2OrMCRHEkvZxnKN4RgCzo94v9cQX\n2blIBjHm/Jwli3FFsb9yeu6T5bgi+dua6/OoLMUV2r7K65Yo8zOGd8PXagFwfo+8AOxZ31uBOWb2\npZk9Z2Z7hRjmHkE8iaZQf3zZkM1t3BBfS6+v61I2tzOd8iBL22hmMTM7CWgFvFbHalnbvjTLg+xs\n3xjgn865qWmsm61tzKRMyO3xWPCakPfESze/5EwGOSGXMj2Oc2HboPvXp2b2gPk53yJXIOci6Yrq\nnCUdud5fuT73SVdOz5HSkevzqCzHBSHtq1DnicqCTYAWQFXS8ipg+zre8xVwJvAmsA5+wt5pZrab\nc25OCDG2qyO+DcxsHefcjyGUmbVtNDMDbgVedc7V1/88K9uZQXlN3kYz2wl/ULUElgDHOOc+rGP1\nJm9fhuVlY/tOAroAv09nfbKzjZmWmevjsRg0Ju8JGeWXXMWTSU7ImUYcx7nwOnA6vnVsc+ByYLqZ\n7eSinyS7EM5F0hXFOUs6crq/cn3uE0JcOdlfuT6PCimu0PZVvleiMuacmwvMTVj0upltjZ9pPOs3\nuEUhy9s4FtgR2DtL4WWlvCxt44f4frlt8LPM32dm+4Z4EpN2eU3dPjP7FT7RHuicW5mN4MMoM1+O\nRzO7Dt+Hui4O2CGIVwpXrvNZQ3KdgxoURe5Ih3NuSsLT98xsJrAA+CMwMZqoGi9fcl+hiGB/5Vuu\nqJXLc6R05F0OC+TsfKs++V6J+h++H2Np0vJS4OsMPmcm4R0oX5M6vu9zfEUn4200s9uBQ4Huzrmv\nGli9yduZYXmpZLSNzrlVwLzg6VtmthswBDgrxepN3r4My0slk+3rBmwKzA6uXIG/UrqvmQ0G1gm6\nmyRq6jY2psxUwjwe63ITDZ+IzWvg9VzJVt5rVrKQX7IuCzkhDNk6jkPlnKs2s7nANlHHQmGci6Qr\nX85Z0hHK/sr1uU9IcaWS9f2V6/OokOJKJSv7Kq8rUc65lWY2C+gJPAmrmzp7AqMz+Kgu+Oa8MLwG\nHJK0rBe57/ee0TYGB+tRQA/n3H/TeEuTtrMR5aXS1O8xhm/KTSWM77G+8lLJZPteAH6btOwe4APg\n+jpOgpq6jY0pM5Uwj8eUnHOL8Dee5r0s5r1mI0v5JRcyzQlhyNZxHCozWx9fgbov6lgK5FwkXfly\nzpKOrO+vXJ/7hBhXKrn4feX6PCpdYZ5v1S3bI1Vk+4Fvyl8OnAr8GhiHPxnaNHj9OuDehPWHAEcC\nWwO/wXdbWAnsl2Z56+GbCLvgR0c5L3jevo7ytsL3x7wB3zf6bOAnfFeJdLcx0zKbuo1jgW/x3iwv\nIQAAIABJREFUw2qWJjxaJqxzbba2s5HlNXUbrw3K6wjsFOzDVcABYXyPjSivSdtXRwxrjLCVze+w\nCWVmfTvDfgDtg+PvMqA6+P8uwHo5jKHevBfhvqk3V0UUU4P5JaK46s0J+fRIPo4jiuFGYN9gf+0F\nPI+/n2LjqPdPEF9Oz0UyiCvn5ywhxRX6/konV6T4Gxb6/mpkXLnYXzk9jwoxrtD2VdY2KsxH8EXM\nB1bga7S/T3htIjA14fmfgY+BZcBC/Gg6+2ZQVo/ggK9Jetydqrxg2b7ArCC+j4FTMty+jMrMwjam\nKqsGOLWu/dqU7WxMeVnYxnJ8U+8KfBPzcyScvGT7e8y0vKZuXx0xTGXNCk3Wf6uZlhnGdob9CLYh\n1e81p3FTT96LcN/Um6siiqnB/BJRXPXmhHx6JB/HEcVQgR8yfAXwX2Ay0CnqfZMUY87ORTKIKefn\nLGHElYv9lU6uiGJ/NSauHO2vnJ5HhRVXmPvKggJEREREREQkDXk9T5SIiIiIiEi+USVKREREREQk\nA6pEiYiIiIiIZECVKBERERERkQyoEiUFxczuMbPKqOMQkcKlPCLSfJnZNDObGnUc9TGzjmYWN7NT\no45F6qZKVJaZ2W/N7BEzm29mK8zsczN7LpgJvlkxs83NbISZ7ZzFj3X44UAbE88hZjYii7FEyszO\nMrPToo5Dsk955GfKI+FSHomOjvOfhXSc1yX0YanN7PLkCzVmNszMjsrgYxoVp5mtG+zLfRvz/nxj\nZjsE29Mh6liSqRKVRWa2F/Af/Gzw44FBwAT8eP/nRhhaVLYARuAn28uWMvxEh41xKH4C1WJxNqCT\nnyKjPPILyiPhUh6JgI7zXwjjOI+S45eVoEuAtCpRzrkFwLrA/Y0ouxV+X+7XiPfmox3x27NVxHH8\nwlpRB1Bk/gp8h5+Ab0niC2a2STQhRcqy/YHOudpJ6Boj6/EAmFlL59wPYXy2NEvKI2tSHpFipON8\nTaEcV4XMOfdTI98aVo5q5ZxbHsZnN1Q0OWg9bJRszyTcnB/AB8CLGax/MvAmsBxYhJ+x/Vcp1hsE\nfBqs9zqwDzCNNWdkrp0d/AR8jf1z4HvgYaA1sDZwK1AFLAHuBkoaE1NQ9jvADsBL+FmgPwf+nCKe\nmuDf2v+fGry+DfAP4Cv8rNOfBWW1bmCf3QNUJjzvGHz2+cAA4BPgB2Amv5xN/hfxJLxuwHnAe/w8\nC/adwIZJ5c8HngR64a8irgDODV47CHgF+DbYxx8C1yS9f23gCvzs2T8A/wVuANau47t4I9i/i4GX\ngQOD1yoTtqP2MbW+fadHYTxQHlEeUR4p+gc6zkM/zoP3nhEcz4n746Xk3zmwKXBXcMyuAObUlp+w\nTlp5Ilh3BDAv4Xny9sWBu+uJu7asUxOW3RN8H1sAjwf//wa4EbCk9yWXdVnC52wPPBJ8ZyvwOeiI\npPJPC963LzA2+C0sCl5bP/h9VAbbXwU8B3RJ+ozdgWfxFwuWBb+FvVJs6xbBvv8i+Lx5QZlrJcSR\n/NvYN+pj2DmnlqgsWwDsYWa/cc69X9+KZvZX4ErgQXwT/qb4JvyXzex3zrnvg/XOAm7D/+G7Bd+c\n+Tj+D+xnKT56GD5ZXIdPPOcAK/E/vA3xB/Ye+B/mPODqTGPCXxFoCzwDPBqsfzxwvZm945ybgv8D\ncVnweePwJwUA/zazEvwBVwKMxietLYHDgxjXuCqXJFUTOUBf/IF9Z/D6RcA/zKyz81ed78QfqAcG\n6yZfqRkPnIr/YzEK6BTsuy5mtnfwGbXl/xqYHGzXeOAjM9sR+Cc+8V4K/Ijf/3vVFmBmFqyzV/De\nD/FdOYYC2wLHJqw7Av9dzQg+7yd8QjoAeAEYAtwe7Kurg+2pqme/SeFQHlEeUR4pfjrOQz7Ozaw/\n/ph9FRgJdMZfvFiMv/BQu17LYJ91DvbffHwF8x4za+Ocuy3poxvKE6mcjK8ovIE/3sFXdjPh8Lfh\nTMFXCC/A56Lz8RW6ccBCYGAQ26PBA3xFFjP7DX5/fI7/3pcBfwQeN7NjnXNPJJU5Fl9RuwLfTZCg\nnGPx++oDYGN85XQHfO7CzA4AnsZXsi/H/6b6AVPNbB/n3JvBepvjK3EbBJ/7Ef77PT4obzr+ez8H\n//v7MIjhgwz3XTiirsUV0wP/Y/4Jn4RmANfjryqulbReh2Cdi5KW7xi8/+LgeQn+gHgNiCWsdwpJ\nVwz5+UrO20CLhOWT8LX2p5LKmsGaV0nSiilY9lLwmX0SlpUAXwIPJSzrRtKVlGD5LsHyYxqxjycm\nxV171eUbYIOE5UcEMR6asOw2Eq4aJyzfJ/iME5OWHxQsPylhWWXwuQcmrTskWL5RPbGfHOzjPZOW\nnxG8d4/g+dbAKuDhBvbFu+iqcdE9lEeUR5RHiv+h4zzc4xzfivE1/iR+rYTl/VPsj9rjLvEYbRFs\ndzWwXrAs7TxRR0xLqKf1KWndVC1RE4NyLkladxYwM+H5xiS1PiW89gLwVorf2avAhwnPa1uAphG0\nciW89i0wuoH4PwL+lbRsHXzF8dmEZfcGv6Xf1fNZx5FHrU+JDw0skUXOuReAPYEngJ2BP+OvGHxh\nZkckrHoc/orfw2a2ce0Df2B+DOwfrLcr/mCY4JxLHElqMv5HnMq9bs0rIW8E/96dtN4bQHszq/0N\npBtTraXOuckJ274S36TduY64ElUH/x5sZuumsX46HnQ/X/kCfyXL0ozneHxz84tJ2/4WsJRfbntl\n8F0n+i7495jgSnFd5XwAzE0q56Ug1tpyjgmeX5lG7FJklEeUR1AeKXo6zkM/zn8PbAbc6ZxblbD8\n3oTPrHUI8LVz7sGEGGvwLSDr4yudiZqSJ7JhXNLzV9Ip28w2wn83DwNtkr6754Btg5ahWg7/e0pu\ntf8O2D1p3cRyuuBbxSuSymgNvIjvIljbqn4U8KRz7q2G4s9H6s6XZc65WcDxZrYW/grKMfhuFg+b\nWRfn3If4ZvMYvvn1Fx+Bv5ID/mqPI6nJ1zlXY2bz6wghucm+up7lMaANPsGmG1Otz1Os9y2+W0m9\nnHPzzexmfBP0yWb2Cr6J/YGkxJSJNbbPOfddcA6yURrv3RbfLeCbVOHiE3GiyhTr/R1/hWsCvpvC\ni/hm9EcSEtC2+C48CxsopzP+ClB+NFdLzimPKI+gPFL0dJyHepx3DGJZI0bn3Cozm5di3Y9TfMYH\n+MpRx6TlTckTTfWDc25R0rJv0yx7G/z2XEVC18wEtfnjq4Rl81Os9xf8/VmfmdksfLe9+5xztTlt\n2+Df++qII25mbfAtUxsA9XZnzWeqRIUkuPIxC5hlZh/jm2FPwP94Y/g/bgeTeq6SpU0ouq7+uHUt\nr73amWlMDX1evZxzfzaze/BXIXrhr/hcbGZ7OOe+TOczshhPDH8fQJ861k8+WVmRvILzo2rta2b7\nA4fh9+OJ+KvSvYIToBi+68zQOspJ1WddmjHlkfopjyiPFAMd5/UL4ThvqiZtT0hlp6O2JfEmfKtn\nKskV41R56mEzm46v9PcCLgQuMrNjnL/HrbacC/BdRlNZiq9EFTRVonLjzeDf2qbPT/EH23znXKor\nObUWBOttg7/pEQAza4G/YbSuH2djpBtTJpKbgNd80d9M+z5wrZntAfwbf0NkWHOw1BXPp0BP4N/O\nuR+bVIBzL+G71VxoZsPwV3v2B6YG5ewcrFOfT/FJaEeCm0HrKq4psUrBUR5J9aLySF2URwqTjvNU\nL2Z+nNfuj23x9/UAELT6dSIYACFh3VStYjskvJ4NuTrW6iqntgVupXNuapMKcK4KP3jFneaH5H8L\nP2z/FH5uDV1SXzlmthA/KuRODRXXlFjDpHuissjM9qvjpcOCf2tHFXkUf/VmRB2f0zb475v4ISgH\nJPRFBn9jcbabjdONKRPLgn83TPqs1kFiT/R+UH6YVyaWBeVvkLT8IfwFhV8kYzNrETQ71yvoa5zs\nbXwSr92mh4BfmdmAFO9vaWa1I988jk8al9VzXwT47dmwntelACmP/ILyiPJI0dFx/gvZPs7fJBip\nLqg41eqXXAa+O1o7MzsxodwW+BHhlpBQKW2iXB1rtXM5rVGWc24hvkJ5ppm1S36TpTE/mZnFknOf\nc+5/+IFCar+PWfiK1IVmtl5d5QQt648DR5hZ13qKXYbPgXmXp9QSlV23BX/AHsMnwLWBvfHDR87D\n9yHFOTfPzIbjr6h04ufx/jsDR+NvGrzFObfSzC7HN12/ZGYP4a8o9cM3uaZbO2+wiTndmNIsr9an\n+BsQB5rZUvyB8Aa+7/ftZvYwMBf/OzwVP5LUPzIsIxOz8PviNjObgh9h6+/OuelmNg7fPaAL/gbL\nlcB2+Ju4z+XnYULrcpmZ7Qv8C3/VqhQ4Cz+M6qvBOvfjfwt3BN11ZuBHANoB33WjFzDbOfepmV0D\nDAdeMbNH8UMd7wp84Zz7a8L2DDQ/1OwnwDdpXJ2W/Kc8siblEeWRYqTjfE1ZPc6De5+G41tLXjKz\nv+NboPrxy6HFxwNn4oc0/z0/D3G+JzDEObeM7JgFHGhmQ/GVjkrn3MwsffZqzrkfzOz/gBOD7qGL\ngfeC1rxB+IEo3jWzCfjfWil+W7cEfpfwUal+C62Bz83sEfwFnqX4USV/j79vDeecM7MyfOX0fTOb\niJ8Dakt8i3o1vmsmwCXB+6eb2Xj8fWhb4HPm3sF9b3Pw3RgvMrMN8XnsxaDyFq36hu7TI7MH/o/X\nBPxVkmp8X9KP8PMTbJJi/aPxVzi+Dx7v4+cW2SZpvUH4H/pyfFLZCz+u/r8S1umB/5Edm/Te04Ll\nXZOWjwiWt800Jnw3k7dTbM9E4NOkZYfj++//GJR3Kv4mzQn4hLgMf7XoBWC/NPbxGmUEn1UDDE2x\nbg1wacLzGH6CuK/xCbgmaf3++BGDluKT+RzgWqA0YZ15wBMpytoPf4L0GT9PBng/sHXSei3w/Yff\nCb7P/wVl/hVYP8V392bCelOBAxJe3wx/g+13wbZqmOIieCiPKI8ojxT/Q8d5+Md58Jln8vNku2/g\nK6pTSZroGNgEKMff11g72e4pSeuknSfqiGW7YH8sDdZvaLLd1RMOJ+yz6hTrjgBWJS3bPcgJK4LP\nSZxsd6vgs2ont/0vfpTIYxLWqeu3UIIfjn92kDO+D/5/Roq4dsaPBPhNsP/n4SdJ3i9pvV8F8Xwd\nrPdx8DtKHJr+T8Hyn8ij4c5rZziWAhJ0zVgI/MM5d2bU8YhI4VEeESl+Os5FwhPqPVFmNtDM3jaz\n6uDxbzM7uJ71e5hZPOlRY2bJQ8M2G2aWqs/vafgZwNXlQiQFM9vCzO43s/+Z2fIgD9XX57qoKY+I\nZK7Q8oiOc5HcCvueqM+Ai/BNcAacDjxhfv6DuuaucPgmzyWrFziXat6N5mIPMxuJbxJdhJ/V+0/4\nbhyPRBmYSD4K+kzPwE/q9wd8F6ZtqXvCyeZAeUQkAwWaR3Sci+RQzrvzmdki4ELn3MQUr/XA91Xd\nyDV+ssSiYmYd8X1Dd8NfTVqMv+l4mMuHm+pE8oyZXQ/s6ZzrEXUs+UJ5RCQzhZhHdJyL5FbOKlHB\nkJt/xN889jvnZ+JOXqcHvsl5PtASeA+43Dn375wEKSIFz8zeB54F2uNvoP4CGOucK480MBEpGMoj\nItKQ0CtRZrYT8Bq+UrQE6OOce7aOdbfDJ6s38ePNDwBOAXZzzs2p4z0b45va5+NHGRGR6LTEj/wz\nxTm3KIoAzGwFvlvwzfguLLvhr86e6Zy7v473KI+I5I+CyyPKISJ5JSc5JBeVqLWADkAb/LjvA/BD\nE/6iJaqO908DFjjnTqvj9T7ApOxEKyJZ0tc5NzmKgs3sR2Cmc657wrJRwO+dc3vX8R7lEZH8UzB5\nRDlEJC+FmkNCn2zXObcKPzY8wFtmthswBD+BYDpm4sf1r8t8gAceeIAddtihsWGGYujQoYwcOTLq\nMH5BcWVGcaXvgw8+4OSTT4bguIzIV/gJ+xJ9ABxbz3vmg/JIJhRXZhRX+go0j8wH5ZBMKK7MKK70\n5SqHhF6JSiGG76qXri74ZFaXHwB22GEHunbNr5FH27Rpk3cxgeLKlOJqlCi7s8wAtk9atj2woJ73\nKI9kSHFlRnE1SiHlEeWQDCmuzCiuRgk1h4RaiTKza4Fn8LMhtwb64u956hW8fh2wRW1XPTMbAlTi\nZ71uie/6tz9wUJhxikhRGQnMMLNhwEP4mdvL8PlERCQdyiMiUq+wW6I2A+4FNgeq8XMV9HLOTQ1e\nb4cf+abW2vibOLcAlgfr93TOTQ85ThEpEs65N83sGOB64FL8hZkhzrkHo41MRAqF8oiINCTUSpRz\nrqyB1/slPb8RuDHMmESk+DnnngaejjoOESlcyiMiUp9Y1AEUs969e0cdQkqKKzOKS6KUr9+z4sqM\n4pKo5Ot3rLgyo7jyT84m2w2LmXUFZs2aNSufb2wTaRZmz55Nt27dALo552ZHHU+6lEdE8kch5hHl\nEJH8kascopYoERERERGRDKgSJSIiIiIikgFVokRERERERDKgSpSIiIiIiEgGVIkSERERERHJgCpR\nIiIiIiIiGVAlSkREREREJAOqRImIiIiIiGRAlSgREREREZEMqBIlIiIiIiKSAVWiREREREREMqBK\nlIiIiIiISAZUiRIREREREclAqJUoMxtoZm+bWXXw+LeZHdzAe/Yzs1lm9oOZzTWz08KMUURERERE\nJBNrhfz5nwEXAR8DBpwOPGFmXZxzHySvbGZbAU8BY4E+wIFAuZl96Zx7PuRYRQpCZWUlkyZNoqqq\nitLSUvr27UunTp2iDktERESk2Qi1EuWc+1fSouFmdhawB/CLShRwFjDPOfeX4PlHZrYPMBRQJUqa\ntZUrVzJ40CAmlJfTOhajYyzGgnicyy67jAFlZdw+ZgwlJSVRhykiIiJS9HJ2T5SZxczsJKAV8Fod\nq+0BvJC0bAqwZ5ixiRSCwYMGMbG8nFHO8VVNDe+sXMmXNTXc6hwTy8sZPGhQ1CGKiIiINAuhV6LM\nbCczWwL8iO+md4xz7sM6Vm8HVCUtqwI2MLN1QgxTJK/NmzePCeXl3Owc5+CvRACsB5wL3OQcE8rL\nqaysjC5IERERkWYiFy1RHwK7ALsBdwD3mdmvc1CuSNGYPHkyrWMx+tfxehnQOhZj0qRJuQxLRERE\npFkKe2AJnHOrgHnB07fMbDdgCP7+p2RfA6VJy0qB751zP9ZXztChQ2nTps0ay3r37k3v3r0bFbdI\nPqmqqmIrs9UtUMlaAR1iMaqqkhtyw1NRUUFFRcUay6qrq3NWvoiIiEhUQq9EpRAD6uqa9xpwSNKy\nXtR9D9VqI0eOpGvXrk0MTSQ/bdOyJceuWlXn68uABfE4paXJ1yDCk+oixezZs+nWrVvOYhARERGJ\nQtjzRF1rZt3NrGNwb9R1QA/ggeD168zs3oS33Al0NrMbzGx7MzsbOB64Jcw4RfLagw8yePx4tgMe\nr2OVu4Cl8Th9+/bNYWAiIiIizVPYLVGbAfcCmwPVwDtAL+fc1OD1dkD72pWdc/PN7DBgJP5++c+B\n/s655BH7RIrft9/CoEFQUUGLE0/kprXXZswDD3CTc5Thu/Atw1egLjRjQFmZ5osCzGwEMCJp8YfO\nuR2jiKexNB+YSHSKJY9I+pRzJVNhzxNV1sDr/VIsmw6oP5A0by+8AKefDkuXwuTJ0Ls3f1u5kuUt\nW3JeeTmXxmJ0COaJWhqPr54nSlZ7D+iJn+QboO6+kHlG84GJ5I2CzSOSPuVcaawo7okSkbqsWAHD\nhsGoUdCzJ0ycCO19Y21JSQnjxo/n4mHDVl8ta9euHX369NHVsl9a5ZxbGHUQjZE4H1j/mhpa1dT8\n3OJYXg7AuPHjI41RpJko2Dwi6VPOlcZSJUokX8yeDSefDPPmwa23wjnnQOyXty126tSJ4cOHRxBg\nQdnWzL4AfsAPTDPMOfdZxDE1qHY+sFHBfGC1aucDwznOKy/n4mHDVHEWCV9B5hFJn3KuNEUu5okS\nkfqsWgXXXgu77w4tW/rK1JAhKStQkpbXgdOBPwADgU7AdDNbL8qg0qH5wETyRsHmEUmfcq40hVqi\nRKL06adw6qnw+utw8cUwYgSsvXbUURU059yUhKfvmdlMYAHwR2Bife+Ner65qqoqOsZitKqpSfl6\nFPOBiYQpX+eba2weiTqHSGaUcwtflDlElSiRKDgHd90F550HpaUwfTrsvXfUURUl51y1mc0Ftmlo\n3ajnmystLWVBPM5ySDmxchTzgYmEqVDmm0s3j0SdQyQzyrmFL8ocov5CIrlWVQVHHQUDBkDv3jBn\njipQITKz9fEnPl9FHUtD+vTpw5J4nLvqeH0Kmg9MJAqFlEckfQ3lXM3BKPVRJUokl558En77W999\n74knYMIEaN066qiKipndaGb7BpN87wU8BqwEKhp4a+Q6d+7MgLIyLjBjNLA8WL4MmA8cBozp2VM3\nOIuErJDziKQvOeeuCJavAEajORilfqpEieTCkiVQVuZboPbYA959F448MuqoitWvgMnAh8CDwEJg\nD+fcokijStPtY8bQr6yM88zYvEULfltSwuYtWrA98E7nzgycOhXuvjvqMEWKXUHnEUlfYs79QzCg\nU69YjPPM6Kc5GKUeuidKJGwzZvjBI6qqfMtT//5g1vD7pFGccwV9B3e984F16ACDB/vf0LffwgUX\nRB2uSFEq9Dwi6UvMuS/eeCPccQenDxzIfRdeqBYoqZcqUSJh+eknuOIKuP563/r03HOw9dZRRyUF\nos75wMaOhY03hgsvhEWL4JprVCkXEWmiTp06UVZWBnfcQf/+/UEVKGmAKlEiYXj/fTjlFN9t7+qr\n4S9/gRYtoo5KioGZ/021betbohYvhjFj9PsSERHJIVWiRLIpHofRo/2cT507wxtvgIa7lTCcfz5s\ntJG/1+7bb+H++zXHmIiISI5oYAmRbPnsMzjoIBg6FAYOhFmzVIGScPXrB488Ao8/7gcqWbYs6ohE\nRESaBVWiRLJh8mQ/dPlHH8Hzz8Ott8K660YdlTQHxxwDTz/tBzA56CDfKiUiIiKhUiVKpCkWL/YT\n5vbtC4ce6u+BOvDAqKOS5qZnT5g6FebOhR494CvNByoiIhKmUCtRZjbMzGaa2fdmVmVmj5nZdg28\np4eZxZMeNWa2WZiximTs+edh553h2Wd9S9Tkyf4eFZEo7LorvPKKr9jvsw/Mmxd1RCIiIkUr7Jao\n7sBtwO7AgUAJ8JyZNdTPyQHbAu2Cx+bOuW/CDFQkbStWwJAh0KsX/PrXvvWpt6YUkTywww6+W1+L\nFr4i9e67UUckIiJSlEKtRDnnDnXO3e+c+8A59y5wOtAB6JbG2xc6576pfYQZp0jaageLGD8eRo3y\ncz/96ldRRyXys44d4dVXobQU9t0XXnst6ohERESKTq7vidoQ38q0uIH1DJhjZl+a2XNmtlf4oYnU\nY9UqP6npHntAq1a+MnXuuRDTbYWShzbbDKZN84OdHHigr+yLiIhI1uTsDNDMDLgVeNU593/1rPoV\ncCZwHHAs8Bkwzcy6hB+lSAqffOKv6F92GVx0kb+yv+OOUUclUr82bWDKFDjgADj8cHj44agjEhER\nKRq5nGx3LLAjsHd9Kznn5gJzExa9bmZbA0OB08ILTySJc1Be7ud9Ki31N+3vpUZRKSDrrguPPurn\nkzrxRPjuOxgwIOqoRERECl5OKlFmdjtwKNDdOdeYsXdn0kDla+jQobRp02aNZb1796a3bviXxqiq\ngrIyeOopf9J5yy2w/vpRR5VXKioqqKioWGNZdXV1RNFInUpK4L77oG1bOOMMWLTIt6iaRR2ZiIhI\nwQq9EhVUoI4Cejjn/tvIj+mC7+ZXp5EjR9K1a9dGfrxIgscf9xWnWAyefBKOOCLqiPJSqosUs2fP\nplu3dMaNkZyKxfxAKG3bwrBhviL1t7+pIiUiItJIoVaizGws0Bs4ElhmZqXBS9XOuR+Cda4FtnTO\nnRY8HwJUAu8DLYEBwP7AQWHGKsKSJXDeeXD33XDkkTBhgr9BX6QYmMHll/uK1JAhfj6pceNgrVz2\n6hYRESkOYf/1HIgfjW9a0vJ+wH3B/zcH2ie8tjZwM7AFsBx4B+jpnJseaqTSvL36Kpx6KixcCHfd\n5e8h0VV6KUbnnusnhe7Xz98jNXkyrLNO1FGJiIgUlFArUc65Bkf/c871S3p+I3BjaEGJJPrpJxgx\nAm64wQ8a8cIL0Llz1FGJhOuUU2DDDeGEE+Cww+Cxx6B166ijEhERKRia5Eaar/ffh913h5tu8nNA\nvfyyKlDSfBxxhB8CfeZMP5fUokVRRyQiIlIwVImS5iceh5EjoVs33xI1c6a/2b5Fi6gjE8mtHj38\npLyVlX4utC++iDoiERGRgqBKlDQv//0vHHQQnH8+nH02zJoFv/td1FGJRKdrVz8H2pIlsPfe8PHH\nUUckIiKS91SJkubBOZg0CXbeGebO9fc+3XILtGwZdWQi0dt+e5gxw0/Ou88+MGdO1BGJiIjkNVWi\npPgtXgwnnQQnnwyHHw7vvgs9e0YdlUh+ad8epk+HDh1gv/38iJUiIiKSkipRUtyeew5++1v/74MP\nwgMP+FHJROSXNt0Upk71Xfx69YKnn446IhERkbykSpQUp+XL4Zxz4A9/gN/8Bt57D048MeqoRPJf\n69a+8tSrFxx1FFRURB2RiIhI3lElSorPm2/6kffKy2H0aHj2Wdhyy6ijkoiY2cVmFjezW6KOpWC0\nbAmPPOK7wPbtC2PHRh2RSKSUR0QkmSpRUjxWrYKrr4Y994RWrWD2bN8aFdPPvLkys12BM4C3o46l\n4Ky1Ftx1F5x3HgwaBFdd5QdoEWlmlEeah8rKSsrLywEoLy+nsrIy4ogk3+nsUorDJ59A9+4wYgRc\nfDG89hrssEPUUUmEzGx94AGgDPgu4nAKUywGN9/sL05cdhkMHernWRNpJpRHit/KlSuYTl2LAAAg\nAElEQVQ584wz2Hrrrblv3DgA7hs3jq233pozzziDlStXRhyh5CtVoqSwOQfjx8Muu8DChX5Esauu\ngrXXjjoyid4Y4J/OualRB1LQzOCvf/Vd+kaPhn79fKuvSPOgPFLkBg8axMTyckY5x5TgItGUeJxb\nnWNieTmDBw2KOELJV6pESeH6+ms44gg480x/78acOb4rnzR7ZnYS0AUYFnUsReOss/xca5Mnw3HH\nwQ8/RB2RSKiUR4rfvHnzmFBezs3OcQ6wbrB8XeBc4CbnmKCufVIHVaKkMD32GOy0E/znP/DPf8K4\ncbD++lFHJXnAzH4F3Ar0dc6pH0Y29e4NTzwBzz8PhxwC338fdUQioVAeaR4mT55M61iM/nW8Xga0\njsWYNGlSLsOSArFW1AGIZOT77/2N7hMnwtFH+658m24adVSSX7oBmwKzzcyCZS2Afc1sMLCOc6lH\nSBg6dCht2rRZY1nv3r3p3bt3mPEWlkMP9fOuHX44HHAAPPOMjkFptIqKCiqShtGvrq6OKJo1NCqP\nKIcUlqqqKjrGYrSqqUn5eiugQyxGVVVVbgOTtEWZQ1SJksLxyitw6qnwv//B3XfD6af7+zVE1vQC\n8NukZfcAHwDX11WBAhg5ciRdu3YNMbQisc8+8PLLfh627t19y1T79lFHJQUoVQVj9uzZdOvWLaKI\nVmtUHlEOKSylpaUsiMdZjq8wJVsGLIjHKS0tzXFkkq4oc4i680n++/FHP+Jejx7wq1/BO+/4m9tV\ngZIUnHPLnHP/l/jA/y1c5Jz7IOr4isYuu/iBXH78EfbeGz76KOqIRLJGeaR56NOnD0vice6q4/W7\ngKXxOH379s1lWFIgQq1EmdkwM5tpZt+bWZWZPWZm26Xxvv3MbJaZ/WBmc83stDDjlGhVVlZy9dVX\nc84553D11VeveQPne+/B7rvDLbfAddfBtGnQqVNksUrB0gRHYdhmG1+Rat3at07Nnh11RCJhUh4p\nMp07d2ZAWRkXmDEaWB4sXwaMBi40Y0BZGZ103iEphN2drztwG/BmUNZ1wHNmtoNzbkWqN5jZVsBT\nwFigD3AgUG5mXzrnng85XsmhlStXMmjQYMrLJxCLtSYW60g8voDLLruMAf3LGLvdtrQYPhy23RZm\nzoQuXaIOWQqUc+6AqGMoWltuCdOn+3ul9tvPD/TSo0fUUYlknfJIcbp9zBgAzisv59JYjA6xGAvi\ncZbG4wwoK1v9ukiyUCtRzrlDE5+b2enAN/gbNl+t421nAfOcc38Jnn9kZvsAQwFVooqIr0BNxLlR\n1NT0p6amFbCM9tzIieVX0gIH558P11wDLVtGHa6I1GXjjeHFF+GYY/x9Ug89BEceGXVUIiINKikp\nYdz48Vw8bBiTJk2iqqqKdu3a0adPH7VASb1yPbDEhvjm8MX1rLMH/obORFOAkWEFJbk3b948yssn\n4Nwo4JxgqaMvjzGGkVTThp58R/ngwXRSBUok/62/Pjz1FPTtC8ce60fQPOWUqKMSEUlLp06dGD58\neNRhSAHJ2cASwRChtwKvBjdo1qUdkDyWZBWwgZmtE1Z8kluTJ08mFmsNwewMG7GI67iY8ZzBkxzJ\nzrzPyy020NwMIoVknXXg73/3I2eeeiqMGhV1RCIiIqHIZUvUWGBHYO8wPlxzMxSWqqoqYrGO1NS0\nohdTOJ9bOJgpvEhPXqAXACWxDpqbIY/l8fwuEqUWLWDCBN/F77zzYPFiuPxyjaYpIiJFJSeVKDO7\nHTgU6O6c+6qB1b8GkgfkLwW+d879WNebNDdDYSktLWWdmvncwkAGM47bORtgdQUKlhGPL9DcDHks\nj+d3kaiZwQ03QNu2fnqCRYtg9GiIaVYNEREpDqFXooIK1FFAD+fcf9N4y2vAIUnLegXLpUj022kn\nTogvoQN3M4jbGRtUon52F/H4Us3NIFLILrrIV6TOPBO+/RbuuQdKSqKOSkREpMnCnidqLNAXP1T5\nMjMrDR4tE9a51szuTXjbnUBnM7vBzLY3s7OB44FbwoxVcmTVKrjySrY8/njW2WRTuuIYSw3wQ7DC\nCmA0ZhdSVjZAI+OIFLoBA/x9Ug8/7EfvW7684feIiIjkubD7VgwENgCmAV8mPP6YsM7mQPvaJ865\n+cBh+Pmh5uCHNu/vnEsesU8Kzccf+wk5r7gCLrmELRfMp/uAP2F2HrHYHwCIxXphdh5lZf0YM+b2\niAMWkaw44QQ/ct9LL/kh0L/7LuqIREREmiTUSpRzLuaca5HicV/COv2SJ7Bzzk13znVzzq3rnNvW\nOXd/mHFKyJyDceP8ZLmLFsGMGXDllZS0asX48eP49NNPOfPMUwEYOPB0Pv30U8aPH0eJuv2IFI9e\nveCFF+D992H//UGDxoiISAHTXb4Srq+/hsMPh4ED/Zwxb70Fe+yxxiqdOnWirKwMgP79+6sLn0ix\n2nNPmD7dV6D22Qfmz486IhERkUZRJUrC8+ijsNNOMGuW78pz551+Qk4Rab522glefRXicV+R+r/6\npg0UERHJT6pESfZVV/vJNo87DvbdF959Fw47LOqoRCRfdO7sK1Jt20L37jBzZtQRiYiIZESVKMmu\n6dNhl118K9TEifCPf8Cmm0YdlYjkm803h5dfhu23hwMOgBdfjDoiERGRtKkSJdnx44/wl7/AfvtB\nhw7w9tu+Ncos6shEJF9ttBE8/7zv1nfoofDYY1FHJCIikhZVoqTp3n0XdtsNbr0Vrr/eD2OswSFE\nJB3rrQdPPunnkDr+eLj77qgjEhERadBaUQcgBSweh5Ej4ZJLYLvt4D//8V35REQysfbaMGkSbLgh\n9O8P334LF1wQdVQiIiJ1UiVKGmfBAt9d7+WX4fzz4eqroWXLqKMSkULVogXccQdssglceKGfU+6a\na9QlWERE8pIqUZIZ5+CBB2DwYGjTxt8Mvv/+UUclIsXAzF+QadvWt0QtXgxjxvgKloiISB5RJUrS\nt2iRnzT3kUf8xLmjR/vuNyIi2XT++X7QibIy37Xv/vt9lz8REZE8oUqUpOfZZ+FPf/Kj8D30EJxw\nQtQRiUgx69fPX6Q56SQ48kg/XcJ660UdlYiICKDR+aQhy5bBoEFwyCGw885+JD5VoEQkF445Bp5+\nGmbMgIMO8q1SIiIieUCVKKnbzJnQtaufNHfMGHjmGdhii6ijEpHmpGdPmDoV5s6FHj3gq6+ijkhE\nRESVKElh5Uq44grYay8/eMRbb8HZZ2uULBGJxq67wvTpfqCJffaBefOijkhERJo5VaJkTXPn+pOU\nq66C4cN9N5rtt486KhFp7nbc0eejFi18jnr33agjEhGRZizUSpSZdTezJ83sCzOLm9mRDazfI1gv\n8VFjZpuFGafghy6/4w7o0sXfdzBjBlx+OZSURB2ZSEbMbKCZvW1m1cHj32Z2cNRxSRZ07AivvAKl\npbDvvvDaa1FHJEVKeUREGhL26HzrAXOAu4BH03yPA7YDlqxe4Nw32Q9NVvvqK+jf39/zNHAg3HST\nRsH6//buPEyq6szj+PctaEGIgAbTmAlgQxRNRJHFBGUVxS3RmBi1QTFKIxoUZeJEHXFJQuLghhJB\ngXbDQGeMDhMnorggIIuiAmISXGkxcemAS4sI2nad+eNctGl7K+jb51b17/M895G6dav6Zy1v1Vv3\n3nMkm/0DuBR4FTDgZ8CfzayXc25dyGDSCPLzYdEi+OEP4aijYN48GD6c0tJS5syZQ1lZGfn5+Ywc\nOZKCgoLQaSV7qY40M6ohkqlYmyjn3CPAIwBmGZ1Qs9E591E8qWQHDzwAY8dCy5bw0ENw/PGhE4ns\nEufcQ9VWTTSz84HvA/rykwvat/fTLpx6Ku4HP2DmoMGcv/AJUqk9SKW6kk5v4KqrrqKoaAzTpt1K\nnvaoS4ZUR5qPiooKxo27gOLiWaohkpEknhNlwBoze9vMHjWzw0MHyknl5XDWWXDKKX7Eq7/+VQ2U\n5BwzS5nZ6UAbQMd+5ZI2bWDePFZ26cqYJx5ntDuNysp3qKhYS2Xl2zh3M8XFdzFu3AWhk0qWUx3J\nbb6BugvnblENkYwkrYl6BxgL/AT4MX53+iIz6xU0Va5ZvNjP+TRvHtxzD9x/P3TsGDqVSKMxs4PM\nbDPwKTAdONk591LgWNLI1v/jHxz++mtMYxCz+CMXczv+iPC2wHicu4Hi4lmUlpYGTirZSHUk961f\nv57i4lk4dyNwIb5PBtUQaYhENVHOuVecc7Occ6udc08750YDy4EJobPlhE8/hf/4Dxg6FPbdF9au\nhVGjNHS55KKXgEOAw4DbgNlmdkDYSNLY5s6di7Vox3jmM5Hf8BjDGcRifCMFUEQqtQdz5swJGVOy\nl+pIjps7dy6p1B7A6Fq2UA2R2sU9sERjWAkcUd9GEyZMoH379jusKywspLCwMK5c2WXtWjjjDHj5\nZbjuOpgwwQ8VLLKTSkpKKCkp2WFdeXl5oDQ7cs59DmyfTGi1mR0GXAScX9ftVEeyS1lZGalUVyor\n2/JbJjKIxSxhCAN4iuX0J00bUqkulJWVhY4qtci1OqIakl2+rCFtatlCNSTpQtaQbGiieuEP86vT\nlClT6N27dxPEyTKVlXDTTX7Opx494Nln/aF8Iruopi8Gq1atok+fPoES1SkFtKpvI9WR7JKfn086\nvQH4BGjDEgZzOEtZQX/68Ryr2J90egP5+fmho0otcq2OqIZkl+o15Ku2qIYkXMgaEvc8UW3N7JAq\n5zR1iy53jq6/1szuqbL9RWZ2opl1N7PvmtnNwFDg1jhz5qw33oAjj4RLL4Xx42HlSjVQkvPM7HfR\nHHVdo3MargUGA38InU0a14gRI0inN+Nn0fCWM4DerGINvTiIl9i90jFy5MhwISUrqY40DzXVkB3d\nQTr9sWqI1Cjuc6L6AquB5/EHqd8IrAJ+FV3fCehcZfvdom3WAouAnsAw59yimHPmFudg9mzfML3x\nBixcCNdfD61bh04m0hS+AdyDP5/hcaAPMNw5tzBoKml03bp1o6hoDGa/AKbif02GZ/kuPZjJaxxE\n95aLaPd5+zrvR6QGqiPNwFdryNbomq3AVMwuoahojOaLkhrFPU/UYupo1JxzZ1e7fD1wfZyZct6m\nTX7C3Ace8INGTJ3q51QRaSacc0WhM0jTmTbNH6hQXHwxqdSVpFJdSKc38GL6Y84b8ib3L7qUQT3f\n59Gln/JvffcJnFayhepI81G1hpjdTzq9hFRqOM4t+2KeKJGaJGp0PtlFDz8MPXvCk0/Cn/7khy9X\nAyUiOSwvL4+ZM2fw+uuvc801/8HYsUP41a8u5fXXX2f6wht46qHNbP58d474fiWvPvZG6LgikjBV\na8jYsaMAOO+8n/H6668zc+YMTbQrtcqGgSWkPlu2+KHLb7sNjj0W7rwT9tEvriLSfBQUFDBx4sSv\nrO9xXDeWLXub4YO2MeCYdiwoeZlep/UIkFBEkqygoICioiJuuw1Gjx6NjuCT+mhPVLZ75hk49FC4\n+26YPh3mz1cDJSJSRefvfZMla9rTefeNDDm9E09NWxs6koiIZDk1UdmqogKuvhqOOAI6dIA1a+D8\n8zVxrohIDfY+sCMLX/4Wh3ZYz/AL9uOha54NHUlERLKYmqhs9PLLvnn67W/hyith2TLYf//QqURE\nEq3dt9rxcOmBDO+0lh/9qhdzL1geOpKIiGQpNVHZxDl/yN6hh8KHH8Ly5X5vlE56FBFpkNYdWvNA\naR9Gdn+GM6Z9n2mnLQkdSUREspCaqGzx9ttw3HEwbhycfTasXg2HHRY6lYhI1mnZuiV3vnQ4Fx36\nFBfcN4jfDFuES7vQsUREJItodL5scP/9MHYs7LabHzjiuONCJxIRyWqpliluem4QHYc/ycQnhvJe\nn8Xc9OxAUi3126KIiNRPnxZJVl7uJ8z96U9h6FB48UU1UCIijcRSxhWPD2X6aYuZumYgZ/dYzufb\nPg8dS0REsoD2RCXVokVw1ln+3KfZs+GMMzTynohIDM7/42A67L2cUbd+jw8Lnue/1x1C6w6tQ8cS\nEZEE056opNm2DS65BI48EgoKYO1aOPNMNVAiIjEq/P3h/PmaNTz2bk+OK1jHR//8KHQkERFJMDVR\nSfLCC9CvH/z+93D99bBwIXTtGjqViEizcPzV/Xh02mus/rAbR/b4JxvXbQodSUREEkpNVBJUVsJ1\n1/kGKpWC556DX/zC/1tERJrMgJ8fzOL/fpd/buvIwF4f8Y9n3g4dSUREEkjf0kN74w0/aMRll8GE\nCbByJfTsGTqViEizdcipPVj66FY+TedxxBGOlx9eHzqSiIgkjJqoUJyDu++Ggw+GN9/0A0lMngyt\nWoVOJiLS7H17WFeWrmjJHi23MuCEdqyasy50JBERSRA1USFs3Ag/+YmfNPfHP/aDRwwaFDqViIhU\n8W9992HJi3vRrc27DDnj31h8y5rQkUREJCFibaLMbKCZPWhmb5lZ2sxObMBthpjZ82a2zcxeMbOz\n4swYh9LSUiZNmsSFF17IpEmTKC0t/fLKhx7yh+stWeIn0b37bmjXLlhWERGp3df324snXtuXw/Z8\njWMuPoAHr3gmdCQREUmAuOeJagusAe4A/qe+jc1sX+AvwHRgBHAUUGxmbzvnHosvZuOoqKjggnHj\nmFVczB6pFF1TKTak01x11VWMO+ssbt5tN1rMnOknzL3jDthnn9CRRUSkHl/r9DUeeuO7jDhwNT/+\nXV/u3LSMUTOOCB1LREQCirWJcs49AjwCYNagiY7OB9Y7534ZXX7ZzAYAE4DEN1EXjBvHXcXF3OIc\noysraVNZyRZ8V9j77rv5vGVLWtx2G4wdq3mfRESySKt2rbhvfV/GHryCs2YO5IONi7nofwaHjiUi\nIoEk7Zyo7wOPV1u3AOgfIEtG1q9fz6ziYm50jguBNtH6tsBpwB5Az88/p/SYY9RAiYhkoRatWjJr\n3QB+ediTXDxvMFcNWoRLu9CxREQkgKQ1UZ2AsmrryoB2ZpboYevmzp3LHqkUo2u5vh1Q1qIFc+bM\nacpYIiLSiCxlTH5mKP917CJ+89QQLuy1hPTn6dCxRESkicV9TlSTmTBhAu3bt99hXWFhIYWFhU3y\n98vKyuiaStGmsrLG69sAXVIpysqq94gi2amkpISSkpId1pWXlwdKI9K0Ln14CHuduYSxfxjIB99e\nwd1/P4y8NnmhY4mISBNJWhP1LpBfbV0+8JFz7tO6bjhlyhR69+4dW7D65OfnsyGd5hO+PJSvqi3A\nhnSa/Pzq/3si2ammHylWrVpFnz59AiUSaVpj7h1Eh47LGXlzP8oLVnPf3w6iTceaPgFERCTXJO1w\nvhXAsGrrhkfrE23EiBFsTqe5o5br7wA+TqcZOXJkU8YSEZEY/XTK4fzlt2t58l/f5Zjur/LhBu2N\nFRFpDuKeJ6qtmR1iZr2iVd2iy52j6681s3uq3OT2aJvJZtbDzH4OnALcFGfOxtCtWzfGFBXxCzOm\nAp9E67cAU4FLzBhTVERBQUG4kCLNgJldbmYrzewjMyszs3lmtn/oXJK7hv9nXx6fsZ6/be7C0APf\noeyvG0NHkl2kOiIi9Yn7cL6+wJOAi5Ybo/X3AOfgB5LovH1j59wbZnYCMAUYD/wTGO2cqz5iXyLd\nOm0aABcXF3NlKkWXaJ6oj9NpxhQVfXG9iMRqIPB74Dl8jbsWeNTMDnTObQ2aTHJW/3N7smTvVxl+\nSgcG9N7CYws/Zd8B36K0tJQ5c+ZQVlZGfn4+I0eO1I9p2UF1RETqFPc8UYupY2+Xc+7sGtYtAbLy\npIq8vDxmzJzJZZdf/sWHZqdOnRgxYoQ+NEWaiHPu+KqXzexnwL/wdWVpiEzSPBx08n4sfeJNjj7a\nGDC4BScdNYHbHrvlK5Ovb/9RLS9PA1EkleqIiNQnaQNL5ISCggImTpwYOoaIeB3we8LfDx1Ecl+3\nIV1Y+mwZR/bdRMmjE5nEMi6ufPaLydfvAC4pLgZgxsyZQbNKRlRHRGQHSRtYQkSk0ZiZATcDS51z\nfw+dR5qHre228E7lALrxMr9jISs4EvCTr48HbnCOWcXFlJaWBs0pDaM6IiI1URMlIrlsOvAd4PTQ\nQaT5mDt3Lq7FZh7maAawlOOZzzx+9MX1RcAeqZQmX88eqiMi8hU6nE9EcpKZ3QocDwx0zr3TkNuE\nnrRbcsP2ydf3rvyEBzmRUczmFO5nFmM4h7s0+XoVSZ+0O9M6ohoi0rRC1hA1USKSc6IvPicBg51z\nbzb0dqEn7ZbcsOPk6xXMYSR78gGjuZMP2JPzuEmTr0eSPGn3ztQR1RCRphWyhuhwPhHJKWY2HRgJ\njAC2mFl+tLQOHE2aieqTr7cgzXR+zhVM4hJu5Ef8ls2Vmnw9yVRHRKQ+aqJEJNecB7QDFgFvV1lO\nDZhJmpGaJl834HKu5Ef8O4/znxx4wJN06aKpLxJMdURE6qTD+UQkpzjn9OOQBFf75Os3M3jgwTy1\n9CxGjIB774XddgscVr5CdURE6qMmSkREpJHVN/n6vHlw+ulw4onwwAPQtm3oxCIikgk1USIiIjGp\nbfL1k0+G+fPhRz+Co4+Ghx6CPfcMEFBERHaKdleLiIgEMGwYLFwIr7wCgwfDOw0aiF9ERJJATZSI\niEgg/frBkiXw/vswYACsXx86kYiINISaKBERkYC+8x1YtgxatPCN1Isvhk4kIiL1URMlIiISWNeu\n8NRTkJ8PgwbBihWhE4mISF3URImIiCRAfj4sWgQ9e8JRR8Gjj4ZOJCIitYm9iTKzcWZWamZbzexp\nM+tXx7aDzSxdbak0s2/EnVNERCS09u3hkUdg6FD4wQ/gT38KnUhERGoSaxNlZqcBNwJXA4cCLwAL\nzKxjHTdzwH5Ap2jZxzn3rzhzioiIJEWbNjBvHpx6Kpx2GsyaFTqRiIhUF/c8UROAGc652QBmdh5w\nAnAOcF0dt9vonPso5mwiIiKJlJcHs2fDXnvBuef60fsuvTR0KhER2S62JsrM8oA+wO+2r3POOTN7\nHOhf102BNWbWGvgrcI1zbnlcOUVERJIolYJbbvGN1GWXwXvvweTJYBY6mYiIxLknqiPQAiirtr4M\n6FHLbd4BxgLPAa2AMcAiMzvMObcmrqAiIiJJZAbXXOMbqYsu8o3UjBnQMu7jSEREpE6JKsPOuVeA\nV6qsetrMuuMPCzwrTCoREZGwxo+HPfeEs8+GDz+EuXOhVavQqUREmq84m6hNQCWQX219PvBuBvez\nEjiivo0mTJhA+/btd1hXWFhIYWFhBn9KRBqqpKSEkpKSHdaVl5cHSiOS+848Ezp0gJ/+FE44wQ8+\nscceoVOJiDRPsTVRzrkKM3seGAY8CGBmFl2emsFd9cIf5lenKVOm0Lt3752JKiI7oaYfKVatWkWf\nPn0CJRLJfT/8ISxY4P971FEwfz58/euhU4mIND9xzxN1EzDGzEaZ2QHA7UAb4G4AM7vWzO7ZvrGZ\nXWRmJ5pZdzP7rpndDAwFbo05p4iISFYYPNhPyltaCoMGwVtvhU4kItL8xNpEOefuAy4Bfg2sBg4G\njnHObYw26QR0rnKT3fDzSq0FFgE9gWHOuUVx5hQREckmvXvDU0/B5s1wxBHw6quhE4mINC9x74nC\nOTfdObevc25351x/59xzVa472zl3ZJXL1zvn9nPOtXXO7e2cG+acWxJ3RhERkWzTowcsWwa77w4D\nBsAajWErItJkYm+iREREJB6dO8OSJf6/Q4bA0qWhE4mINA9qokRERLLY3nvDwoX+EL/hw/1gEyIi\nEi81USIiIlmuXTvfPA0fDiedBNVmHxARkUamJkpERCQHtG4N998PZ5wBI0fC9OmhE4mI5K44J9sV\nERGRJtSyJdxxB+y5J4wbB++/D1dcAWahk4mI5BY1USIiIjkklYIbb/ST8E6cCO+95y+ndOyJiEij\nURMlIiKSY8z8Hqi99vJ7pD74AIqL/Z4qERHZdfpdSkRyjpkNNLMHzewtM0ub2YmhM4mEcP75MGeO\nX37yE9i2za8vLS1l0qRJXHjhhUyaNInS0tKwQRNGNaT5KS0tpbi4GIDi4mK9J6ReaqJEJBe1BdYA\nPwdc4CwiQRUWwp//DI89Bscem+ZnP7uI7t27c8011zNjxmKuueZ6unfvzrnnjqWioiJ03KRQDWkm\nKioqOPfcsXTv3p0ZM2YDMGPGbL0npF7asS8iOcc59wjwCICZTqkXOf54ePRRGDZsG4sXjwIOorJy\nJJWVbYAtwB0UF18CwMyZM0JGTQTVkOZj3LgLKC6+C+duwbkiANLpBcAsvSekTtoTJSIi0gx885vr\n+eyzw4EDgDFAm+iatsB4nLuB4uJZOoxJmo3169dTXDwL524ELgR2j67ZHb0npD5qokRERJqBuXPn\n0qJFKbV/9BeRSu3BnDlzmjKWSDBz584lldoDGF3LFnpPSO10OJ+ISGTChAm0b99+h3WFhYUUFhYG\nSiTSeMrKykilulJZuXstW7QhlepCWVlZk2UqKSmhpKRkh3Xl5eVN9vcbm2pIdvnyPdGmli2a/j0h\nmQlZQ9REiYhEpkyZQu/evUPHEIlFfn4+6fQG4BO+PJSvqi2k0xvIz89vskw1NRirVq2iT58+TZah\nMamGZJckvickMyFriA7nExERaQZGjBhBOr0ZuKOWLe4gnf6YkSNHNmUskWD0npBdoSZKRHKOmbU1\ns0PMrFe0qlt0uXPQYCIBdevWjaKiMZj9ApiK//Ud/Oh8UzG7hKKiMRQUFIQLmRCqIc2D3hOyK2Jv\nosxsnJmVmtlWM3vazPrVs/0QM3vezLaZ2StmdlbcGSUsTXAnMegLrAaex8/xciOwCvhVyFAioU2b\nditFRWdjdjEtWuxDXl5PWrTYB7OLKSo6m2nTbg0dMSlUQ5oJvSdkZ8V6TpSZnYYvPOcCK4EJwAIz\n2985t6mG7fcF/gJMB0YARwHFZva2c+6xOLNK06uoqIjmZ5iF2QCgiBkzZnP77ehVgJIAAA7NSURB\nVOdSVDSGadNuJS8vL3RMyULOucVoT7vIV+Tl5TFz5gwuv/wy5syZQ1lZGZ06dWLEiBH6tb0K1ZDm\nQ+8J2VlxDywxAZjhnJsNYGbnAScA5wDX1bD9+cB659wvo8svm/92PQFQE5VjNMGdiEgYBQUFTJw4\nMXQMkcTQe0IyFduvLGaWB/QBnti+zjnngMeB/rXc7PvR9VUtqGN7yVKa4E5EREREslWcu6o7Ai2A\n6oPrlwGdarlNp1q2b2dmrRo3noSkCe5EREREJFvlzDxRmuAuu2iCu+yXa5NkioiIiDRUnE3UJqAS\nqD5DWT7wbi23ebeW7T9yzn1a1x/TBHfZRRPcZb9cmyRTREREpKFiO5zPOVeBHxp02PZ1ZmbR5eW1\n3GxF1e0jw6P1kkM0wZ2IiIiIZKu4h++8CRhjZqPM7ADgdvxuh7sBzOxaM7unyva34ye0m2xmPczs\n58Ap0f1IDtEEdyIiIiKSrWI9J8o5d5+ZdQR+jT8sbw1wjHNuY7RJJ6Bzle3fMLMTgCnAeOCfwGjn\nXPUR+yQHbJ/Arrj4YlKpK0mlupBObyCd/viLeaJERERERJIm9oElnHPT8ZPn1nTd2TWsW4IfGl1y\nnCa4ExEREZFslDOj80n20gR3IiIiIpJN4j4nSkREREREJKeoiRIREREREcmAmigREREREZEMqIkS\nERERERHJgJooERERERGRDKiJEhERERERyYCaKBERERERkQyoiRIREREREcmAmigREREREZEMqIkS\nERERERHJgJooERERERGRDKiJEhERERERyYCaKBERERERkQyoiYpRSUlJ6Ag1Uq7MKJeElNTnWbky\no1wSSlKfY+XKjHIlT2xNlJntaWZzzKzczD4ws2Iza1vPbe4ys3S1ZX5cGeOW1BeWcmVGubKTmY0z\ns1Iz22pmT5tZv9CZdkZSn2flyoxyZadcqCNJfY6VKzPKlTxx7omaCxwIDANOAAYBMxpwu4eBfKBT\ntBTGFVBEcpOZnQbcCFwNHAq8ACwws45Bg4lI1lAdEZG6xNJEmdkBwDHAaOfcc8655cCFwOlm1qme\nm3/qnNvonPtXtJTHkVFEctoEYIZzbrZz7iXgPOAT4JywsUQki6iOiEit4toT1R/4wDm3usq6xwEH\nfK+e2w4xszIze8nMppvZXjFlFJEcZGZ5QB/gie3rnHMOX4P6h8olItlDdURE6tMypvvtBPyr6grn\nXKWZvR9dV5uHgQeAUqA7cC0w38z6R8WrJq0B1q1bt8uhG1t5eTmrVq0KHeMrlCszytVwVd6HrQPG\n6Ai0AMqqrS8DetRyG9WRDClXZpSr4bK0jqiGZEi5MqNcDddkNcQ51+AF39Sk61gqgf2By4F1Ndy+\nDBibwd8riO53aB3bjMDv4dKiRUtylhGZ1JbGXIB98HXje9XWTwZWqI5o0ZI1S9bUEVRDtGhJ4hJr\nDcl0T9QNwF31bLMeeBf4RtWVZtYC2Cu6rkGcc6Vmtgn4NvBkLZstAEYCbwDbGnrfIhKL1sC++Pdl\nKJvwP+jkV1ufT+31R3VEJDmysY6ohogkR5PUEIt+QWncO/UDS/wN6Oui86LMbDgwH/iWc65BjZSZ\nfQvYAJzknPtLowcVkZxkZk8DzzjnLoouG/AmMNU5d33QcCKSFVRHRKQusQws4fwoNguAWWbWz8yO\nAH4PlFRtoKLBI06K/t3WzK4zs++ZWVczGwb8L/AKYX+NEpHscxMwxsxGRT/q3A60Ae4OmkpEsonq\niIjUKq6BJcAfH3wrfiSbNHA/cFG1bfYD2kf/rgQOBkYBHYC38c3TVc65ihhzikiOcc7dF83l8mv8\n4TdrgGOccxvDJhORbKE6IiJ1ieVwPhERERERkVwV1zxRIiIiIiIiOSnrmygzG2dmpWa21cyeNrN+\ngfMMNLMHzewtM0ub2Ykh82xnZpeb2Uoz+yiazHieme2fgFznmdkLZlYeLcvN7NjQuaozs8ui5/Om\nwDmujnJUXf4eMtN2ZvZNM7vXzDaZ2SfR89o7dK76JK2GRJkSV0dUQ3aNakj9klJDdva1HtWSv0fZ\n15nZmdWuf7KGxz5tZv8XMle0zcXReeqfmNmbZnaTmbUKmcvMWprZVWb2WlSfV5vZMQ3JFN0+49pg\nZkPM7Hkz22Zmr5jZWTVs89Mo79bo/o9raKa4cpnZd8zs/uizLG1m4zPJFGOuIjNbYmbvR8tjluFn\nbEy5TjazZ83sAzP7OHptnZFJLoAg8y804jwOp+GHEh0FHADMAN4HOgbMdCz++OmT8Od5nRj6cYpy\nzQfOBA4EegJ/wQ/FunvgXCdEj1l3/FD2k4BPgQNDP2ZVMvbDD92/GrgpcJargbXA3vhpBL4B7JWA\nx6gDfpLsYqAP0BU4CigIna2e3ImrIVGuxNUR1ZBdyqgaUn+uxNSQnXmtA+cDHwKn4IdWPg34CDih\n2v/jN6os3wEqgDMD5xoBbI2u6xI97v8EbgicazLwD+CYaJvzgE+AQxqYK6PaEP2Nj4Hr8BMqj4ue\nn6OrbHN4tO7fo21+Hd3ndzJ4fcWRq2/0eJ0KvAWM34nXfRy57o2et4Px88jeCXwA7BM41yD852sP\n/Jy046tv06BsmT7ISVqAp4Fbqlw2/Bv/l6GzRXnSJODLTy3ZOkb5BoTOUkO294CzQ+eIsnwNeBk4\nEj9XWRK+AK0K/bjUkOu/gMWhc+xE7kTXkChTIuuIakiDs6iGNCxXYmtIQ17rwDJgcrV1NwBL6rjN\nxfhGYqd+iGisXPjRkx/LJHsT5XoLOK/aNvcDs3fhuay1NuCbkLXV1pUA86tc/iPwYLVtVgDTd/E1\ntku5ql1Xyk40UXHniq5PAeXAGUnKFW3zPPCrTHJk7eF8ZpaH/7Xqie3rnH8UHgf6h8qVRTrgZ3N+\nP3SQ7cwsZWan44eQXRE6T2Qa8H/OuYWhg1Sxn/nDvF43sz+YWefQgYAfAs+Z2X3R4RyrzKwodKi6\nqIbsMtWQhlENaZgk15CGvNZb8dVJdrcBh5lZi1pucw5+6petgXMtB/psP8zKzLoBxwMPBc7VCr/H\noaqtwIBMAzWwNnwfX/+rWsCOnwf9G7BNiFyNKsZcbYE8dvJzI65c5qdV2h9YnEmerG2i8L90tADK\nqq0vAzo1fZzsYWYG3Awsdc4FPxbezA4ys834YjkdONn5ucaCit6ovYDLQ2ep4mngZ/jDG87D74Ze\nYmZtQ4YCuuEPz3gZGA7cBkytfox7wqiG7CTVkIZRDclIImtIBq/1BUCRRedwmVlfYDT+C2PHGu73\nMOC7+MMXg+ZyzpXg91AuNbPPgFeBJ51zk0Pmirb5dzP7tnlHAz8G9skgTya1oRM1fx60sy/PD6tt\nm4w+M2LI1SiaINdk/B7G6k1Ok+cys3Zmtjl6zf8fcGGmP3bFOU+UJNd0/LHYR4QOEnkJOAQ/Z9gp\nwGwzGxTyS5CZfQv/QXCUS9A8Zc65qhNP/9XMVgIb8MdB3xUmFeB/kFnpnLsyuvyCmR2E/5J2b7hY\nEhPVkHqohmQsqTWkoa/13+DnklphZingXfykvL/EH9pW3WjgRefc86FzmdkQ4D/xj/VK/HknU83s\nHefcpFC58HOLzsS/v9PA6/hzas7JIE/iakOk2eUys8vwdWawc+6zBOTaHN3n14BhwBQzW++cW9LQ\nO8jmPVGb8Cdc51dbn49/M0oNzOxW/G76Ic65d0LnAXDOfe6cW++cW+2cuwJ4ga9OzNzU+uBPvF5l\nZhVmVgEMBi4ys8+iX9uCc86VA6/gP/RCegdYV23dOvxJykmlGrITVEMaTDUkM4mrIZm81p1z25xz\nRfjDjLric28ANrtqk/OaWRv8QAo7uxeqsXP9GrjXOXeXc+5vzrk/45uqy0Lmcs5tcs79ePs2zrkD\ngS34QVoaJMPa8C41fx585Jz7tJ5tMvrMiCFXo4grl5ldgm+Qj3bO/S0JuZy33jm31jk3BX++XUZH\nDWRtExX9svc8vnsEvtiNPAx/fK9UExW4k4Chzrk3Q+epQwp/LHRIj+NHGeqF/6XiEOA54A/4kYES\nMUu1mX0N/+Un9JfZZfhRbqrqgf9QTCTVkMyphmRENSQziaohO/tad85VOufejp7f0/GHCVV3KrAb\nMCchudoAn1e7yfa9VA1q9uN8vJxznznn3onOY/0J8L8Nvf8a1FUbVlDl8yAynB3Pvalpm6PZ9XMw\ndzVXXHY5l5n9ErgCOMY5tzopuTK8z5q5DEahSNqCL0SfsOPwxO8BewfM1Bb/YdkLX4Quji53DvxY\nTccPKzkQ35FvX1oHzvW7KFNX4CDgWnwxPzL066uGrEkYWet6/NCcXfFDrT6GP9b364Fz9cUfq3w5\nfhjSEfhd5aeHft7qyZ24GhLlSlwdUQ1plKyqIbXnSkwNachrPXrd3VPl8n7ASHxDehh+FLeNQJca\n7v8pYG5ScuHPh/oQv3dsX3xT8GpDM8aY6zDgZPx5ewPxP0y8BrRrYK46a0N0uWqmfaPX3GR8A/9z\n4DP8Ibnbt+kfvU63D3F+DX5AjEyGOI8jVx5ffma8FW17CNA9cK5Lo8fn5GqvjbaBc11GNIUC/rP/\nF9HzmtGork1amOJYogfnDfyILSuAvoHzDMZ/6amsttwZOFdNmSqBUYFzFeN3zW/F74J9lAR++Ymy\nLiT8F6AS/BDcW4E3gbkkZC4m/GEca/FNyd+Ac0JnamDuRNWQKFPi6ohqSKNkVQ2pO1siakhDXuv4\n88cWVrl8ALAKPz/NB8D/APvVcN/7R/eV8Ws0rlz4X+CvxB/WuSWqh1NpeLMSV65B0evgE+Bf0X10\nyuDxqrM2VM9U5W8+H93mVWqYwwu/N+ylaJu1+D0smTyPjZ4L32DU9DwsDJyrtJbXxlWBc/0GP4jN\nFvyh/UuBUzJ9T1p0ZyIiIiIiItIAWXtOlIiIiIiISAhqokRERERERDKgJkpERERERCQDaqJERERE\nREQyoCZKREREREQkA2qiREREREREMqAmSkREREREJANqokRERERERDKgJkpERERERCQDaqJERERE\nREQyoCZKREREREQkA2qiREREREREMvD/Y+QTMhGXw84AAAAASUVORK5CYII=\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", - "from math import *\n", - "\n", - "with open(\"2_segments.in\") as inp:\n", - " n = int(inp.readline()) # number of tests\n", - " per_row = 3\n", - " per_column = ceil(n / 3)\n", - " f, axes = plt.subplots(per_column, per_row, figsize=(10, 3 * per_column))\n", - " for i, axis in zip(range(0, n), axes.reshape(per_column * per_row)):\n", + "Point = entities.Point\n", + "Segment = entities.Segment\n", + "Event = entities.Event\n", + "Type = entities.Type\n", + "\n", + "def find_intersections(segments):\n", + " status = bintrees.RBTree()\n", + " events = bintrees.RBTree()\n", + " for s in segments:\n", + " events.insert(Event(s, Type.left), Event(s, Type.left))\n", + " events.insert(Event(s, Type.right), Event(s, Type.right)) \n", + " while not events.is_empty():\n", + " event, _ = events.pop_min()\n", + " handle_event_point(event)\n", + "\n", + "segments = []\n", + "with open(\"segments_set.in\") as inp:\n", + " n = int(inp.readline()) # number of segments\n", + " for i in range(0, n):\n", " x1, y1, x2, y2 = map(float, inp.readline().split())\n", - " s1 = Segment(Point(x1, y1), Point(x2, y2))\n", - " axis.scatter(x1, y1, c = 'r', s = 40)\n", - " axis.scatter(x2, y2, c = 'r', s = 40)\n", - " axis.plot([x1, x2], [y1, y2], c = 'r')\n", - " x3, y3, x4, y4 = map(float, inp.readline().split())\n", - " s2 = Segment(Point(x3, y3), Point(x4, y4))\n", - " axis.scatter(x3, y3, c = 'b', s = 40)\n", - " axis.scatter(x4, y4, c = 'b', s = 40)\n", - " axis.plot([x3, x4], [y3, y4], c = 'b')\n", - " axis.set_title(\"Segments intersect\" if check_intersection(s1, s2) != 0 else \"Segments don't intersect\")\n", - "\n", - "plt.show()" + " s = Segment(Point(x1, y1), Point(x2, y2), i)\n", + " segments.append(s)\n", + " plt.plot([x1, x2], [y1, y2], c = 'black')\n", + " plt.scatter(x1, y1, c = 'black', s = 30)\n", + " plt.scatter(x2, y2, c = 'black', s = 30)\n", + " \n", + "find_intersections(segments)\n", + " \n", + "plt.show() " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "На этом вступление заканчивается, и мы переходим к основной части конспекта, в которой будут разобраны более существенные и интересные задачи." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "collapsed": true - }, - "source": [ - "### Алгоритм Бентли-Оттмана\n", - "Данный алгоритм позволяет решить задачу, которая была анонсирована во вступлении. Напомню ее формулировку: дано множество $S = \\{ s_1, s_2, \\dots s_n \\}$, состоящее из $n$ отрезков на плоскости. Нужно найти множество точек, в которых эти отрезки пересекаются. \n", - "\n", - "Заметим, что пересекаться могут только ближайшие отрезки, поэтому нет смысла проверять на наличие пересечения отрезки, находящиеся далеко друг от друга. Для начала формально определим понятия \"ближайших\" и \"находящихся далеко друг от друга\" отрезков. Будем рассматривать ортогональные проекции отрезков на ось $X$. Если проекции двух отрезков не пересекаются, то будем говорить, что такие отрезки далеко друг от друга (очевидно, они не могут иметь общих точек). Следовательно, мы должны рассматривать только те отрезки, проекции которых пересекаются, то есть существует параллельная оси $Y$ прямая, пересекающая оба отрезка. Чтобы найти все такие отрезки, представим прямую $l$, скользящую по плоскости параллельно оси $Y$, начинающую свое движение из $-\\infty$. Эта прямая называется заметающей прямой (*sweep line*). Благодаря ей мы сможем отслеживать интересующие нас отрезки в каждый момент времени, что позволит нам найти все пересечения.\n", - "\n", - "Будем называть статусом заметающей прямой множество отрезков, пересекающих заметающую прямую в данный момент времени. Статус меняется при достижении так называемых событий (*event points*), для нас событиями являются точки начала и конца отрезков.\n", - "\n", - "На самом деле алгоритм совершает какие-то дейтвия только при достижении $l$ события: обновляется статус прямой и происходят проверки отрезков из множества на наличие пересечений. Например, если событие - \"левый конец отрезка\" $s_i$, то $s_i$ добавляется в статус и проверяется на пересечение с другими; при достижении события \"правый конец\" $s_i$ будет удален из множества. Однако такой алгоритм все еще не output-sensitive, поскольку есть ситуации, при которых происходит проверка $O(n^2)$ пар отрезков, хотя пересечений на самом деле много меньше: простейший пример - множество горизонтальных отрезков, пересекающих ось $Y$. Проблема в том, что два отрезка, пересекающих заметающую прямую, могут находиться далеко друг от друга в вертикальном направлении. \n", - "\n", - "Упорядочим отрезки, пересекающие заметающую прямую, снизу вверх: в зависимости от типа события, будем брать нужный конец отрезка и сравнивать его с соседями, в случае равенства точек, будем считать, что событие \"левый конец\" меньше. Точки будем сравнивать самым обычным образом:\n", - "$$ a < b \\Longleftrightarrow \\left[ \n", - " \\begin{gathered} \n", - " a.x < b.x \\\\ \n", - " a.x = b.x \\wedge a.y < b.y \\\\ \n", - " \\end{gathered} \n", - "\\right. $$\n", - "Таким образом, мы сможем отсечь отрезки, находящиеся далеко в вертикальном направлении. Соответственно, мы будем проверять на наличие пересечения только ближайшие в обоих направлениях отрезки. \n", - "\n", - "Теперь соберем все вместе и опишем алгоритм более формально:\n", - "\n", - "0. Заранее оговорим, что левый конец отрезка является его началом, правый - концом.\n", - "1. Из множества входных отрезков $S$ построим множество событий $events$, в котором каждый отрезок будет встречаться два раза - одно событие будет отвечать за его левый конец, другое - за правый.\n", - "2. Отсортируем $events$ по неубыванию. \n", - "3. Инициализируем $status$ пустым множеством. Для статуса нужна такая структура данных, которая бы позволила хранить элементы в отсортированном порядке и вставлять/извлекать данные не хуже, чем за $O(\\log{m})$, где $m$ - количество отрезков в статусе. Например, можно использовать сбалансированное бинарное дерево поиска. \n", - "4. Будем идти по отсортированному множеству событий. Каждое новое событие $e$ будем обрабатывать следующим образом:\n", - " 1. Проверяем, какого типа событие (начало или конец отрезка) мы встретили. Пусть инициатором этого события является отрезок $s$.\n", - " 2. Если событие - левый конец, то делаем следующее:\n", - " 1. Если $status = \\varnothing$, то просто добавляем $s$ в статус и переходим к следующему событию.\n", - " 2. В противном случае нам нужно найти соседей $s$ и проверить отрезки на наличие пересечений. Находим в статусе минимальный элемент, больший $s$ (если такого нет - берем максимальный). Пусть это будет отрезок $t$. Если $t$ - крайний элемент статуса (максимальный или минимальный), то мы проверяем пересечение только с ним. Если нет - то нужно проверить пересечение $s$ не только с $t$, но и с отрезком, идущим в статусе перед $t$ (то есть с соседями сверху и снизу).\n", - " 3. После проверки добавляем $s$ в статус.\n", - " 4. Переходим к следующему событию.\n", - " 3. Если событие - правый конец:\n", - " 1. Удаляем отрезок из статуса\n", - " 2. Теперь у двух отрезков могли поменяться соседи, поэтому если в статусе больше одного отрезка, то снова находим в статусе $t$ - минимальный элемент, больший $s$. Если такого нет, переходим к следующему событию. Если есть и он не крайний минимальный, то проверяем, пересекается ли он со своим нижним соседом.\n", - " 3. Переходим к следующему событию.\n", - " \n", - "После того, как будет обработано последнее событие, алгоритм завершает свою работу. Стоит учесть, что какие-то отрезки могут становиться соседями больше одного раза, и корректно обрабатывать такие ситуации. \n", + "Как видно из вышеприведенного кода, за обработку событий у нас будет отвечать функция *handle_event_point(event)*. В ней нужно будет обрабатывать каждый тип событий: проверять соседние отрезки на пересечение и искать новые события. Для реализации данной функции нам понадобится дополнительная, вычисляющая пересечение двух отрезков.\n", "\n", - "Точку пересечения $q$ двух непараллельных отрезков $a_1 b_1$ и $a_2 b_2$ можно найти следующим образом:\n", + "Из курса линейной алгебры мы знаем, что точку пересечения $q$ двух непараллельных отрезков $a_1 b_1$ и $a_2 b_2$ можно найти следующим образом:\n", "\n", "\\begin{equation} \n", "\\left( \\begin{array}{cc}\n", @@ -477,7 +217,7 @@ "\\begin{equation} \\left( \\begin{array}{c}\n", " x\\\\\n", " y\n", - "\\end{array} \\right) = \\large \n", + "\\end{array} \\right) = \n", "\\frac{\n", "\\left( \\begin{array}{cc}\n", "b_2.x - a_2.x & a_1.x - b_1.x\\\\\n", @@ -492,152 +232,96 @@ "\\left| \\begin{array}{cc}\n", "a_1.y - b_1.y & b_1.x - a_1.x\\\\\n", "a_2.y - b_2.y & b_2.x - a_2.x\n", - "\\end{array} \\right| } \\end{equation}\n", - "\n", - "Теперь, перед тем, как реализовывать алгоритм, нам нужно доказать корректность его работы.\n", - "\n", - "**Теорема**
\n", - ">Пусть $s_i$ и $s_j$ - два пересекающихся в точке $p$ отрезка. Предположим, что нет третьего отрезка, проходящего через $p$. Тогда существует событие, которое случится раньше, чем заметающая прямая $l$ достигнет $p$, при котором $s_i$ и $s_j$ станут соседями и будут проверены на пересечение.\n", - "\n", - "**Доказательство**
\n", - "$\\Box$ Пусть $l$ находится строго левее $p$. Если $l$ достаточно близка к $p$, то $s_i$ и $s_j$ должны быть соседями (более формально мы должны взять такое положение $l$, при котором между ней и вертикальной прямой, параллельной оси $Y$ и проходящей через точку $p$, нет событий). Другими словами, существует такое положение заметающей прямой, в котором отрезки будут соседями. С другой стороны $s_i$ и $s_j$ не были соседями, когда $l$ начинала свое движение, поскольку она стартует левее всех точек. Следовательно, по ходу ее движение должно было произойти событие $q$, при котором $s_i$ и $s_j$ стали соседями и были проверены на пересечение. $\\Box$ \n", - "\n", - "Теперь мы понимаем, что в таком виде алгоритм не находит пересечения трех и более отрезков, имеющих одну общую точку. То есть этот алгоритм можно использовать для ответа на вопрос \"есть ли в множестве такая пара отрезков, которая пересекается?\", но чтобы найти все пересечения, нужно добавить еще один шаг. Добавим к событиям еще один тип - пересечение отрезков. Будем проверять, если событие - это точка пересечения двух отрезков, то эти отрезки меняют порядок и у каждого появляется, возможно, новый сосед. Мы проверим каждую пару новых соседей в статусе на пересечение. Нас будут интересовать только пересечения правее заметающей прямой.\n", - "\n", - "**Теорема**
\n", + "\\end{array} \\right| } \\end{equation}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "// TODO\n", + "* упр на нахождение точки пересечения в однородных координатах\n", + "* упр на локализационную структуру или сортировку событий фильтрованным вычислением поворота (?)\n", + "* handle_event_point\n", + "* find_new_event" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [], + "source": [ + "def handle_event_point(event):\n", + " return 0;" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Теорема (корректность алгоритма)\n", ">Алгоритм находит все точки пересечения и отрезки, которые их содержат. \n", "\n", - "**Доказательство**
\n", - "$\\Box$ Воспользуемся индукцией по событиям, отсортированным в порядке $ q < p \\Longleftrightarrow \\left[ \n", - " \\begin{gathered} \n", - " q.x < p.x \\\\ \n", - " q.x = p.x \\wedge q.y < p.y \\\\ \n", - " \\end{gathered} \n", - "\\right. $. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ и отрезки, содержащие $p$, будут обработаны корректно. \n", + "$\\triangleright$
\n", + "Воспользуемся индукцией по событиям, отсортированным в вышеуказанном порядке. Предположим что все события $q : q < p$ были обработаны корректно. Докажем, что $p$ также будет корректно обработано и все отрезки, содержащие $p$, будут найдены. \n", "1. Если событие $p$ - точка пересечения отрезков, то по предыдущей теореме найдется предшествующее $p$ событие $q$ такое, что при его обработке отрезки, пересекающиеся в $p$, будут соседними в статусе. Следовательно, в этом случае $p$ будет обнаружена.\n", - "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$. $\\Box$ \n", + "2. Если $p$ - начало или конец отрезка, то она была добавлена в $events$ в самом начале работы алгоритма. Все содержащие её отрезки из статуса в момент обработки $p$ будут найдены. Для остальных отрезков, содержащих $p$, верно, что $p$ — их левый конец, и они будут найдены, так как мы храним их вместе с $p$ в $events$.\n", + "
\n", + "$\\triangleleft$\n", "\n", - "**Теорема**
\n", + "Следовательно, после того, как заметающая прямая пройдет всю плоскость, а точнее после того, как будет рассмотрено последнее событие, мы вычислим все точки пересечений отрезков из множества $S$. " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Теорема (оценка времени работы)\n", ">Время работы алгоритма - $O((n + I)\\log{n})$, где $I$ - количество пересечений.\n", "\n", - "**Доказательство**
\n", - "$\\Box$ На первом шаге алгорим строит множество событий $events$, вместе с сортировкой (или при использовании сбалансированного бинарного дерева в качестве структуры данных) это выполняется за $O(n\\log{n})$. Инициализация статуса занимает константное время.
Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\mid L(p) \\cup C(p) \\cup U(p) \\mid$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$.
Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\mid E \\mid) = O(\\mid E \\mid)$, где $\\mid E \\mid$ - количество ребер в графе. Пусть $\\mid V \\mid$ - количество вершин в графе, тогда $\\mid V \\mid \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\mid E \\mid = O(\\mid V \\mid)$. Таким образом, $O(\\mid E \\mid) = O(\\mid V \\mid) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$. $\\Box$" + "$\\triangleright$
\n", + "На первом шаге алгорим строит множество событий $events$, при использовании сбалансированного бинарного дерева в качестве структуры данных это выполняется за $O(n\\log{n})$. Инициализация статуса занимает константное время. \n", + "\n", + "Далее на каждой итерации мы обрабатываем по одному событию. Обработка может включать в себя удаление отрезка из статуса за $O(\\log{n})$ и проверку на пересечение отрезка с не более, чем двумя соседями, что может вызвать вставку новых событий (снова $O(\\log{n})$). Всего при обработке события $p$ мы $m(p) = \\left| L(p) \\cup C(p) \\cup U(p) \\right|$ раз выполняем операции вставки, удаления и поиска отрезка в статусе, где $L(p)$ - множество отрезков, верхний конец которых есть $p$, $C(p)$ - множество отрезков, внутри которых содержится $p$, и $U(p)$ - множество отрезков, нижний конец которых есть $p$. Пусть $m = \\sum_{p}^{}m(p)$. Тогда время работы алгоритма - $O(n\\log{n} + m\\log{n})$. Осталось показать, что $m = n + I$. \n", + "\n", + "Рассмотрим планарный граф, вершинами которого являются концы отрезков, а также их точки пересечения, а ребрами - части отрезков, их соединяющие. Рассмотрим событие $p$. Ему соответствует вершина графа со степенью $O(m(p))$. Следовательно, $m$ не превосходит суммы степеней всех вершин графа: $m = O(\\sum_{p}^{}deg(p))$. Каждое ребро графа добавляет $+1$ к степени ровно двух вершин, из чего следует, что $m = O(2\\left| E \\right|) = O(\\left| E \\right|)$, где $\\left| E \\right|$ - количество ребер в графе. Пусть $\\left| V \\right|$ - количество вершин в графе, тогда $\\left| V \\right| \\leqslant 2n + I$. Мы знаем, что в планарном графе $\\left| E \\right| = O(\\left| V \\right|)$. Таким образом, $O(\\left| E \\right|) = O(\\left| V \\right|) = O(2n + I)$. Следовательно, время работы алгоритма - $O((n + I)\\log{n})$.\n", + "
\n", + "$\\triangleleft$" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Требуемая память\n", + "Благодаря данному алгоритму можно сократить количество проверяемых отрезков с $n^2$ до $n + I$, что является отличным результатом. Теперь оценим затраты по памяти. Очевидно, что статус не может занимать больше $O(n)$ памяти, а вот очередь событий вполне может занимать $O(n + I)$, то есть если все пересечения окажутся правее заметающей прямой, то для очереди потребуется $O(n^2)$ памяти. Чтобы избежать этой оценки, поступают следующим образом: если два отрезка перестали быть соседями, то событие, отвечающее за их точку пересечения, удаляется из статуса. Таким образом, мы будем хранить не больше $O(n)$ событий, а на время работы алгоритма такая оптимизация не повлияет." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Теперь перейдем к практической реализации описанного алгоритма. Здесь будет дан каркас, читателю в качестве тренировки предлагается самому дописать недостающую часть. Входные данные должны находиться в файле *segments_set.in* в следующем формате: в первой строке задайте количество примеров $n$, в каждой из следующих $n$ строк укажите координаты начала и конца отрезка." + "// TODO \n", + "\n", + "это осталось с предыдущей версии, будет исправлено позже" ] }, { "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ - "import matplotlib.pyplot as plt\n", "import numpy as np\n", "from decimal import *\n", - "from enum import Enum\n", - "from blist import sortedset\n", "\n", "getcontext().prec = 70\n", - "step = 5\n", - "Type = Enum('Type', 'left right inter')\n", - "\n", - "class Type(Enum):\n", - " left = 0\n", - " right = 1\n", - " inter = 2\n", - " \n", - " def __lt__(self, other):\n", - " return self.value < other.value\n", - "\n", - "class Point:\n", - " __slots__ = (\"x\", \"y\")\n", - "\n", - " def __init__(self, x = 0.0, y = 0.0):\n", - " self.x = x\n", - " self.y = y\n", - "\n", - " def __sub__(self, p):\n", - " return Point(self.x - p.x, self.y - p.y)\n", - "\n", - " def __lt__(self, p):\n", - " return self.x < p.x or self.x == p.x and self.y < p.y\n", - "\n", - " def __eq__(self, p):\n", - " return self.x == p.x and self.y == p.y\n", - "\n", - " def __gt__(self, p):\n", - " return not (self < p or self == p)\n", - "\n", - " def __repr__(self):\n", - " return \"(%r, %r)\" % (self.x, self.y)\n", - " \n", - " def __hash__(self):\n", - " return hash(str(self))\n", - "\n", - "class Segment:\n", - " __slots__ = (\"a\", \"b\", \"id\")\n", - "\n", - " def __init__(self, a, b, id):\n", - " self.a = min(a, b)\n", - " self.b = max(a, b)\n", - " self.id = id\n", - "\n", - " def __lt__(self, s):\n", - " if s is None:\n", - " return False\n", - " if self.id == s.id:\n", - " return False\n", - " if self.a == s.a:\n", - " return self.b < s.b\n", - " return self.a < s.a\n", - "\n", - " def __eq__(self, s):\n", - " return self.id == s.id\n", - "\n", - " def __gt__(self, p):\n", - " return not (self < p or self == p)\n", - "\n", - " def __repr__(self):\n", - " return \"[%r: %r, %r]\" % (self.id, self.a, self.b)\n", - "\n", - "class Event:\n", - " __slots__ = (\"segment\", \"t\", \"addit_segment\", \"inter_point\") # addit_segment & inter_point are used only for type = inter\n", - "\n", - " def __init__(self, segment, t, addit_segment = None, inter_point = None):\n", - " self.segment = segment\n", - " self.t = t\n", - "\n", - " def __lt__(self, e):\n", - " a = self.segment.a if self.t == Type.left else \\\n", - " self.segment.b if self.t == Type.right else self.inter_point\n", - " b = e.segment.a if e.t == Type.left else \\\n", - " e.segment.b if e.t == Type.right else e.inter_point\n", - " if a == b:\n", - " if self.t == e.t:\n", - " if self.segment == e.segment:\n", - " return self.addit_segment < e.addit_segment\n", - " return self.segment < e.segment\n", - " return self.t < e.t\n", - " return a < b\n", - "\n", - " def __eq__(self, e):\n", - " return self.segment.id == e.segment.id and self.t == e.t\n", - "\n", - " def __gt__(self, e):\n", - " return not (self < e or self == e)\n", - "\n", - " def __repr__(self):\n", - " if type != Type.inter:\n", - " return \"Event [%r, type = %r]\" % (self.segment, self.t)\n", - " return \"Event inter [%r, %r, point = %r]\" % (self.segment, self.addit_segment, self.inter_point)\n", " \n", "def get_intersection_point(s1, s2):\n", " left = [[s2.b.x - s2.a.x, s1.a.x - s1.b.x], \n", @@ -646,52 +330,7 @@ " [s2.b.x * s2.a.y - s2.b.y * s2.a.x]]\n", " numerator = np.matmul(left, right)\n", " denominator = np.linalg.det([[s1.a.y - s1.b.y, s1.b.x - s1.a.x], [s2.a.y - s2.b.y, s2.b.x - s2.a.x]])\n", - " return Point(numerator[0][0] / denominator, numerator[1][0] / denominator)\n", - " \n", - "def get_intersections(events):\n", - " events.sort()\n", - " status = sortedset()\n", - " intersections = set()\n", - " \n", - " for e in events:\n", - " line_segment = e.segment\n", - " if e.t == Type.left:\n", - " # Находим соседей отрезка сверху и снизу, и, если они есть,\n", - " # проверяем отрезки на наличие пересечения. Добавляем\n", - " # новые события в статус.\n", - " status.add(line_segment)\n", - " if e.t == Type.right:\n", - " status.remove(line_segment)\n", - " # Если у каких-то отрезков поменялись соседи,\n", - " # проверим их. Добавляем новые события\n", - " # в статус.\n", - " if e.t == Type.inter:\n", - " # Меняем порядок отрезков и проверяем\n", - " # каждую пару новых соседей. Новые пересечения\n", - " # добавляем в статус.\n", - " return intersections\n", - "\n", - "max_x = max_y = min_x = min_y = 0\n", - "events = []\n", - "with open(\"segments_set.in\") as inp:\n", - " n = int(inp.readline()) # number of segments\n", - " for i in range(0, n):\n", - " x1, y1, x2, y2 = map(float, inp.readline().split())\n", - " s = Segment(Point(x1, y1), Point(x2, y2), i)\n", - " events.append(Event(s, Type.left))\n", - " events.append(Event(s, Type.right))\n", - " max_x = max(max_x, x1, x2)\n", - " max_y = max(max_y, y1, y2)\n", - " min_x = min(min_x, x1, x2)\n", - " min_y = min(min_y, y1, y2)\n", - " plt.plot([x1, x2], [y1, y2], c = 'black')\n", - " plt.scatter(x1, y1, c = 'black', s = 30)\n", - " plt.scatter(x2, y2, c = 'black', s = 30)\n", - " \n", - "intersections = get_intersections(events)\n", - "\n", - "plt.axis([min_x - step, max_x + step, min_y - step, max_y + step])\n", - "plt.show()" + " return Point(numerator[0][0] / denominator, numerator[1][0] / denominator)" ] }, { @@ -739,6 +378,17 @@ " print(\"\\t\", intersections if len(intersections) > 0 else \"{}\", \"found\")\n", "plt.show()" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Итак, мы научились решать задачу о нахождении всех точек пересечения множества отрезков за $O((n + I)\\log{n})$ времени и $O(n)$ памяти. Понятно, что в худшем случае данный алгоритм работает за $O(n^2\\log{n})$. Существуют алгоритмы, которые имеют лучшую временную оценку, например, в следующей статье описывается решение поставленной задачи за время $O(n\\log{n} + I)$ с сохранением оценки по памяти $O(n)$:\n", + "\n", + "* [Ivan J. Balaban - An optimal algorithm for finding segments intersections](https://pdfs.semanticscholar.org/f523/84b8cc2b44f91c1e4048c7bc0021f6e01b01.pdf)\n", + "\n", + "Однако алгоритмы Бентли-Оттмана и Ивана Балабана сложны в реализации, поэтому на практике используются достаточно редко. Чаще всего эта задача решается с использованием [квадродеревьев](https://github.com/CT-18/cg/tree/1_skip_quadtree), так как такой подход имеет ту же асимптотику и при этом более прост в реализации." + ] } ], "metadata": { diff --git a/22_segment_intersect/samples.py b/22_segment_intersect/samples.py deleted file mode 100644 index 6e82b02..0000000 --- a/22_segment_intersect/samples.py +++ /dev/null @@ -1,82 +0,0 @@ -import numpy as np -from decimal import * - -getcontext().prec = 70 - -class Point: - def __init__(self, x = 0.0, y = 0.0): - self.x = x - self.y = y - - def __sub__(self, p): - return Point(self.x - p.x, self.y - p.y) - - def __repr__(self): - return "(%r, %r)" % (self.x, self.y) - -class Segment: - def __init__(self, a, b): - self.a = a - self.b = b - - def __lt__(self, s): - return self.a < s.a or self.a == s.a and self.b < s.b - - def __repr__(self): - return "[%r, %r]" % (self.a, self.b) - -def calculate_det(a, b): - return a.x * b.y - b.x * a.y - -def calculate_arg(a, b): - return abs(a.x * b.y) + abs(b.x * a.y) - -def turn(s, c): - a = s.a - b = s.b - e = 8 * np.finfo(float).eps * calculate_arg(b - a, c - a) - det = calculate_det(b - a, c - a) - if det > e: - return 1 - if det < -e: - return -1 - - la = Point(Decimal(a.x), Decimal(a.y)) - lb = Point(Decimal(b.x), Decimal(b.y)) - lc = Point(Decimal(c.x), Decimal(c.y)) - ldet = calculate_det(lb - la, lc - la) - if ldet > 0: - return 1 - if ldet < 0: - return -1 - return 0 - -def convert_by_x(s): # s.a.x <= s.b.x - if s.a.x > s.b.x: - s.a, s.b = s.b, s.a - return s - -def convert_by_y(s): # s.a.y <= s.b.y - if s.a.y > s.b.y: - s.a, s.b = s.b, s.a - return s - -def bounding_box(s1, s2): - convert_by_x(s1) - convert_by_x(s2) - if not (s1.a.x <= s2.b.x and s1.b.x >= s2.a.x): - return 0 - convert_by_y(s1) - convert_by_y(s2) - if not (s1.a.y <= s2.b.y and s1.b.y >= s2.a.y): - return 0 - return 1 - -def check_intersection(s1, s2): - if bounding_box(s1, s2) == 0: - return 0 - if turn(s1, s2.a) * turn(s1, s2.b) > 0: - return 0 - if turn(s2, s1.a) * turn(s2, s1.b) > 0: - return 0 - return 1 \ No newline at end of file From 50d0a0023125551cf7e036f67e9df7ab1d3622ed Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Thu, 9 Feb 2017 23:22:43 +0400 Subject: [PATCH 13/19] a bit more --- 22_segment_intersect/entities.py | 99 ++++++++++++++++++ .../images/intersection_change_status.png | Bin 0 -> 7763 bytes .../images/intersection_point.png | Bin 0 -> 8858 bytes .../images/lower_endpoint.png | Bin 0 -> 7851 bytes .../images/several_intersections_case.png | Bin 0 -> 8330 bytes 22_segment_intersect/images/skew.png | Bin 0 -> 1858 bytes 22_segment_intersect/images/sweep_line.png | Bin 0 -> 10267 bytes .../images/sweep_line_visualization.gif | Bin 0 -> 102225 bytes .../images/upper_endpoint.png | Bin 0 -> 10842 bytes 9 files changed, 99 insertions(+) create mode 100644 22_segment_intersect/entities.py create mode 100644 22_segment_intersect/images/intersection_change_status.png create mode 100644 22_segment_intersect/images/intersection_point.png create mode 100644 22_segment_intersect/images/lower_endpoint.png create mode 100644 22_segment_intersect/images/several_intersections_case.png create mode 100644 22_segment_intersect/images/skew.png create mode 100644 22_segment_intersect/images/sweep_line.png create mode 100644 22_segment_intersect/images/sweep_line_visualization.gif create mode 100644 22_segment_intersect/images/upper_endpoint.png diff --git a/22_segment_intersect/entities.py b/22_segment_intersect/entities.py new file mode 100644 index 0000000..38a20c2 --- /dev/null +++ b/22_segment_intersect/entities.py @@ -0,0 +1,99 @@ +from enum import Enum +Type = Enum('Type', 'left right inter') + + +class Point: + __slots__ = ("x", "y") + + def __init__(self, x = 0.0, y = 0.0): + self.x = x + self.y = y + + def __add__(self, p): + return Point(self.x + p.x, self.y + p.y) + + def __sub__(self, p): + return Point(self.x - p.x, self.y - p.y) + + def __neg__(self): + return Point(-self.x, -self.y) + + def __lt__(self, p): + return self.x < p.x or self.x == p.x and self.y < p.y + + def __eq__(self, p): + return self.x == p.x and self.y == p.y + + def __gt__(self, p): + return not (self < p or self == p) + + def __repr__(self): + return "(%r, %r)" % (self.x, self.y) + + +class Segment: + __slots__ = ("a", "b", "id") + + def __init__(self, a, b, id): + self.a = min(a, b) + self.b = max(a, b) + self.id = id + + def __lt__(self, s): + if s is None: + return False + if self.id == s.id: + return False + if self.a == s.a: + return self.b < s.b + return self.a < s.a + + def __eq__(self, s): + return self.id == s.id + + def __gt__(self, p): + return not (self < p or self == p) + + def __repr__(self): + return "[%r, %r]" % (self.a, self.b) + + +class Type(Enum): + left = 0 + right = 1 + inter = 2 + + def __lt__(self, other): + return self.value < other.value + + +class Event: + __slots__ = ("segment", "t", "addit_segment", "inter_point") # addit_segment & inter_point are used only for type = inter + + def __init__(self, segment, t, addit_segment = None, inter_point = None): + self.segment = segment + self.t = t + + def __lt__(self, e): + a = self.segment.a if self.t == Type.left else \ + self.segment.b if self.t == Type.right else self.inter_point + b = e.segment.a if e.t == Type.left else \ + e.segment.b if e.t == Type.right else e.inter_point + if a == b: + if self.t == e.t: + if self.segment == e.segment: + return self.addit_segment < e.addit_segment + return self.segment < e.segment + return self.t < e.t + return a < b + + def __eq__(self, e): + return self.segment.id == e.segment.id and self.t == e.t + + def __gt__(self, e): + return not (self == e or self < e) + + def __repr__(self): + if type != Type.inter: + return "Event [%r, type = %r]" % (self.segment, self.t) + return "Event inter [%r, %r, point = %r]" % (self.segment, self.addit_segment, self.inter_point) \ No newline at end of file diff --git a/22_segment_intersect/images/intersection_change_status.png b/22_segment_intersect/images/intersection_change_status.png new file mode 100644 index 0000000000000000000000000000000000000000..814d61bf5d85c8519e34e86801bb02b9fc44f79c GIT binary patch literal 7763 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 literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/intersection_point.png b/22_segment_intersect/images/intersection_point.png new file mode 100644 index 0000000000000000000000000000000000000000..5e758793fcbeafba748ef51f1fcb8c7b83b82c49 GIT binary patch literal 8858 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 XIB*FXPa^^TPlBMLpebJ`3yJt2Jzdr< literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/lower_endpoint.png b/22_segment_intersect/images/lower_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..4dd98a54d4018c483417993704c17fa0dcf6b40e GIT binary patch literal 7851 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 R;D8xLU0GYHO5sK5{{WwvUm*Yh literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/several_intersections_case.png b/22_segment_intersect/images/several_intersections_case.png new file mode 100644 index 0000000000000000000000000000000000000000..b01051c382782f460a089b657d20ccf37782f52e GIT binary patch literal 8330 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 A6951J literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/skew.png b/22_segment_intersect/images/skew.png new file mode 100644 index 0000000000000000000000000000000000000000..d87561fe5d65b4adc6103fc8216ab6e88a366dac GIT binary patch literal 1858 zcmV-I2fg@-P)z0ssI2wUmUW00001b5ch_0Itp) z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D2G>bMK~#8N)tp;Q zQ%M-dL6BNf6GGxfCB{pF;DZLLiN;${BGLOQpbmaK5d&2&ZS9InMqbn)#p8Ccn(gIWu!E z^&9&NcUz6FxT?*KQGUMIjP#Tz#s6Mo%qp`E<0jeh+PLadBeojsmJ)4c4{nm5e{BY; zcK@>VPg`xyAGQ6sY3%y->)qYm7-Ru$2L940)rFNsXN+xMn#t*O4h;=qkOjeJ=( zznI_h>Uu{evcSH5`$|hoG01{o({J1w7_K${rygFve(i8LFvtSf40qO?`86^uxy}U# z)?n|Tw|ZW@cwsV`Fv!Aq-Hf=0du!4YGp=3B)#g{*y&b2xxcKPNqZniXd+~U!I9eTF z>gDI)wfPROUcEYe_%H@pn9ioXy*)cS8^a`yA3wf)`SOyIk`Es~;HDpDIvc=lw_|A% zF)=ZIets&IN}*6}+O&y^)^s)=k7ve=8M}7v+WkG|&YcT3UIGFF;B)@``S@cZMCt|x z2cYbGL`6jj9>AgsM+pJ!_ z`qQUR7#JgN11CT@&M`1X+{R|Jaby!07gt$XiGeZyx4MCugKR^UxJ^MpL1AGb2F8fn z$cebk{rmT2TUCkMw6wIqL>&WT#BDx*{tSyw42%)Cf!WraIdd>DM%-p}boA}pw-^{B zZUbnwT8fM9Y4FKr=gyt&?d=#?;**VR_+)eB$dQVQ3ZZN^n@uK@+s)*HyH7Tt(%9Gt zW9Nnq8~S|ee6oRYDk&)m3is~ai;RqfHad0c6pUZOUW)i+^EJ0_-C|KI0zTQmdTQaqg+lq~ z+W;^hh2awlT-emt*E^j~C~#pD9UU!Pj^x6oudi=pWc;287dCpm{>hUkP~gJm!i5V) zqY(;R*m&W>MyJ!Iq@+NB3!A2Bjqo;@&B@nR#ui%o27EUct>v8k@Eb~qfo*t~rC5~l0C*c>}{EHg8c z7n|YX@uyFCv8k)8%gxQ@#ipU5;q>X#yx0I7or`TY+oDB_c(HN2-7p#DsHH%qtgMU| z8)&IZmoD*Q18~$*TCFxaJDV39SXFUkGdenIFc>&$sl>!YUTm71o1w9IvFYgO$jHdx z#Ris}(b3Vo*Z>@zZ$5tfxMs~7UTi!bPh4CaM=e!aTDoJ$4h*!BY%_1(ye(U{V4#g; zo2;y?`1p7Xw2^Fc^5jYAIv8jp*=GCp?WJACf`fyF`%^P#&Qz<_xPu-NY$75e1Qh|LQu*f18{9_;2{ucXEJ2Y8pq{8d?IFPi z7Mk9c3J3@Y4-dy3^pIc!6Tg&{l%Sv>P=QWE{T3@A!A8L4a!vEf#SbFc27nI4=q)c2 z8+MS`96EH!Y&K({3W-fYK|xDP3kIr?*!1=FF?v*q#3nU0_5Ats7^p&G1817f&Q1(e zA+do0p}f2t164?D?%cTpjfH_KBsT0Iv9VgM2?+@ps6t``hc~04im;`cnwo@1PUu2t z6B-)Y(?kC~azdNN#zx^L2wezm^m;vup^DHZIXU^^!-p8?L1@DWLYw^je3(~Ypa-Fi z$z*!)-~k4D5ZVk346t}SoY3a(-MibiZNoqhLK~;k+0oH~VG;)p90&^wyLj=U)IUie zZ>h}8ObnA)w{D%VG*&1SQBhI8YmwK@(xppdrywLGL|7mT`1||Ar!Ox>5ZVCE&COL) zuwumu!2=L#XzkjySFT*aUrr6V&HDB0r+Tem<;s@T^^)vH&hy1WHv zBS{io$ZaeZ3-w6_xebf|Tp_pV?(U}kRw=m+j8nI7-^M@*a+{ksZ|3CWV4wuK4GYL^ w8X6ij8Vv?YklS>1br}o>43yxhrN+ko0Rmpy#Vu*;I{*Lx07*qoM6N<$g5?lyJpcdz literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/sweep_line.png b/22_segment_intersect/images/sweep_line.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c3d4e401e9e0bfc733ae5e2b6bc4fe3d9d8a0c GIT binary patch literal 10267 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

8E@WsnPzW{FA-Eh`%I;q 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

5NgfE^5X?@nCFx*G2hg`*C#5h ztgM$qiAP6A#ei?Eq>=wx8_?N;KY#vw^PqJBoE|RocQT-er^G1N4+Mw$%Gk%AtQ%-=yLX;%6fmEzzq?FTS{&0rl_-_+8t`hx$U;(u?y s5(wa2_;|$+^Kk@)|DQq}|1{9Ag`9CuJq}3jd-hC8UR|zQ=55IT0KBej3jhEB literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/sweep_line_visualization.gif b/22_segment_intersect/images/sweep_line_visualization.gif new file mode 100644 index 0000000000000000000000000000000000000000..e6fda0bc14c41402a30c98debae1552b7d93f370 GIT binary patch literal 102225 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 literal 0 HcmV?d00001 diff --git a/22_segment_intersect/images/upper_endpoint.png b/22_segment_intersect/images/upper_endpoint.png new file mode 100644 index 0000000000000000000000000000000000000000..46de0d96ea1ac7b5909d7acbbe68fe9d3c093db2 GIT binary patch literal 10842 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 literal 0 HcmV?d00001 From e72f15729221fe4024f6722e902ff0b6187d86c8 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Mon, 13 Feb 2017 20:16:48 +0400 Subject: [PATCH 14/19] first exercise --- .../Line_segment_intersection.ipynb | 122 ++++++------------ 22_segment_intersect/checker.py | 60 +++++++++ 22_segment_intersect/exercise_1_tests.py | 27 ++++ 22_segment_intersect/solutions.py | 36 ++++++ 4 files changed, 163 insertions(+), 82 deletions(-) create mode 100644 22_segment_intersect/checker.py create mode 100644 22_segment_intersect/exercise_1_tests.py create mode 100644 22_segment_intersect/solutions.py diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index a8c971a..62e69ee 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -4,7 +4,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "collapsed": true + "collapsed": false }, "outputs": [], "source": [ @@ -12,7 +12,9 @@ "import numpy as np\n", "import bintrees\n", "\n", - "import entities" + "import entities\n", + "import solutions\n", + "import checker" ] }, { @@ -232,7 +234,41 @@ "\\left| \\begin{array}{cc}\n", "a_1.y - b_1.y & b_1.x - a_1.x\\\\\n", "a_2.y - b_2.y & b_2.x - a_2.x\n", - "\\end{array} \\right| } \\end{equation}" + "\\end{array} \\right| } \\end{equation}\n", + "\n", + "Предположим, что два отрезка пересекаются (это, как мы знаем из конспекта про афинное пространство, легко проверяется с помощью предиката поворота и *bounding-box'а*). Сейчас Вам предлагается написать функцию, возвращающую точку пересечения этих отрезков. Для начала давайте будем работать в целых числах, то есть координаты концов отрезков будут целыми числами в $R^2$, а функция должна будет вернуть точку пересечения в однородных координатах. Если отрезки имеют больше одной точки пересечения, то вывести любую." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "def get_intersection_point(a, b, c, d): # концы отрезков в формате np.array([x, y])\n", + " # Заполните тело функции. Она должна возвращать точку пересечения\n", + " # отрезков ab и cd в однородных координатах.\n", + " return solutions.get_intersection_point(a, b, c, d) # точка пересечения в формате np.array([x, y, det])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Чтобы убедиться в корректности написанной Вами функции, запустите ее на наборе тестов:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "checker.check_first_exercise(plt, get_intersection_point)" ] }, { @@ -240,7 +276,6 @@ "metadata": {}, "source": [ "// TODO\n", - "* упр на нахождение точки пересечения в однородных координатах\n", "* упр на локализационную структуру или сортировку событий фильтрованным вычислением поворота (?)\n", "* handle_event_point\n", "* find_new_event" @@ -305,84 +340,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "// TODO \n", - "\n", - "это осталось с предыдущей версии, будет исправлено позже" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import numpy as np\n", - "from decimal import *\n", - "\n", - "getcontext().prec = 70\n", - " \n", - "def get_intersection_point(s1, s2):\n", - " left = [[s2.b.x - s2.a.x, s1.a.x - s1.b.x], \n", - " [s2.b.y - s2.a.y, s1.a.y - s1.b.y]]\n", - " right = [[s1.b.x * s1.a.y - s1.b.y * s1.a.x], \n", - " [s2.b.x * s2.a.y - s2.b.y * s2.a.x]]\n", - " numerator = np.matmul(left, right)\n", - " denominator = np.linalg.det([[s1.a.y - s1.b.y, s1.b.x - s1.a.x], [s2.a.y - s2.b.y, s2.b.x - s2.a.x]])\n", - " return Point(numerator[0][0] / denominator, numerator[1][0] / denominator)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Чтобы удостовериться в корректности написанного Вами алгоритма, запустите его на наборе тестов:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import Bentley_Ottmann_tests\n", - "test = Bentley_Ottmann_tests.test\n", - "\n", - "f, axes = plt.subplots(2, 3, figsize=(10, 6))\n", - "for i, axis in zip(range(1, 7), axes.reshape(6)):\n", - " axis.set_title(\"Test \" + str(i))\n", - " events = []\n", - " input = test(i)\n", - " n = input[0] # number of segments\n", - " for j in range(0, n):\n", - " x1, y1, x2, y2 = map(float, input[1][j].split())\n", - " s = Segment(Point(x1, y1), Point(x2, y2), j)\n", - " events.append(Event(s, Type.left))\n", - " events.append(Event(s, Type.right))\n", - " axis.scatter(x1, y1, s = 35)\n", - " axis.scatter(x2, y2, s = 35)\n", - " axis.plot([x1, x2], [y1, y2])\n", - " intersection_points = set()\n", - " for p in input[2]:\n", - " x, y = map(float, p.split())\n", - " intersection_points.add(Point(x, y))\n", - " intersections = get_intersections(events)\n", - " if intersection_points == intersections:\n", - " print(\"Test\", i, \"Ok\")\n", - " else:\n", - " print(\"Test\", i, \"Fail:\")\n", - " print(\"\\t\", intersection_points, \"expected but\")\n", - " print(\"\\t\", intersections if len(intersections) > 0 else \"{}\", \"found\")\n", - "plt.show()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "### Заключение\n", "Итак, мы научились решать задачу о нахождении всех точек пересечения множества отрезков за $O((n + I)\\log{n})$ времени и $O(n)$ памяти. Понятно, что в худшем случае данный алгоритм работает за $O(n^2\\log{n})$. Существуют алгоритмы, которые имеют лучшую временную оценку, например, в следующей статье описывается решение поставленной задачи за время $O(n\\log{n} + I)$ с сохранением оценки по памяти $O(n)$:\n", "\n", "* [Ivan J. Balaban - An optimal algorithm for finding segments intersections](https://pdfs.semanticscholar.org/f523/84b8cc2b44f91c1e4048c7bc0021f6e01b01.pdf)\n", diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py new file mode 100644 index 0000000..977ade5 --- /dev/null +++ b/22_segment_intersect/checker.py @@ -0,0 +1,60 @@ +from fractions import * +import numpy as np + +import exercise_1_tests +import Bentley_Ottmann_tests + + +def check_first_exercise(plt, get_intersection_point): + test = exercise_1_tests.test + + def calculate_det(a, b): + return a[0] * b[1] - b[0] * a[1] + + def bounding_box(p, a, b): + if a > b: + a, b = b, a + return a <= p <= b + + def check_overlap(p, a, b): + orientation = np.sign(calculate_det(b - a, p - a)) + if orientation != 0: + return False + return bounding_box(p[0], a[0], b[0]) and bounding_box(p[1], a[1], b[1]) + + def drow_points(axis, points, color): + for point in points: + axis.scatter(point[0], point[1], c=color, s=40) + + def drow_segments(axis, a, b, color): + axis.plot([a[0], b[0]], [a[1], b[1]], c=color) + + f, axes = plt.subplots(2, 4, figsize=(11, 6)) + print("Part 1. Intersection tests") + for i, axis in zip(range(1, 9), axes.reshape(8)): + axis.set_title("Test " + str(i)) + a, b, c, d, answ = test(i) + output = get_intersection_point(a, b, c, d) + drow_points(axis, [a, b], 'r') + drow_segments(axis, a, b, 'r') + drow_points(axis, [c, d], 'b') + drow_segments(axis, c, d, 'b') + if Fraction(answ[0], answ[2]) == Fraction(output[0], output[2]) \ + and Fraction(answ[1], answ[2]) == Fraction(output[1], output[2]): + print("Test", i, "Ok") + else: + print("Test", i, "Failed:") + print("\t[x= {}, y= {}, det= {}]".format(answ[0], answ[1], answ[2]), "expected but") + print("\t[x= {}, y= {}, det= {}]".format(output[0], output[1], output[2]), "found") + print("Part 2. Overlap tests") + for i in range(9, 21): + a, b, c, d = test(i) + output = get_intersection_point(a, b, c, d) + if check_overlap(output[:2] / output[2], a, b) and check_overlap(output[:2] / output[2], c, d): + print("Test", i, "Ok") + else: + print("Test", i, "Fail") + print("\ta={}, b={}, c={}, d={}".format(a, b, c, d)) + print("\tYour answer:", output) + + plt.show() diff --git a/22_segment_intersect/exercise_1_tests.py b/22_segment_intersect/exercise_1_tests.py new file mode 100644 index 0000000..3fabccc --- /dev/null +++ b/22_segment_intersect/exercise_1_tests.py @@ -0,0 +1,27 @@ +import numpy as np + + +def test(id) : + return { + 1: [np.array([1, 1]), np.array([3, 3]), np.array([3, 3]), np.array([3, 2]), np.array([-6, -6, -2])], + 2: [np.array([1, 1]), np.array([4, 5]), np.array([2, 1]), np.array([2, 5]), np.array([24, 28, 12])], + 3: [np.array([-18, -34]), np.array([62, 15]), np.array([83, 7]), np.array([-8, 16]), np.array([277978, 51274, 5179])], + 4: [np.array([0, 0]), np.array([1, 4]), np.array([2, 2]), np.array([0, 3]), np.array([6, 24, 9])], + 5: [np.array([0, 0]), np.array([7, 1]), np.array([0, 1]), np.array([7, 0]), np.array([-49, -7, -14])], + 6: [np.array([1, 2]), np.array([4, 2]), np.array([4, 2]), np.array([7, 2]), np.array([4, 2, 1])], + 7: [np.array([0, 0]), np.array([5, 2]), np.array([3, 0]), np.array([2, 2]), np.array([30, 12, 12])], + 8: [np.array([10, 1]), np.array([100, 80]), np.array([30, 2]), np.array([-60, 95]), np.array([330300, 169530, 15480])], + + 9: [np.array([-1, 1]), np.array([3, 1]), np.array([1, 1]), np.array([5, 1])], + 10: [np.array([-2, -2]), np.array([-2, 6]), np.array([-2, 3]), np.array([-2, 10])], + 11: [np.array([1, 1]), np.array([5, 5]), np.array([3, 3]), np.array([7, 7])], + 12: [np.array([10, -10]), np.array([1, -1]), np.array([-5, 5]), np.array([5, -5])], + 13: [np.array([-80, -80]), np.array([30, -80]), np.array([30, -80]), np.array([-80, -80])], + 14: [np.array([8, -70]), np.array([8, 70]), np.array([8, -70]), np.array([8, 70])], + 15: [np.array([-15, -15]), np.array([32, 32]), np.array([32, 32]), np.array([-15, -15])], + 16: [np.array([-15, 132]), np.array([14, 14]), np.array([14, 14]), np.array([-15, 132])], + 17: [np.array([4, 18]), np.array([4, 46]), np.array([4, 46]), np.array([4, 43])], + 18: [np.array([6, -17]), np.array([8, -17]), np.array([33, -17]), np.array([6, -17])], + 19: [np.array([3, 18]), np.array([15, 1]), np.array([27, -16]), np.array([3, 18])], + 20: [np.array([-1, -1]), np.array([8, 8]), np.array([-1, -1]), np.array([101, 101])] + }.get(id) diff --git a/22_segment_intersect/solutions.py b/22_segment_intersect/solutions.py new file mode 100644 index 0000000..18772fa --- /dev/null +++ b/22_segment_intersect/solutions.py @@ -0,0 +1,36 @@ +import numpy as np + + +def point_belongs_to_segment(p, a, b): # as we know both segments lay on the same line + left, right, p_ = 0, 0, 0 + if a[0] == b[0]: + left, right, p_ = a[1], b[1], p[1] + else: + left, right, p_ = a[0], b[0], p[0] + if left > right: + left, right = right, left + return left <= p_ <= right + + +def get_intersection_point(a, b, c, d): + left = [[d[0] - c[0], a[0] - b[0]], + [d[1] - c[1], a[1] - b[1]]] + right = [[b[0] * a[1] - b[1] * a[0]], + [d[0] * c[1] - d[1] * c[0]]] + numerator = np.matmul(left, right) + denominator = (a[1] - b[1]) * (d[0] - c[0]) - (b[0] - a[0]) * (c[1] - d[1]) + if denominator != 0: + return np.array([numerator[0][0], numerator[1][0], denominator]) + p = None + if point_belongs_to_segment(a, c, d): + p = a + elif point_belongs_to_segment(b, c, d): + p = b + elif point_belongs_to_segment(c, a, b): + p = c + elif point_belongs_to_segment(d, a, b): + p = d + if p is None: + raise Exception('Incorrect test!') + return np.array([p[0], p[1], 1]) + From 4b15400fa64161f177da9745ca578fcc1f22914c Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Fri, 24 Feb 2017 00:08:11 +0400 Subject: [PATCH 15/19] problem with noninteger values --- 22_segment_intersect/Bentley_Ottmann_tests.py | 4 +- .../Line_segment_intersection.ipynb | 85 +++++++++++++++---- 22_segment_intersect/checker.py | 22 +++++ 22_segment_intersect/entities.py | 36 ++------ 22_segment_intersect/segments_set.in | 11 ++- 5 files changed, 106 insertions(+), 52 deletions(-) diff --git a/22_segment_intersect/Bentley_Ottmann_tests.py b/22_segment_intersect/Bentley_Ottmann_tests.py index 828d070..9d2635e 100644 --- a/22_segment_intersect/Bentley_Ottmann_tests.py +++ b/22_segment_intersect/Bentley_Ottmann_tests.py @@ -22,7 +22,7 @@ def test(id) : "4 3", "5 3", "4 1"]], - 3: [4, + 3: [4, # TODO: change this sample (?) ["12 455 35 -61", "123 46 -166 -181", "-100 -13 56 700", @@ -70,7 +70,7 @@ def test(id) : "20 30 20 21", "20 20 0 20"], []], - 6: [9, + 6: [9, # TODO: change this sample ["-230 48 -84 116", "-137 18 -94 342", "-300 270.4532564500349 -31 0", diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index 62e69ee..b220e74 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -11,6 +11,7 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import bintrees\n", + "from cg import Point # see https://github.com/CT-18/cg_common\n", "\n", "import entities\n", "import solutions\n", @@ -84,7 +85,7 @@ "source": [ "Теперь давайте обсудим, какие структуры данных нам понадобятся для реализации алгоритма. На самом деле их всего две: очередь событий $\\Omega$ и статус $T$. \n", "\n", - "Как раньше было показано, алгоритм совершает какие-то действия только при достижении заметающей прямой какого-либо события. Следовательно, программно сэмитировать движение $l$ мы можем просто рассматривая события в том порядке, в котором прямая настигла бы их по ходу своего движения справа налево. Определим отношение \"меньше\" для двух событий $p$ и $q$: будем считать, что событие \"левый конец\" меньше события \"пересечение\", а последнее меньше собятия \"правый конец\". Если события одного типа, то \n", + "Как раньше было показано, алгоритм совершает какие-то действия только при достижении заметающей прямой какого-либо события. Следовательно, программно сэмитировать движение $l$ мы можем просто рассматривая события в том порядке, в котором прямая настигла бы их по ходу своего движения справа налево. Определим отношение \"меньше\" $\\prec$ для двух событий $p$ и $q$: будем считать, что событие \"левый конец\" меньше события \"пересечение\", а последнее меньше собятия \"правый конец\". Если события одного типа, то \n", "$$ p < q \\Longleftrightarrow \\left[ \n", " \\begin{align} \n", " &p_x < q_x \\\\ \n", @@ -123,7 +124,7 @@ "Отметим, что началом отрезка будем считать тот его конец, который меньше второго в лексикографическом порядке.\n", "\n", "Теперь вернемся к трем случаям, о которых мы временно забывали, и рассмотрим, как обрабатывается каждый из них:\n", - "1. Если в множестве $S$ есть вертикальный отрезок $s_i$, то в очереди $\\Omega$ у нас будут лежать два события с одинаковыми $x$-координатами, отвечающие за начало и конец $s_i$. Благодаря вышеопределенному порядку, сначала будет рассмотрено событие \"начало отрезка\", так как его $y$-координата меньше, и отрезок будет проверен на пересечение с соседями. Через какое-то время будет рассмотрено событие \"конец отрезка\" и будут проведены соответствующие проверки. То есть случай вертикального отрезка ничем не отличается от случая невертикального, и нам не нужно совершать никаких дополнительных действий для его обработки. Для лучшего понимания можно просто представить, что заметающая прямая не вертикальная, а наклонена от вертикальной оси под очень небольшим углом влево, как на рисунке справа (такой прием называется *skew*). Тогда очевидно, что нижний конец вертикального отрезка всегда будет достигаться первым.

\n", + "1. Если в множестве $S$ есть вертикальный отрезок $s_i$, то в очереди $\\Omega$ у нас будут лежать два события с одинаковыми $x$-координатами, отвечающие за начало и конец $s_i$. Благодаря вышеопределенному порядку $\\prec$, сначала будет рассмотрено событие \"начало отрезка\", так как его $y$-координата меньше, и отрезок будет проверен на пересечение с соседями. Через какое-то время будет рассмотрено событие \"конец отрезка\" и будут проведены соответствующие проверки. То есть случай вертикального отрезка ничем не отличается от случая невертикального, и нам не нужно совершать никаких дополнительных действий для его обработки. Для лучшего понимания можно просто представить, что заметающая прямая не вертикальная, а наклонена от вертикальной оси под очень небольшим углом влево, как на рисунке справа (такой прием называется *skew*). Тогда очевидно, что нижний конец вертикального отрезка всегда будет достигаться первым.

\n", "2. Для случая, когда два отрезка накладываются друг на друга, мы просто заранее должны решить, что мы хотим от алгоритма в таких ситуациях. То есть для корректной обработки в этом случае нужно четкое определение того, что ожидается на выходе. Это может быть любая точка из общих точек двух отрезков, может быть конкретно обозначенная. Кроме того может быть кому-то понадобится возвращать список пар пересекающихся отрезков, в таком случае это опять же не будет выбиваться из общей картины.

\n", "3. Теперь разберем случай, когда в одной точке пересекается больше двух отрезков. Так как у нас события отсортированы в порядке \"начало отрезка\" < \"пересечение отрезков\" < \"конец отрезка\", то случаи, когда в точке пересечения отрезков начинаются или заканчиваются другие отрезки, вписывается в общую картину и не требуют отдельного рассмотрения. Теперь вспомним, что в точке пересечения мы меняем порядок пересекающихся отрезков в статусе и проверяем их на пересечение с новыми соседями. Поэтому сколько бы отрезков не пересекалось в точке, благодаря таким перестановкам все пары пересекающихся отрезков будут найдены. Рассмотрим пример справа. Кратко опишем действия алгоритма: сначала в пустой статус добавляется отрезок $s_1$, далее - отрезок $s_2$, после проверки находится пересечение $s_2$ с $s_1$, далее в статус добавляется $s_3$ и находится пересечение $s_3$ с $s_1$. После этого добавляются $s_4$, $s_5$ и $s_6$, при добавлении последнего находятся пересечения $s_6$ с $s_1$ и $s_6$ с $s_3$. Если бы мы не рассматривали события \"пересечение отрезков\", то далее алгоритм прошел бы по событиям \"конец отрезка\", не нашел бы больше пересечений (поскольку мы берем только пересечения правее) и завершил свою работу. Но так как у нас три типа событий, то после добавления $s_6$ алгоритм перейдет к обработке события \"пересечение отрезков $s_2$ и $s_1$\", и проверит на пересечение $s_2$ и $s_3$ (найдет новое пересечение) и $s_1$ и $s_4$, далее будут обработаны события \"пересечение $s_1$ и $s_3$\" и \"пересечение $s_6$ и $s_1$\". Во время проверки последнего $s_6$ и $s_1$ поменяются местами и на пересечение будут проверены пары $s_6$ с $s_2$ (найдет новое пересечение) и $s_1$ с $s_3$. Далее будут проверены события \"пересечение $s_6$ и $s_3$\" (указанные отрезки поменяются местами и будут проверены пары $s_3$ с $s_1$ и $s_6$ с $s_5$), \"пересечение $s_6$ и $s_2$\", после чего отрезки в порядке $s_2$, $s_4$, $s_3$, $s_5$, $s_1$, $s_6$ будут удалены из статуса. Таким образом, алгоритм найдет шесть пар пересекающихся отрезков." ] @@ -133,7 +134,7 @@ "metadata": {}, "source": [ "### Реализация алгоритма\n", - "Ранее мы подробно обсудили идею алгоритма, теперь давайте соберем все вместе и начнем практическую реализацию. Здесь будет дан каркас основных моментов и описание их ожидаемой функциональности, читателю в качестве тренировки предлагается самому дописать недостающие части. Входные данные содержатся в файле *segments_set.in* в следующем формате: в первой строке задано $n$ - количество отрезков в множестве $S$, в каждой из следующих $n$ строк указаны координаты начала и конца соответствующего отрезка.\n", + "Ранее мы подробно обсудили идею алгоритма, теперь давайте соберем все вместе и напишем практическую реализацию. Здесь будет дан каркас основных моментов и описание их ожидаемой функциональности, читателю в качестве тренировки предлагается самому дописать недостающие части. Входные данные содержатся в файле *segments_set.in* в следующем формате: в первой строке задано $n$ - количество отрезков в множестве $S$, в каждой из следующих $n$ строк указаны координаты начала и конца соответствующего отрезка. Все координаты являются целыми числами.\n", "\n", "**Input:** Множество отрезков на плоскости $S$.
\n", "**Output:** Множество точек пересечения отрезков из $S$." @@ -143,7 +144,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Итак, опишем алгоритм *in general*, пока не рассматривая обработку событий и другие детали: \n", + "Теперь давайте опишем алгоритм *in general*, пока не рассматривая обработку событий и другие детали: \n", "1. Инициализируем $status$ пустым множеством.\n", "2. Инициализируем множество событий $events$ пустым множеством.\n", "3. Вставим в $events$ события начал и концов отрезков из $S$.\n", @@ -162,35 +163,43 @@ }, "outputs": [], "source": [ - "Point = entities.Point\n", "Segment = entities.Segment\n", "Event = entities.Event\n", "Type = entities.Type\n", "\n", + "def get_unique_elements(list):\n", + " unique = []\n", + " for point in list:\n", + " if point not in unique:\n", + " unique.append(point)\n", + " return unique\n", + "\n", "def find_intersections(segments):\n", " status = bintrees.RBTree()\n", " events = bintrees.RBTree()\n", + " intersection_points = []\n", " for s in segments:\n", " events.insert(Event(s, Type.left), Event(s, Type.left))\n", " events.insert(Event(s, Type.right), Event(s, Type.right)) \n", " while not events.is_empty():\n", " event, _ = events.pop_min()\n", - " handle_event_point(event)\n", + " intersection_points.extend(handle_event_point(events, status, event)) # declared below\n", + " return get_unique_elements(intersection_points)\n", "\n", "segments = []\n", "with open(\"segments_set.in\") as inp:\n", " n = int(inp.readline()) # number of segments\n", " for i in range(0, n):\n", - " x1, y1, x2, y2 = map(float, inp.readline().split())\n", + " x1, y1, x2, y2 = map(int, inp.readline().split())\n", " s = Segment(Point(x1, y1), Point(x2, y2), i)\n", " segments.append(s)\n", " plt.plot([x1, x2], [y1, y2], c = 'black')\n", " plt.scatter(x1, y1, c = 'black', s = 30)\n", " plt.scatter(x2, y2, c = 'black', s = 30)\n", - " \n", - "find_intersections(segments)\n", - " \n", - "plt.show() " + "\n", + "print(find_intersections(segments))\n", + "\n", + "plt.show()" ] }, { @@ -275,10 +284,33 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "// TODO\n", - "* упр на локализационную структуру или сортировку событий фильтрованным вычислением поворота (?)\n", - "* handle_event_point\n", - "* find_new_event" + "Теперь вернемся к обработке событий. Мы уже не раз повторили, что обработка события состоит из (не всегда) вставки или удаления нового отрезка из статуса и (всегда) из тестирования соседей на пересечение. Логика этой функции описана ниже.\n", + "\n", + "Для начала введем несколько обозначений:\n", + "* $U(p)$ - множество отрезков, верхний конец которых есть $p$\n", + "* $C(p)$ - множество отрезков, внутри которых содержится $p$\n", + "* $L(p)$ - множество отрезков, нижний конец которых есть $p$\n", + "\n", + "Теперь опишем последовательность операций, необходимых для обработки очередного события:\n", + "1. Найдем в статусе все отрезки, содержащие $p$. \n", + "2. Если $U(p) \\cup C(p) \\cup L(p)$ содержит больше одного отрезка, то $p$ - точка пересечения всех отрезков (каждого с каждым) в этом объединении.\n", + "3. Удалим из статуса отрезки из объединения $C(p) \\cup L(p)$.\n", + "4. Вставим отрезки из объединения $U(p) \\cup C(p)$ в статус. Порядок этих отрезков в $T$ должен соответствовать порядку, в котором отрезки пересекут заметающую прямую в следующий момент времени (то есть после пересечения). В частности, мы удаляем и заново вставляем отрезки из множества $C(p)$, чтобы обновился их порядок.\n", + "5. Если объединение $U(p) \\cup C(p) = \\varnothing$, то делаем следующее:\n", + " 1. Обозначим за $s_{left}$ левого соседа $p$ в $T$.\n", + " 2. Обозначим за $s_{right}$ правого соседа $p$ в $T$.\n", + " 3. Если оба отрезка $s_{left}$ и $s_{right}$ существуют, то мы должны проверить, не породят ли они новые события. Эту часть можно вынести в отдельную функцию, так как такая проверка нам будет нужна еще не раз. Сигнатура у неё будет следующая: *find_new_event(s_left, s_right, p)*. Подробнее опишем её чуть ниже.\n", + "6. Если $U(p) \\cup C(p) \\ne \\varnothing$, то:\n", + " 1. Обозначим за $s_{bound}$ самый левый отрезок из $U(p) \\cup C(p)$ в $T$.\n", + " 2. Обозначим за $s_{left}$ левого соседа $s_{bound}$ в $T$.\n", + " 3. Если оба отрезка существуют, то проверим их на новые события: вызовем *find_new_event*, передав в качестве параметров последовательно $s_{left}$, $s_{bound}$, $p$.\n", + " 4. Обозначим за $s_{bound}$ самый правый отрезок из $U(p) \\cup C(p)$ в $T$.\n", + " 5. Обозначим за $s_{right}$ правого соседа $s_{bound}$ в $T$.\n", + " 6. Если оба отрезка существуют, то проверим их на новые события: вызовем *find_new_event*, передав в качестве параметров последовательно $s_{bound}$, $s_{right}$, $p$.\n", + "\n", + "Последный момент, на котором стоит подробнее остановиться, это функция *find_new_event(s_left, s_right, p)*. Она должна проверять отрезки $s_{left}$ и $s_{right}$ на пересечение, и если оно действительно есть, то смотреть, что точка пересечния находится справа от текущего положения заметающей прямой или на ней, но строго выше $p$. Если такое событие найдено и его еще нет в очереди (важно, что второй раз функция его добавлять не должна!), то оно должна быть добавлено.\n", + " \n", + "Сейчас Вам предлагается написать данную функцию по описанному шаблону." ] }, { @@ -290,8 +322,27 @@ }, "outputs": [], "source": [ - "def handle_event_point(event):\n", - " return 0;" + "def handle_event_point(events, status, event):\n", + " return [];" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Чтобы проверить правильность алгоритма в целом, запустите его на наборе тестов:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "# doesn't work now because of noninteger values\n", + "checker.check_Bentley_Ottmann_algorithm(plt, find_intersections)" ] }, { diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py index 977ade5..40173ba 100644 --- a/22_segment_intersect/checker.py +++ b/22_segment_intersect/checker.py @@ -1,5 +1,7 @@ from fractions import * import numpy as np +from cg import Point +from entities import Segment import exercise_1_tests import Bentley_Ottmann_tests @@ -58,3 +60,23 @@ def drow_segments(axis, a, b, color): print("\tYour answer:", output) plt.show() + + +def check_Bentley_Ottmann_algorithm(plt, find_intersections): + test = Bentley_Ottmann_tests.test + + f, axes = plt.subplots(2, 3, figsize=(10, 6)) + for i, axis in zip(range(1, 7), axes.reshape(6)): + axis.set_title("Test " + str(i)) + input = test(i) + n = input[0] # number of segments + segments = [] + for j in range(0, n): + x1, y1, x2, y2 = map(int, input[1][j].split()) + s = Segment(Point(x1, y1), Point(x2, y2), j) + segments.append(s) + axis.plot([x1, x2], [y1, y2], c='black') + axis.scatter(x1, y1, c='black', s=30) + axis.scatter(x2, y2, c='black', s=30) + intersection_points = find_intersections(segments) + # TODO: how to create noninteger point? diff --git a/22_segment_intersect/entities.py b/22_segment_intersect/entities.py index 38a20c2..035d5ba 100644 --- a/22_segment_intersect/entities.py +++ b/22_segment_intersect/entities.py @@ -2,35 +2,6 @@ Type = Enum('Type', 'left right inter') -class Point: - __slots__ = ("x", "y") - - def __init__(self, x = 0.0, y = 0.0): - self.x = x - self.y = y - - def __add__(self, p): - return Point(self.x + p.x, self.y + p.y) - - def __sub__(self, p): - return Point(self.x - p.x, self.y - p.y) - - def __neg__(self): - return Point(-self.x, -self.y) - - def __lt__(self, p): - return self.x < p.x or self.x == p.x and self.y < p.y - - def __eq__(self, p): - return self.x == p.x and self.y == p.y - - def __gt__(self, p): - return not (self < p or self == p) - - def __repr__(self): - return "(%r, %r)" % (self.x, self.y) - - class Segment: __slots__ = ("a", "b", "id") @@ -73,6 +44,8 @@ class Event: def __init__(self, segment, t, addit_segment = None, inter_point = None): self.segment = segment self.t = t + self.addit_segment = addit_segment + self.inter_point = inter_point def __lt__(self, e): a = self.segment.a if self.t == Type.left else \ @@ -88,7 +61,10 @@ def __lt__(self, e): return a < b def __eq__(self, e): - return self.segment.id == e.segment.id and self.t == e.t + return self.t == e.t and \ + self.segment.id == e.segment.id and \ + (self.addit_segment is None and e.addit_segment is None or + self.addit_segment is not None and e.addit_segment is None and self.addit_segment == e.addit_segment) def __gt__(self, e): return not (self == e or self < e) diff --git a/22_segment_intersect/segments_set.in b/22_segment_intersect/segments_set.in index db1e559..79a5a18 100644 --- a/22_segment_intersect/segments_set.in +++ b/22_segment_intersect/segments_set.in @@ -1,5 +1,10 @@ -4 +9 1 3 1 -2 -6 0.5 1 0.1 +6 1 1 0 3 3 1 1 -5 -2 1 3 \ No newline at end of file +5 -2 1 3 +8 3 4 9 +2 1 0 6 +2 3 3 2 +-1 3 5 6 +1 1 8 8 \ No newline at end of file From 913f2b620a826322fa4789834f7c367af1452580 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Wed, 1 Mar 2017 23:52:46 +0400 Subject: [PATCH 16/19] add test data --- 22_segment_intersect/Bentley_Ottmann_tests.py | 109 ++++++++++++------ .../Line_segment_intersection.ipynb | 1 - 22_segment_intersect/checker.py | 2 +- 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/22_segment_intersect/Bentley_Ottmann_tests.py b/22_segment_intersect/Bentley_Ottmann_tests.py index 9d2635e..0a8bd57 100644 --- a/22_segment_intersect/Bentley_Ottmann_tests.py +++ b/22_segment_intersect/Bentley_Ottmann_tests.py @@ -1,15 +1,75 @@ def test(id) : return { - 1: [4, - ["1 2 5 6", - "4 3 3 6", - "5 6 5 4", - "3 2 5 4"], - ["3.5 4.5", - "5 6", - "5 4", - "4 3"]], - 2: [7, + 1: [2, + ["0 0 0 24", + "24 24 40 40"], + ["24 24"]], + 2: [2, + ["0 0 3 6", + "6 6 37 37"], + ["6 6"]], + 3: [2, + ["0 0 2 27", + "27 27 34 34"], + ["27 27"]], + 4: [2, + ["0 0 6 9", + "9 9 31 31"], + ["9 9"]], + 5: [2, + ["0 0 2 30", + "30 30 28 28"], + []], + 6: [2, + ["102 102 5 17", + "17 17 27 27"], + []], + 7: [2, + ["100 100 0 16", + "16 16 15 15"], + ["16 16"]], + 8: [2, + ["100 100 2 17", + "17 17 15 15"], + ["17 17"]], + 9: [2, + ["100 100 2 18", + "18 18 15 15"], + ["18 18"]], + 10: [2, + ["100 100 2 19", + "19 19 15 15"], + ["19 19"]], + 11: [2, + ["100 100 2 19", + "19 19 18 18"], + ["19 19"]], + 12: [2, + ["100 100 5 16", + "16 16 15 15"], + ["16 16"]], + 13: [2, + ["100 100 2 17", + "17 17 15 15"], + ["17 17"]], + 14: [2, + ["100 100 2 18", + "18 18 15 15"], + ["18 18"]], + 15: [2, + ["100 100 2 19", + "19 19 15 15"], + ["19 19"]], + 16: [4, + ["10 20 50 60", + "40 30 30 60", + "50 60 50 40", + "30 20 50 40"], + ["35 45", + "50 60", + "50 40", + "40 30"]], + 17: [7, ["4 5 1 3", "3 3 4 5", "4 3 4 5", @@ -22,16 +82,7 @@ def test(id) : "4 3", "5 3", "4 1"]], - 3: [4, # TODO: change this sample (?) - ["12 455 35 -61", - "123 46 -166 -181", - "-100 -13 56 700", - "-100 1 80 -1"], - ["33.368712948265 -24.402429621950", - "-96.944314895998 0.966047943288", - "32.301958334230 -0.470021759269", - "63.397847386456 -0.815531637627"]], - 4: [14, + 18: [14, ["-300 0 -300 100", "-300 100 -200 200", "-200 200 -100 200", @@ -60,7 +111,7 @@ def test(id) : "-100 -200", "-200 -100", "-300 0"]], - 5: [8, + 19: [8, ["-20 0 -20 39", "-20 40 29 40", "30 40 30 11", @@ -69,17 +120,5 @@ def test(id) : "-10 30 19 30", "20 30 20 21", "20 20 0 20"], - []], - 6: [9, # TODO: change this sample - ["-230 48 -84 116", - "-137 18 -94 342", - "-300 270.4532564500349 -31 0", - "200 200 600 500", - "300 200 500 500", - "400 200 400 500", - "500 200 300 500", - "600 200 200 500", - "200 350 600 350"], - ["-126.628841820639 96.145470932852", - "400 350"]] - }.get(id) \ No newline at end of file + []] + }.get(id) diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index b220e74..d2ea1e4 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -341,7 +341,6 @@ }, "outputs": [], "source": [ - "# doesn't work now because of noninteger values\n", "checker.check_Bentley_Ottmann_algorithm(plt, find_intersections)" ] }, diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py index 40173ba..53334e5 100644 --- a/22_segment_intersect/checker.py +++ b/22_segment_intersect/checker.py @@ -79,4 +79,4 @@ def check_Bentley_Ottmann_algorithm(plt, find_intersections): axis.scatter(x1, y1, c='black', s=30) axis.scatter(x2, y2, c='black', s=30) intersection_points = find_intersections(segments) - # TODO: how to create noninteger point? + # TODO: add comparison From f3dd4de65fef6790bb175215bbc233fddace285a Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Sun, 5 Mar 2017 21:38:11 +0400 Subject: [PATCH 17/19] add my point --- .../Line_segment_intersection.ipynb | 10 ++--- 22_segment_intersect/checker.py | 22 ++++------ 22_segment_intersect/entities.py | 40 ++++++++++++++++- 22_segment_intersect/exercise_1_tests.py | 44 +++++++++---------- 22_segment_intersect/solutions.py | 21 ++++----- 5 files changed, 86 insertions(+), 51 deletions(-) diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index d2ea1e4..27a0643 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -11,7 +11,6 @@ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import bintrees\n", - "from cg import Point # see https://github.com/CT-18/cg_common\n", "\n", "import entities\n", "import solutions\n", @@ -163,6 +162,7 @@ }, "outputs": [], "source": [ + "Point = entities.Point\n", "Segment = entities.Segment\n", "Event = entities.Event\n", "Type = entities.Type\n", @@ -197,7 +197,7 @@ " plt.scatter(x1, y1, c = 'black', s = 30)\n", " plt.scatter(x2, y2, c = 'black', s = 30)\n", "\n", - "print(find_intersections(segments))\n", + "print(\"Found intersections:\", find_intersections(segments))\n", "\n", "plt.show()" ] @@ -245,7 +245,7 @@ "a_2.y - b_2.y & b_2.x - a_2.x\n", "\\end{array} \\right| } \\end{equation}\n", "\n", - "Предположим, что два отрезка пересекаются (это, как мы знаем из конспекта про афинное пространство, легко проверяется с помощью предиката поворота и *bounding-box'а*). Сейчас Вам предлагается написать функцию, возвращающую точку пересечения этих отрезков. Для начала давайте будем работать в целых числах, то есть координаты концов отрезков будут целыми числами в $R^2$, а функция должна будет вернуть точку пересечения в однородных координатах. Если отрезки имеют больше одной точки пересечения, то вывести любую." + "Предположим, что два отрезка пересекаются (это, как мы знаем из конспекта про афинное пространство, легко проверяется с помощью предиката поворота и *bounding-box'а*). Сейчас Вам предлагается написать функцию, возвращающую точку пересечения этих отрезков. Для начала давайте будем работать в целых числах и все точки будем хранить в однородных координатах. Пусть на вход функции подаются четыре целых числа в $R^2$ - точки концов отрезков. Если отрезки имеют больше одной точки пересечения, то вывести можно любую." ] }, { @@ -256,10 +256,10 @@ }, "outputs": [], "source": [ - "def get_intersection_point(a, b, c, d): # концы отрезков в формате np.array([x, y])\n", + "def get_intersection_point(a, b, c, d): # концы отрезков в формате Point(x, y, 1)\n", " # Заполните тело функции. Она должна возвращать точку пересечения\n", " # отрезков ab и cd в однородных координатах.\n", - " return solutions.get_intersection_point(a, b, c, d) # точка пересечения в формате np.array([x, y, det])" + " return solutions.get_intersection_point(a, b, c, d) # точка пересечения в формате Point(x, y, det)" ] }, { diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py index 53334e5..0838ddf 100644 --- a/22_segment_intersect/checker.py +++ b/22_segment_intersect/checker.py @@ -1,7 +1,5 @@ -from fractions import * import numpy as np -from cg import Point -from entities import Segment +from entities import Point, Segment import exercise_1_tests import Bentley_Ottmann_tests @@ -11,25 +9,25 @@ def check_first_exercise(plt, get_intersection_point): test = exercise_1_tests.test def calculate_det(a, b): - return a[0] * b[1] - b[0] * a[1] + return a.x * b.y - b.x * a.y def bounding_box(p, a, b): if a > b: a, b = b, a - return a <= p <= b + return a <= p <= b def check_overlap(p, a, b): orientation = np.sign(calculate_det(b - a, p - a)) if orientation != 0: return False - return bounding_box(p[0], a[0], b[0]) and bounding_box(p[1], a[1], b[1]) + return bounding_box(p.x, a.x, b.x) and bounding_box(p.y, a.y, b.y) def drow_points(axis, points, color): for point in points: - axis.scatter(point[0], point[1], c=color, s=40) + axis.scatter(point.x, point.y, c=color, s=40) def drow_segments(axis, a, b, color): - axis.plot([a[0], b[0]], [a[1], b[1]], c=color) + axis.plot([a.x, b.x], [a.y, b.y], c=color) f, axes = plt.subplots(2, 4, figsize=(11, 6)) print("Part 1. Intersection tests") @@ -41,18 +39,16 @@ def drow_segments(axis, a, b, color): drow_segments(axis, a, b, 'r') drow_points(axis, [c, d], 'b') drow_segments(axis, c, d, 'b') - if Fraction(answ[0], answ[2]) == Fraction(output[0], output[2]) \ - and Fraction(answ[1], answ[2]) == Fraction(output[1], output[2]): + if output == answ: print("Test", i, "Ok") else: print("Test", i, "Failed:") - print("\t[x= {}, y= {}, det= {}]".format(answ[0], answ[1], answ[2]), "expected but") - print("\t[x= {}, y= {}, det= {}]".format(output[0], output[1], output[2]), "found") + print("\t", answ, "expected but", output, "found") print("Part 2. Overlap tests") for i in range(9, 21): a, b, c, d = test(i) output = get_intersection_point(a, b, c, d) - if check_overlap(output[:2] / output[2], a, b) and check_overlap(output[:2] / output[2], c, d): + if check_overlap(output, a, b) and check_overlap(output, c, d): print("Test", i, "Ok") else: print("Test", i, "Fail") diff --git a/22_segment_intersect/entities.py b/22_segment_intersect/entities.py index 035d5ba..0616a10 100644 --- a/22_segment_intersect/entities.py +++ b/22_segment_intersect/entities.py @@ -1,7 +1,45 @@ +from fractions import * from enum import Enum Type = Enum('Type', 'left right inter') +class Point: + __slots__ = ("x", "y", "det") + + def __init__(self, x=0, y=0, det=1): + self.x = x + self.y = y + self.det = det + + def __add__(self, p): + return Point(Fraction(self.x, self.det) + Fraction(p.x, p.det), + Fraction(self.y, self.det) + Fraction(p.y, p.det)) + + def __sub__(self, p): + return Point(Fraction(self.x, self.det) - Fraction(p.x, p.det), + Fraction(self.y, self.det) - Fraction(p.y, p.det)) + + def __neg__(self): + return Point(-self.x, -self.y, self.det) + + def __lt__(self, p): + return Fraction(self.x, self.det) < Fraction(p.x, p.det) or \ + Fraction(self.x, self.det) == Fraction(p.x, p.det) and Fraction(self.y, self.det) < Fraction(p.y, p.det) + + def __eq__(self, p): + return Fraction(self.x, self.det) == Fraction(p.x, p.det) and \ + Fraction(self.y, self.det) == Fraction(p.y, p.det) + + def __gt__(self, p): + return not (self < p or self == p) + + def __hash__(self): + return hash(tuple([Fraction(self.x, self.det), Fraction(self.y, self.det)])) + + def __repr__(self): + return "(%r, %r)" % (Fraction(self.x, self.det), Fraction(self.y, self.det)) + + class Segment: __slots__ = ("a", "b", "id") @@ -63,7 +101,7 @@ def __lt__(self, e): def __eq__(self, e): return self.t == e.t and \ self.segment.id == e.segment.id and \ - (self.addit_segment is None and e.addit_segment is None or + (self.addit_segment is None and e.addit_segment is None or self.addit_segment is not None and e.addit_segment is None and self.addit_segment == e.addit_segment) def __gt__(self, e): diff --git a/22_segment_intersect/exercise_1_tests.py b/22_segment_intersect/exercise_1_tests.py index 3fabccc..36b3763 100644 --- a/22_segment_intersect/exercise_1_tests.py +++ b/22_segment_intersect/exercise_1_tests.py @@ -1,27 +1,27 @@ -import numpy as np +from entities import Point -def test(id) : +def test(id): return { - 1: [np.array([1, 1]), np.array([3, 3]), np.array([3, 3]), np.array([3, 2]), np.array([-6, -6, -2])], - 2: [np.array([1, 1]), np.array([4, 5]), np.array([2, 1]), np.array([2, 5]), np.array([24, 28, 12])], - 3: [np.array([-18, -34]), np.array([62, 15]), np.array([83, 7]), np.array([-8, 16]), np.array([277978, 51274, 5179])], - 4: [np.array([0, 0]), np.array([1, 4]), np.array([2, 2]), np.array([0, 3]), np.array([6, 24, 9])], - 5: [np.array([0, 0]), np.array([7, 1]), np.array([0, 1]), np.array([7, 0]), np.array([-49, -7, -14])], - 6: [np.array([1, 2]), np.array([4, 2]), np.array([4, 2]), np.array([7, 2]), np.array([4, 2, 1])], - 7: [np.array([0, 0]), np.array([5, 2]), np.array([3, 0]), np.array([2, 2]), np.array([30, 12, 12])], - 8: [np.array([10, 1]), np.array([100, 80]), np.array([30, 2]), np.array([-60, 95]), np.array([330300, 169530, 15480])], + 1: [Point(1, 1), Point(3, 3), Point(3, 3), Point(3, 2), Point(-6, -6, -2)], + 2: [Point(1, 1), Point(4, 5), Point(2, 1), Point(2, 5), Point(24, 28, 12)], + 3: [Point(-18, -34), Point(62, 15), Point(83, 7), Point(-8, 16), Point(277978, 51274, 0)], + 4: [Point(0, 0), Point(1, 4), Point(2, 2), Point(0, 3), Point(6, 24, 9)], + 5: [Point(0, 0), Point(7, 1), Point(0, 1), Point(7, 0), Point(-49, -7, -14)], + 6: [Point(1, 2), Point(4, 2), Point(4, 2), Point(7, 2), Point(4, 2, 1)], + 7: [Point(0, 0), Point(5, 2), Point(3, 0), Point(2, 2), Point(30, 12, 12)], + 8: [Point(10, 1), Point(100, 80), Point(30, 2), Point(-60, 95), Point(330300, 169530, 15480)], - 9: [np.array([-1, 1]), np.array([3, 1]), np.array([1, 1]), np.array([5, 1])], - 10: [np.array([-2, -2]), np.array([-2, 6]), np.array([-2, 3]), np.array([-2, 10])], - 11: [np.array([1, 1]), np.array([5, 5]), np.array([3, 3]), np.array([7, 7])], - 12: [np.array([10, -10]), np.array([1, -1]), np.array([-5, 5]), np.array([5, -5])], - 13: [np.array([-80, -80]), np.array([30, -80]), np.array([30, -80]), np.array([-80, -80])], - 14: [np.array([8, -70]), np.array([8, 70]), np.array([8, -70]), np.array([8, 70])], - 15: [np.array([-15, -15]), np.array([32, 32]), np.array([32, 32]), np.array([-15, -15])], - 16: [np.array([-15, 132]), np.array([14, 14]), np.array([14, 14]), np.array([-15, 132])], - 17: [np.array([4, 18]), np.array([4, 46]), np.array([4, 46]), np.array([4, 43])], - 18: [np.array([6, -17]), np.array([8, -17]), np.array([33, -17]), np.array([6, -17])], - 19: [np.array([3, 18]), np.array([15, 1]), np.array([27, -16]), np.array([3, 18])], - 20: [np.array([-1, -1]), np.array([8, 8]), np.array([-1, -1]), np.array([101, 101])] + 9: [Point(-1, 1), Point(3, 1), Point(1, 1), Point(5, 1)], + 10: [Point(-2, -2), Point(-2, 6), Point(-2, 3), Point(-2, 10)], + 11: [Point(1, 1), Point(5, 5), Point(3, 3), Point(7, 7)], + 12: [Point(10, -10), Point(1, -1), Point(-5, 5), Point(5, -5)], + 13: [Point(-80, -80), Point(30, -80), Point(30, -80), Point(-80, -80)], + 14: [Point(8, -70), Point(8, 70), Point(8, -70), Point(8, 70)], + 15: [Point(-15, -15), Point(32, 32), Point(32, 32), Point(-15, -15)], + 16: [Point(-15, 132), Point(14, 14), Point(14, 14), Point(-15, 132)], + 17: [Point(4, 18), Point(4, 46), Point(4, 46), Point(4, 43)], + 18: [Point(6, -17), Point(8, -17), Point(33, -17), Point(6, -17)], + 19: [Point(3, 18), Point(15, 1), Point(27, -16), Point(3, 18)], + 20: [Point(-1, -1), Point(8, 8), Point(-1, -1), Point(101, 101)] }.get(id) diff --git a/22_segment_intersect/solutions.py b/22_segment_intersect/solutions.py index 18772fa..a3a1eef 100644 --- a/22_segment_intersect/solutions.py +++ b/22_segment_intersect/solutions.py @@ -1,26 +1,27 @@ import numpy as np +from entities import Point def point_belongs_to_segment(p, a, b): # as we know both segments lay on the same line left, right, p_ = 0, 0, 0 - if a[0] == b[0]: - left, right, p_ = a[1], b[1], p[1] + if a.x == b.x: + left, right, p_ = a.y, b.y, p.y else: - left, right, p_ = a[0], b[0], p[0] + left, right, p_ = a.x, b.x, p.x if left > right: left, right = right, left return left <= p_ <= right def get_intersection_point(a, b, c, d): - left = [[d[0] - c[0], a[0] - b[0]], - [d[1] - c[1], a[1] - b[1]]] - right = [[b[0] * a[1] - b[1] * a[0]], - [d[0] * c[1] - d[1] * c[0]]] + left = [[d.x - c.x, a.x - b.x], + [d.y - c.y, a.y - b.y]] + right = [[b.x * a.y - b.y * a.x], + [d.x * c.y - d.y * c.x]] numerator = np.matmul(left, right) - denominator = (a[1] - b[1]) * (d[0] - c[0]) - (b[0] - a[0]) * (c[1] - d[1]) + denominator = (a.y - b.y) * (d.x - c.x) - (b.x - a.x) * (c.y - d.y) if denominator != 0: - return np.array([numerator[0][0], numerator[1][0], denominator]) + return Point(numerator[0][0], numerator[1][0], denominator) p = None if point_belongs_to_segment(a, c, d): p = a @@ -32,5 +33,5 @@ def get_intersection_point(a, b, c, d): p = d if p is None: raise Exception('Incorrect test!') - return np.array([p[0], p[1], 1]) + return p From 2f7e8fddb03a6a0c2deaffaefca48255062baeed Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Wed, 8 Mar 2017 21:57:18 +0400 Subject: [PATCH 18/19] code clean up --- .../Line_segment_intersection.ipynb | 15 ++++----------- 22_segment_intersect/checker.py | 3 ++- 22_segment_intersect/exercise_1_tests.py | 2 +- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index 27a0643..4d8103c 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -167,24 +167,17 @@ "Event = entities.Event\n", "Type = entities.Type\n", "\n", - "def get_unique_elements(list):\n", - " unique = []\n", - " for point in list:\n", - " if point not in unique:\n", - " unique.append(point)\n", - " return unique\n", - "\n", "def find_intersections(segments):\n", " status = bintrees.RBTree()\n", " events = bintrees.RBTree()\n", - " intersection_points = []\n", + " intersection_points = set()\n", " for s in segments:\n", " events.insert(Event(s, Type.left), Event(s, Type.left))\n", " events.insert(Event(s, Type.right), Event(s, Type.right)) \n", " while not events.is_empty():\n", " event, _ = events.pop_min()\n", - " intersection_points.extend(handle_event_point(events, status, event)) # declared below\n", - " return get_unique_elements(intersection_points)\n", + " intersection_points.update(handle_event_point(events, status, event)) # declared below\n", + " return intersection_points\n", "\n", "segments = []\n", "with open(\"segments_set.in\") as inp:\n", @@ -323,7 +316,7 @@ "outputs": [], "source": [ "def handle_event_point(events, status, event):\n", - " return [];" + " return set();" ] }, { diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py index 0838ddf..b633f9b 100644 --- a/22_segment_intersect/checker.py +++ b/22_segment_intersect/checker.py @@ -43,7 +43,8 @@ def drow_segments(axis, a, b, color): print("Test", i, "Ok") else: print("Test", i, "Failed:") - print("\t", answ, "expected but", output, "found") + print("\tx={}, y={}, det={}".format(answ.x, answ.y, answ.det), "expected but\n", + "\tx={}, y={}, det={}".format(output.x, output.y, output.det), "found") print("Part 2. Overlap tests") for i in range(9, 21): a, b, c, d = test(i) diff --git a/22_segment_intersect/exercise_1_tests.py b/22_segment_intersect/exercise_1_tests.py index 36b3763..5b582fa 100644 --- a/22_segment_intersect/exercise_1_tests.py +++ b/22_segment_intersect/exercise_1_tests.py @@ -5,7 +5,7 @@ def test(id): return { 1: [Point(1, 1), Point(3, 3), Point(3, 3), Point(3, 2), Point(-6, -6, -2)], 2: [Point(1, 1), Point(4, 5), Point(2, 1), Point(2, 5), Point(24, 28, 12)], - 3: [Point(-18, -34), Point(62, 15), Point(83, 7), Point(-8, 16), Point(277978, 51274, 0)], + 3: [Point(-18, -34), Point(62, 15), Point(83, 7), Point(-8, 16), Point(277978, 51274, 5179)], 4: [Point(0, 0), Point(1, 4), Point(2, 2), Point(0, 3), Point(6, 24, 9)], 5: [Point(0, 0), Point(7, 1), Point(0, 1), Point(7, 0), Point(-49, -7, -14)], 6: [Point(1, 2), Point(4, 2), Point(4, 2), Point(7, 2), Point(4, 2, 1)], From 5f9767b953124d5692f1d974abe24a529047b133 Mon Sep 17 00:00:00 2001 From: Anna Kustareva Date: Sat, 11 Mar 2017 14:51:56 +0400 Subject: [PATCH 19/19] add new tests and checker --- 22_segment_intersect/Bentley_Ottmann_tests.py | 212 ++++++++---------- .../Line_segment_intersection.ipynb | 4 +- 22_segment_intersect/checker.py | 31 ++- 22_segment_intersect/entities.py | 2 +- 4 files changed, 120 insertions(+), 129 deletions(-) diff --git a/22_segment_intersect/Bentley_Ottmann_tests.py b/22_segment_intersect/Bentley_Ottmann_tests.py index 0a8bd57..9646637 100644 --- a/22_segment_intersect/Bentley_Ottmann_tests.py +++ b/22_segment_intersect/Bentley_Ottmann_tests.py @@ -1,124 +1,104 @@ +from entities import Point + + def test(id) : return { 1: [2, - ["0 0 0 24", - "24 24 40 40"], - ["24 24"]], + [Point(0, 0), Point(0, 24), + Point(-5, -25), Point(40, 40)], + []], 2: [2, - ["0 0 3 6", - "6 6 37 37"], - ["6 6"]], + [Point(0, 0), Point(3, 6), + Point(6, 6), Point(37, 37)], + []], 3: [2, - ["0 0 2 27", - "27 27 34 34"], - ["27 27"]], + [Point(0, 0), Point(2, 27), + Point(27, 27), Point(34, 34)], + []], 4: [2, - ["0 0 6 9", - "9 9 31 31"], - ["9 9"]], - 5: [2, - ["0 0 2 30", - "30 30 28 28"], + [Point(0, 0), Point(2, 30), + Point(30, 30), Point(28, 28)], []], - 6: [2, - ["102 102 5 17", - "17 17 27 27"], + 5: [4, + [Point(10, 20), Point(50, 60), + Point(40, 30), Point(30, 60), + Point(50, 60), Point(50, 40), + Point(30, 20), Point(50, 40)], + [Point(35, 45), + Point(50, 60), + Point(50, 40), + Point(40, 30)]], + 6: [7, + [Point(4, 5), Point(1, 3), + Point(3, 3), Point(4, 5), + Point(4, 3), Point(4, 5), + Point(4, 5), Point(5, 3), + Point(4, 1), Point(3, 3), + Point(5, 3), Point(4, 1), + Point(4, 1), Point(4, 3)], + [Point(4, 5), + Point(3, 3), + Point(4, 3), + Point(5, 3), + Point(4, 1)]], + 7: [14, + [Point(-300, 0), Point(-300, 100), + Point(-300, 100), Point(-200, 200), + Point(-200, 200), Point(-100, 200), + Point(-100, 200), Point(0, 100), + Point(0, 100), Point(100, 200), + Point(100, 200), Point(200, 200), + Point(200, 200), Point(300, 100), + Point(300, 100), Point(300, 0), + Point(300, 0), Point(200, -100), + Point(200, -100), Point(100, -200), + Point(100, -200), Point(0, -300), + Point(0, -300), Point(-100, -200), + Point(-100, -200), Point(-200, -100), + Point(-200, -100), Point(-300, 0)], + [Point(-300, 100), + Point(-200, 200), + Point(-100, 200), + Point(0, 100), + Point(100, 200), + Point(200, 200), + Point(300, 100), + Point(300, 0), + Point(200, -100), + Point(100, -200), + Point(0, -300), + Point(-100, -200), + Point(-200, -100), + Point(-300, 0)]], + 8: [8, + [Point(-20, 0), Point(-20, 39), + Point(-20, 40), Point(29, 40), + Point(30, 40), Point(30, 11), + Point(30, 10), Point(-9, 10), + Point(-10, 10), Point(-10, 29), + Point(-10, 30), Point(19, 30), + Point(20, 30), Point(20, 21), + Point(20, 20), Point(0, 20)], []], - 7: [2, - ["100 100 0 16", - "16 16 15 15"], - ["16 16"]], - 8: [2, - ["100 100 2 17", - "17 17 15 15"], - ["17 17"]], - 9: [2, - ["100 100 2 18", - "18 18 15 15"], - ["18 18"]], - 10: [2, - ["100 100 2 19", - "19 19 15 15"], - ["19 19"]], - 11: [2, - ["100 100 2 19", - "19 19 18 18"], - ["19 19"]], - 12: [2, - ["100 100 5 16", - "16 16 15 15"], - ["16 16"]], - 13: [2, - ["100 100 2 17", - "17 17 15 15"], - ["17 17"]], - 14: [2, - ["100 100 2 18", - "18 18 15 15"], - ["18 18"]], - 15: [2, - ["100 100 2 19", - "19 19 15 15"], - ["19 19"]], - 16: [4, - ["10 20 50 60", - "40 30 30 60", - "50 60 50 40", - "30 20 50 40"], - ["35 45", - "50 60", - "50 40", - "40 30"]], - 17: [7, - ["4 5 1 3", - "3 3 4 5", - "4 3 4 5", - "4 5 5 3", - "4 1 3 3", - "5 3 4 1", - "4 1 4 3"], - ["4 5", - "3 3", - "4 3", - "5 3", - "4 1"]], - 18: [14, - ["-300 0 -300 100", - "-300 100 -200 200", - "-200 200 -100 200", - "-100 200 0 100", - "0 100 100 200", - "100 200 200 200", - "200 200 300 100", - "300 100 300 0", - "300 0 200 -100", - "200 -100 100 -200", - "100 -200 0 -300", - "0 -300 -100 -200", - "-100 -200 -200 -100", - "-200 -100 -300 0"], - ["-300 100", - "-200 200", - "-100 200", - "0 100", - "100 200", - "200 200", - "300 100", - "300 0", - "200 -100", - "100 -200", - "0 -300", - "-100 -200", - "-200 -100", - "-300 0"]], - 19: [8, - ["-20 0 -20 39", - "-20 40 29 40", - "30 40 30 11", - "30 10 -9 10", - "-10 10 -10 29", - "-10 30 19 30", - "20 30 20 21", - "20 20 0 20"], - []] - }.get(id) + 9: [4, + [Point(12, 455), Point(35, -61), + Point(123, 46), Point(-166, -181), + Point(-100, -13), Point(56, 700), + Point(-100, 1), Point(80, -1)], + [Point(63397847386456, -815531637627, 1000000000000), + Point(-48472157447999, 483023971644, 500000000000), + Point(32301958334230, -470021759269, 1000000000000), + Point(6673742589653, -4880485924390, 200000000000)]], + 10: [9, + [Point(-230, 48), Point(-84, 116), + Point(-137, 18), Point(-94, 342), + Point(-3000000000000000, 2704532564500349, 10000000000000), Point(-31, 0), + Point(-200, 200), Point(600, 500), + Point(300, 200), Point(500, 500), + Point(400, 200), Point(400, 500), + Point(500, 200), Point(300, 500), + Point(600, 200), Point(200, 500), + Point(200, 350), Point(600, 350)], + [Point(400, 350), + Point(-126628841820639, 96145470932852, 1000000000000)]] + }.get(id) diff --git a/22_segment_intersect/Line_segment_intersection.ipynb b/22_segment_intersect/Line_segment_intersection.ipynb index 4d8103c..4b8f3cd 100644 --- a/22_segment_intersect/Line_segment_intersection.ipynb +++ b/22_segment_intersect/Line_segment_intersection.ipynb @@ -316,6 +316,8 @@ "outputs": [], "source": [ "def handle_event_point(events, status, event):\n", + " # Заполните тело функции. Она должна возвращать множество уникальных \n", + " # точек пересечения отрезков из входного набора отрезков.\n", " return set();" ] }, @@ -323,7 +325,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Чтобы проверить правильность алгоритма в целом, запустите его на наборе тестов:" + "Чтобы проверить правильность алгоритма в целом, используйте чекер:" ] }, { diff --git a/22_segment_intersect/checker.py b/22_segment_intersect/checker.py index b633f9b..611964e 100644 --- a/22_segment_intersect/checker.py +++ b/22_segment_intersect/checker.py @@ -7,7 +7,7 @@ def check_first_exercise(plt, get_intersection_point): test = exercise_1_tests.test - + def calculate_det(a, b): return a.x * b.y - b.x * a.y @@ -43,7 +43,7 @@ def drow_segments(axis, a, b, color): print("Test", i, "Ok") else: print("Test", i, "Failed:") - print("\tx={}, y={}, det={}".format(answ.x, answ.y, answ.det), "expected but\n", + print("\tx={}, y={}, det={}".format(answ.x, answ.y, answ.det), "expected but\n", "\tx={}, y={}, det={}".format(output.x, output.y, output.det), "found") print("Part 2. Overlap tests") for i in range(9, 21): @@ -62,18 +62,27 @@ def drow_segments(axis, a, b, color): def check_Bentley_Ottmann_algorithm(plt, find_intersections): test = Bentley_Ottmann_tests.test - f, axes = plt.subplots(2, 3, figsize=(10, 6)) - for i, axis in zip(range(1, 7), axes.reshape(6)): + f, axes = plt.subplots(2, 5, figsize=(12, 6)) + for i, axis in zip(range(1, 11), axes.reshape(10)): axis.set_title("Test " + str(i)) input = test(i) n = input[0] # number of segments segments = [] - for j in range(0, n): - x1, y1, x2, y2 = map(int, input[1][j].split()) - s = Segment(Point(x1, y1), Point(x2, y2), j) + for j in range(0, 2 * n, 2): + p1, p2 = input[1][j], input[1][j + 1] + s = Segment(p1, p2, j) segments.append(s) - axis.plot([x1, x2], [y1, y2], c='black') - axis.scatter(x1, y1, c='black', s=30) - axis.scatter(x2, y2, c='black', s=30) + axis.plot([p1.x, p2.x], [p1.y, p2.y], c='black') + axis.scatter(p1.x, p1.y, c='black', s=30) + axis.scatter(p2.x, p2.y, c='black', s=30) intersection_points = find_intersections(segments) - # TODO: add comparison + intersection_points_answ = set() + intersection_points_answ.update(input[2]) + if intersection_points == intersection_points_answ: + print("Test", i, "Ok") + else: + print("Test", i, "Fail:") + print("\t", intersection_points_answ, "expected but") + print("\t", intersection_points if len(intersection_points) > 0 else "{}", "found") + + plt.show() diff --git a/22_segment_intersect/entities.py b/22_segment_intersect/entities.py index 0616a10..5fb9000 100644 --- a/22_segment_intersect/entities.py +++ b/22_segment_intersect/entities.py @@ -37,7 +37,7 @@ def __hash__(self): return hash(tuple([Fraction(self.x, self.det), Fraction(self.y, self.det)])) def __repr__(self): - return "(%r, %r)" % (Fraction(self.x, self.det), Fraction(self.y, self.det)) + return "(%r, %r)" % (str(Fraction(self.x, self.det)), str(Fraction(self.y, self.det))) class Segment: