{ "cells": [ { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# The Convex Hull Problem" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Pound a bunch of nails into a board, then stretch a rubber band around them and let the rubber band snap taut, like this:\n", "\n", "\n", "\n", "The rubber band has traced out the *convex hull* of the set of nails. It turns out this is an important problem with applications in computer graphics, robot motion planning, geographical information systems, ethology, and other areas.\n", "More formally, we say that:\n", "\n", "*Given a finite set, **P**, of points in a plane, the convex hull of **P** is a polygon, **H**, such that:*\n", "\n", "- *Every point in **P** lies either on or inside of **H**.*\n", "- *Every vertex of **H** is a point in **P**.*\n", "- **H** *is convex: a line segment joining any two vertexes of **H** either is an edge of **H** or lies inside **H**.*\n", "\n", "\n", "In this notebook we develop an algorithm to find the convex hull (and show examples of how to use matplotlib plotting). The first thing to do is decide how we will represent the objects of interest:\n", "\n", "- **Point**: We'll define a class such that Point(3, 4) is a point where p.x is 3 and p.y is 4.\n", "- **Set of Points**: We'll use a Python set: {Point(0,0), Point(3,4), ...}\n", "- **Polygon**: We'll represent a polygon as an ordered list of vertex points.\n", "\n", "First, get the necessary imports done:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "from __future__ import division, print_function\n", "\n", "%matplotlib inline \n", "import matplotlib.pyplot as plt\n", "import collections\n", "import random\n", "import math" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Points and Sets of Points\n", "\n", "I'll define the class Point as a named tuple of x and y coordinates, and Points(n) as a function that creates a set of *n* random points. \n", "\n", "There are two complications to the function Points(n):\n", "1. A second optional argument is used to set the random seed. This way, the same call to Points will return the same result each time. That makes it easier to reproduce tests. If you want different sets of points, just pass in different values for the seed.\n", "2. Since matplotlib plots on a 3×2 rectangle by default, the points will be uniformly sampled from a 3×2 box (with a small border of 0.05 on each edge to prevent the points from bumping up against the edge of the box)." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "Point = collections.namedtuple('Point', 'x, y')\n", "\n", "def Points(n, seed=42):\n", " \"Generate n random points within a 3 x 2 box.\"\n", " random.seed((n, seed))\n", " b = 0.05 # border\n", " return {Point(random.uniform(b, 3-b), random.uniform(b, 2-b)) \n", " for _ in range(n)}" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "text/plain": [ "{Point(x=0.15172583449638682, y=1.6108693392839208),\n", " Point(x=0.968326330695687, y=1.3139550880088586),\n", " Point(x=1.3508070075242857, y=0.22290610532132638)}" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Points(3)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Visualizing Points and Line Segments\n", "\n", "\n", "Now let's see how to visualize points; I'll define a function plot_points. We will want to be able to see:\n", "- The **points** themselves. \n", "- Optionally, **line segments** between points. An optional style parameter allows you to specify whether you want lines or not, and what color they should be. This parameter uses the standard [style format](http://matplotlib.org/1.3.1/api/pyplot_api.html#matplotlib.pyplot.plot) defined by matplotlib; for example, 'r.' means red colored dots with no lines, 'bs-' means blue colored squares with lines between them, and 'go:' means green colored circles with dotted lines between them. The lines go from point to point in order; if you want the lines to close\n", "back from the last point to the first (to form a complete polygon), specify closed=True. (For that to work,\n", "the collection of points must be a list; with closed=False the collection can be any collection.)\n", "- Optionally, **labels** on the points that let us distinguish one from another. You get\n", "labels (integers from 0 to *n*) if you specify labels=True." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_points(points, style='r.', labels=False, closed=False): \n", " \"\"\"Plot a collection of points. Optionally change the line style, label points with numbers, \n", " and/or form a closed polygon by closing the line from the last point to the first.\"\"\"\n", " if labels:\n", " for (i, (x, y)) in enumerate(points):\n", " plt.text(x, y, ' '+str(i))\n", " if closed:\n", " points = points + [points[0]]\n", " plt.plot([p.x for p in points], [p.y for p in points], style, linewidth=2.5)\n", " plt.axis('scaled'); plt.axis('off')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Here's an example:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n5kTt+AAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_points(Points(200))" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Convexity\n", "\n", "\n", "We want to make a *convex* hull, so we better have some way of determining whether a polygon is *convex*. Let's examine one that is:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n/wPYPtj1V6+qUQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "octagon = [Point(-10, 0), Point(-7, -7), Point(0, -10), Point(+7, -7), \n", " Point(+10, 0), Point(+7, +7), Point(0, +10), Point(-7, 7)]\n", "plot_points(octagon, 'bs-', labels=True, closed=True)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "If you start at point 0 at the left and proceed in order counterclockwise around the octagon, following edges from point to point, you can see that at every vertex you are making a **left** turn.\n", "\n", "Now let's consider a non-convex polygon:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pacman = octagon[:4] + [Point(0, 0)] + octagon[5:]\n", "plot_points(pacman, 'ys-', labels=True, closed=True)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "The pacman polygon is non-convex; you can see that a line from point 3 to point 5 passes *outside* the polygon. You can also see that as you move counterclockwise from 3 to 4 to 5 you turn **right** at 4. That leads to the idea: **a polygon is convex if there are no right turns** as we go around the polygon counterclockwise. " ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Turn Directions\n", "\n", "\n", "Now how do we determine if a turn from point A to B to C is a left turn at B or a right turn (or straight)? Consider this diagram:\n", "\n", "\n", "\n", "It is a left turn at B if angle β is bigger than angle α; in other words, if β's opposite-over-adjacent ratio is bigger than α's: \n", "\n", " (C.y - B.y) / (C.x - B.x) > (B.y - A.y) / (B.x - A.x)\n", " \n", "But if we did that computation, we'd need special cases for when each denominator is zero. So multiply each side by the denominators:\n", "\n", " (B.x - A.x) * (C.y - B.y) > (B.y - A.y) * (C.x - B.x) \n", " \n", "(*Note:* This step should make you very nervous! In general, multiplying both sides of an inequality by a negative number reverses the inequality, and here the denominators might be negative. In this case it works out; basically because we are doing two multiplications so that negatives cancel out, but [the math proof](https://en.wikipedia.org/wiki/Cross_product) is tricky, involving some concepts in vector algebra, so I won't duplicate it here; instead I will provide good test coverage below.)\n", " \n", "That leads to the function definition: " ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def turn(A, B, C):\n", " \"Is the turn from A->B->C a 'right', 'left', or 'straight' turn?\"\n", " diff = (B.x - A.x) * (C.y - B.y) - (B.y - A.y) * (C.x - B.x) \n", " return ('right' if diff < 0 else\n", " 'left' if diff > 0 else\n", " 'straight')" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Sketch of Convex Hull Algorithm\n", "\n", "\n", "Now we have the first part of a strategy to find the convex hull:\n", "\n", "> *Travel a path along the points in some order. (It is not yet clear exactly what order.) Any point along the way that does not mark a left-hand turn is not part of the hull.*\n", "\n", "What's a good order? Let's see what happens if we start at the leftmost point and work our way to the rightmost. We can achieve that ordering by calling the built-in function sorted on the points (since points are tuples, sorted sorts them lexicographically: first by their first component, x, and if there are ties, next by their y component). We start with 11 random points, and I will define a function to help plot the partial hull as we go:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_partial_hull(points, hull_indexes=()):\n", " \"Plot the points, labeled, with a blue line for the points named by indexes.\"\n", " plot_points(points, labels=True)\n", " plot_points([points[i] for i in hull_indexes], 'bs-')" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "Here are the points without any hull:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)))" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Now I will start building up the hull by following the points in order from point 0 to 1 to 2 to 3:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAADsCAYAAACPFubKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGtBJREFUeJzt3XmcXWV9x/HPFwJIlBhFUAyoIItFBYJglQoUVES0aFkS\noAhBFFqKaKm4tVWLRWtdUFppiSgjEJZAiriApdhGCxUaEAgWRTAGhYICEghrAvPrH+e5c2cms9yZ\nuzznnPt9v17zuuc5c5cf8xq+OfOcZ1FEYGZm9bJe7gLMzKzzHO5mZjXkcDczqyGHu5lZDTnczcxq\nyOFuZlZDDvcxSNpa0vWS7pB0kaQNctdkZjYVDvexfRb4QkRsBzwEHJu5HjOzKZEnMY0kScBvgRdG\nxKCk1wGfjIj9M5dmZtYyX7mva1NgVUQMpvY9wJyM9ZiZTZnD3cyshhzu63oQmC2p8bPZkuLq3cys\nMhzuo0RxE+I/gUPTqaOBb+aryMxs6voq3KV5SyVi3a95S0c99cPAyZLuAJ4HfK3nxZqZtWFG7gLK\nKCJ+Cfx+7jrMzKarr67cxzfDk5TMrFYc7gBstaPkv2LMrD76LNBWrIR5w9pbvQI2eSFsPBs4jaKv\n3cys8vp6hqrETOA64NXp1EERXJaxJDOzjujrcAeQ2A64AZgFrAZ2i+DneasyM2tP3/e5R3AHcFRq\nbgIskXh2xpLM2iLpDEmrc9dhefV9uANEcDnFSpAArwLOklDGksymRdJuwGygv/8kN3fLNKTRMlcB\n+6RTfx7BmRlLMpsSSesD/w4cAdwREZtkLskycrgPI7E5cBPwYmAtsFcE1+Wtyqw1kt4PEBFflrTa\n4d7fHO6jSOwB/IBimOjdwK4R3J+3KrOJSXoxcDHwh8Ag8IjDvb+5z32UCP4bODk1twQukFg/Y0lm\nrdgF2Ba4E1gBzJTkUV99zFfuY0g3UxcBh6dTp0Xw1xlLsh6QtAh4DUWX3P8Ax0fE03mrmh53y5iv\n3McQQQDHAbelU38l8UcZS7LeOD8iXhERrwY2Bt6Tu6ARpIVIS5GuQJo9ybN91dbnHO7jiOBR4GDg\n0XTqPIltMpZkXRYRVw5rLqPoliuT7YG9gbcCZ030xIiY1ZOKrLQc7hOI4GfAMan5XIoJThtnLMl6\nQNIGwJHAlZM9t8ceT4/LgONzFmLl53CfRASXAl9MzV2AMz3BqfbOBH4QEdfmLmSUI4DFwH5ErMpd\njJWbb6i2QGID4PvAnunUcRF8NWNJNgXSbgOwzcvW/c6KlRE3LBj5XH0C2DkiDupFbWbd0mdL/k5P\nBGsl5gM/Bl4E/JPETRHckLk0a8k2L4PFe697ft6IlqT3APsBb+xFVWbd5G6ZFkVwL0UaPANsCFwq\nsWneqqzD/hnYHPiRpJskefirVZav3Kcggv+S+BDwBeClwPkSb4/gmcylWQdEhLdbtNrwlfvUnQ5c\nmo73B09uMrPycbhPUZrgdCxwezr1CYn9M5ZkZrYOd8tMQwSPSBxMMUV9JrBI4jURrMxbmY1txUr4\n8M5pr9zk3p8W583qyUMh2yBxGHBhat4IvCGCJzOWZOOQ+B9g92Gn/j2C/XLVY9Zt7pZpQwQXAWek\n5muGHVv5jN468U1S6ZYXMOsYh3v7TgF+lI7fKw0tV2Dl0gj3/02PAt6VqRazrnO4tymCNcChMLSh\nx5kSu2QsycbWCPcf0gz4o72UhHWCpAMk3ZzmR/yXpJfnrsnh3gER3AMcRrEDzrMoFhh7Xt6qbJRG\nuD8GDKTjHYDfz1KN1c1XgPkRMRe4gBIMkXa4d0gE/wF8LDW3Ac6V/PMtg7STVmM1z8coNmIZTO2j\nsxRldXMfxcqxALOBezLWAjjcO+0fgMvT8duBj2SsxZpmDjt+LC0l8b3UPkziWRlqsno5EbhS0q8p\nlov+bOZ6HO6dlCY4HU2xjyXApyTelLEkKwwfKfNYevxGepwNHNjbcqxOJK0HnAfsHxFbAefQXCY8\nG4d7h0XwMMUOTk9Q/HwvlNgqb1V9b6xw/xbQWBPdXTPWjs2ADSNiWWovBvbIWA/gcO+KCJbT3Cnn\nBRQrSG6UsaR+t064p8lmF6Vz+0ts0fOqrDom3r/2fmCmpO1S+80091/OxuHeJRGcR7GELMBrKcGf\naX1srCt3aHbNrAf8Se/KsQoad//aiBgE3g0slnQzxe/SKT2vcBSHe3f9BcX6MwAnSByZs5g+Njzc\nHx12fD3NBeAWeMy7TWDC/Wsj4nsRMTcidomIfSNiZU+rG4PDvYsieIpigtOD6dRCiVdnLKlfjXnl\nnm6AN67eXwns2suirFIqt3+tw73LIvgVxS9GUIy1XiINjYe13hivWwaKUQ6N1fMW9KQaq56IVUTM\nr0qwg8O9JyK4Cvh4am4HnOMugJ4aN9wjuBu4OjWP8I1vqwuHe+98GvhuOv5j4IMZa+k3zxl2PPrK\nHZpdM88H3tb9cqyfSTpR0p2SBiU9f9T3zpB0h6RbJM1t53Mc7j0SwSDFKoS/TKf+XuIP81XUVybq\nlgG4DFidjj3m3brtGuCNwF3DT0o6ANg2IrYDjqM52m5aHO49FMFDFBOcnqL42V8sMSdvVX2hEe5P\np1U8R4jgcYqbZQAHSGzes8qs70TEzRFx1xjfOpD0V2REXA/MlvTC6X6Ow73HIrgJOCE1NwcWS2yQ\nsaR+MHxFyPEMpMcZFDfAzXptDvDrYe27YfobyjjcM4jg68DZqbkH8LmM5fSDVsL9WuAX6dhdM5bL\n6IEW094H1eGez/uAH6fj90vMz1lMzU0a7qPGvO8isXPXqzIb6R4YsQ7VlrSxdLDDPZO0tskhwEPp\n1NckdsxYUp01wv3RCZ9VjHlv8NW7Tc/E69Cs8+xhx98CjireQq8DVkXEb6ZbhsM9owh+SbH2c1AE\n0BKJTfJWVUutdMsQwUrgP1PzSN8LsWkadx0aAEknpXXf5wDLJS0EiIgrgBWS7kyvO2H0a6fC4Z5Z\nBFcAn0rNV1BcwXuCU2e1FO5Jo2tmM2D/7pRjNTfZOjRnRMRWEbFhRMyJiOOGfe/EiNg2InaOiB+P\nfu1UONzL4VTgqnR8KPD+jLXU0VTCfcmw57lrxqajFOvQONxLIIJnKH4hfpVOfU7iDRlLqpvGDNVJ\nwz2CR4FLU/NAiU27VpXVU0nWoXG4l0QED1LcYF1DMdZ6scSL8lZVG1O5codm18wGwGGdL8es+xzu\nJRLBMuCk1NyCYgbrjIwl1cVUw/0HNKeGL+h4NWY94HAvn4U0rxz3Aj6TsZbKk1iPYqllaDHc0zpA\n56bmbhKv7EZtZt3kcC+ZNJnmBGB5OvVBiYMyllR1M4cdt3rlDs1/YME3Vq2CHO4llBayOhh4OJ0a\nkNghY0lVNt4WexOK4BcUq/dBMebd3WNWKQ73korgTtJsNWATiglOz57gJTa2yZb7nchAetyCYkd7\ns8pwuJdYBN+i2ef+Soo9WD3BaWraCfdLgCfSsbtmrFIc7uX3ceA/0vERtDkluQ9NO9wjeIRiIw+A\nd0pMtk6IWWk43EsugqeBw2muDne6xOsyllQ1k22xN5mB9LgReOVOqw6HewVE8FuKCU5rKSbWXOrd\nglrWTrcMFH81Nf5hddeMVYbDvSIiuA44OTXnABdKrJ+xpKpoK9zT0hCNMe+v96glqwqHe7V8Bbgg\nHe9LczVJG1+7V+4wcsz7UeM+y6xEHO4VkiY4HQf8bzr1UYkDM5ZUBW2HewS3A9el5lH+i8mqwOFe\nMRE8RjHBaXU6da7EthlLKrtOXLlD8+p9S2CfNt7HrCcc7hWUriSPSc3nUkxwmjnBS/pZI9yfplhx\nc7ouBp5KxwvaKcisFxzuFRXBEuDzqbkTcKYnOI1paEXI1K01LRE8BFyemgdJzGq7MrMucrhX20eB\nH6bjoyn6422kqS73O5FG18zGFENTzUrL4V5haYLTfODedOoMid0zllRGnQz3q4D70vGCDryfWdc4\n3CsugvuAecAzwIYUE5xekLeqUml5i73JpH9Mz0/NPSVe3u57mnWLw70GIrgGOCU1XwIs8nC9IZ28\ncgePebeKcLjXx5coVjEE2I9iwTHrcLhH8BPgxtQ8Ku30ZFY6/sWsiTQS5FjgZ+nUxyUOyFhSWXT6\nyh2ai4m9jGIrRLPScbjXSASrKSY4NYLsfImtM5ZUBt0I9wspFnEDLyZmJeVwr5kIbqO4ggd4HsUN\n1mdlLCm3jod7BA8C307NQ6URywqblYLDvYYiuBj4cmruCvxjxnJya4R7y/untqhxY/XZ4A3MrXwc\n7vV1CnBtOn6PxLtzFpNDutnZWJahk90yAFcC96djd81Y6TjcayqCtRQTnH6bTp0pMTdjSTlsPOy4\no+Gefr6LUnNfiZd28v3N2uVwr7EI7qEI+EGKbeKWSDwvb1U91e4We5MZPub9XV14f7Npc7jXXARL\nKdagAdgaOK+PxmZ3arnfMUVwM3BLah7thdusTPrlf/J+9zngm+n4bcDHMtbSS10N96Rx9b4tsEeX\nPsNsyhzufSBNcFoA3JFOnSrx5nwV9Uwvwn0RxVrx4MXErEQc7n0igocpJjg9AYhig+2X5K2q67oe\n7hH8lmLkDMA8acRNXLNsHO59JIJbgfem5qbAJRIbZSyp23px5Q7N5QhmAe/s4ueYtczh3mciWASc\nmZqvBU7PWE639Srcvwv8Lh0v6OLnmLXM4d6fTgauT8d/JtV2GN/wcO/0DNUhETxFsd4MwJsk5nTr\ns8xa5XDvQymMDgUeSKfOktgpY0nd0qsrd2h2zayHx7xbCTjc+1QEvwYOB4JiJucSidl5q+q4bk9i\nGu5G4LZ07DHvlp3DvY9FcDXwN6m5LTBQs1BqXLk/A6zp5gel4aYDqfkKivsZZtk43O0zwHfS8TuA\nD2WspdOGlvtN4dtt51Ms9QBeTMwyc7j3uQgGKfYCXZFOfVpin4wldVI3NuoYVwT3Av+Wmof3+Tr6\nlpnD3YjgIYoJTk9S/E5cVJMRHz0N96SxHMFs4I96+LlmIzjcDRhaBOvPUnNziglOG2YsqRNyhPvl\nwMPp2F0zlo3D3YZEMAB8NTVfT7HgWJX1PNwjeBK4KDX3l3hRrz7bbDiHu412EsWwPoCTJA7PWUyb\nurXF3mQaXTPrA3/S4882AxzuNkq68jyE5nT6syVembGkduTolgG4Dvh5Ol5Qs+GlVhEOd1tHBCsp\nrjiDYg/SJRKzshY1PVnCPQ27bFy9vwr6bntDKwGHu40pgu8Bp6bmDsDXKngF2pih2usrd4DzYGhs\n/YIMn299zuFuEzkV+F46PgT4i4y1TEeubpnG8g7fT80jajDyyCrG4W7jShOcjgTuSqf+QWLPjCW1\nLO0TOzM1c1y5Q3M5gk2BAzLV0Pck/VDSTenrHkmX5a6pFxzuNqEIHqS4al9DMfpjscQWeatqyfAd\nkXKF+2XA6nS8IFMNfS8i9oqIuRExF/gRsCR3Tb3gcLdJRXADcGJqvgi4WGKDjCW1opfL/Y4pgseB\nS1LzbRKb5ajDCpJmAfvS3Cy+1hzu1qqzaXYz7Emx4FiZZQ/3ZCA9zgCOyFiHFVsgXh0RvZ73kIXD\n3VqShvedANySTv2lxCEZS5pMWcL9GpqLsnk5grwOp7ljVu053K1lETxBscBYY+2UcyR2yFjSRHqy\nxd5kRo15n1vTHa9KT9ILgN0p9rvtCw53m5IIfkFzG7nnAP8qjdjxqCzKcuUOcO6wY1+953EI8O2I\n6OqmLWXicLcpi+DbwKdTc0dgYQknOPVyi70JpRm/S1PzyArcjK4WaSHSUqQrkMbbKnI+fdQlAw53\nm76PA1en48NpjqYpizJduUOza2Zz4C05C6mh7YG9gbcCZ431hIjYJyKu6mlVmTncbVoieIZi9Mfd\n6dQXJV6fsaTRyhbul9Ksw10znfV4elwGHJ+zkDJxuNu0RXA/RV/mWoqhfpdIbJ63qiGlCvcIHqU5\neeZAiefnrKdmjgAWA/sRsSp3MWXhcLe2RHA98IHUnEOxRd+MjCU1lCrck0bXzIbAYTkLqZWIVUTM\nd7CP5HC3TvhnYFE63gf4VMZaGhrhPgg8lbOQYZYCv0rHC/KVYf3A4W5tS2O5jwd+kk59ROIdGUuC\nYStCpvqySwuxNYZF7i6xY856rN4c7tYRETxGMcHpkXTqXIltM5aUbbnfSXxj2LFvrFrXONytYyL4\nOc3uhlkUOzjNHP8VXZVr/9QJRXAncG1qHimxfs56rL4c7tZREVwGfC41dwL+JdMEp7JeuUNzMbEX\nA2/KWIfVmMPduuFjNGdkvos8Y49zbrE3mUuAJ9Pxgox1WI053K3jIniaYqjfvenUlyVe2+MySnvl\nHsHDwL+m5jslxpsybzZtDnfrigh+AxwKPE0xrvtSiRf0sITShnvSuLH6LGBezkLqSNJpkm6XdJuk\n9+WuJweHu3VNBNcCH0zNrYALengDsezh/n3gnnTsUTMdJOkYYE5E7BAROwIX5a4pB4e7ddsZwMXp\n+M3AJ3r0uaUO97Q2z3mpuYfE9jnrqZk/BU5tNCLi/oy1ZONwt65KE4jeA/w0nfobibf14KNLHe7J\n8DHvR2Wron5eDhwmaZmkKyTlnG+RjcPdui4tmnUwzTHn50ts3a3PS0MvG+PrSxvuEfwMuD41j5L8\n/2OHbAQ8ERG7A18Fvp65niz8y2Q9EcFPgXen5myKCU4bd+njNoahsfWlDfekcfW+FcW6PNa+u2mO\nRvom9OfWhg5365kILgFOT825wD926aNKsX9qiy4CGlu/+cZqZ3wT2Dcd7w3cnrGWbBzu1msfBq5J\nx8dKHNuFzyjNFnuTieAh4PLUPFhik5z1VMLk2+r9PXCwpOXAaRT3fPqOw916KoK1FPtZ/iad+orE\nrh3+mDKu5T6RgfQ4k2LzE5vYhNvqRcTDEfH2iNgpIv4gIm7teYUl4HC3novg/ygC/hmKm19LOrwz\nUdXC/SrgvnS8IGMdVeFt9VrgcLcsIvgB8JHUfBlwXgdHi1Qq3NNyDY3NTvaS2CZnPRXgbfVa4HC3\nnL5Ac1TDAcBfdeh9KxXuice8t8rb6rXE4W7ZpAlOxwB3pFN/K/GWDrx15cI9gluBH6emx7xb2/wL\nZFlF8AhwEEU/qijWn3lpm29buXBPBtLj1sCeGeuwGnC4W3YR/AR4b2o+H7hEYqM23rKq4X4hsDYd\ne8y7tcXhbqUQwQXAP6Xm7sCX2ni7Kk1iGhLBA8B3UvNQacR/h9mUONytTP4SuC4d/6k07RuLjVAc\nBJ5qu6reatxYfQ5Fd5XZtDjcrTQiWEOxwccD6dRZEjtP462GtthLN22r5AqgsUStu2Zs2hzuVioR\n3E2xRd8gxS5FS6axDV0VlvsdU5rBe0Fq7ivxkpz1WHU53K10Ivg+8Nep+XLgG1McGljZcE8aXTOi\n2GDcbMoc7lZWnwW+nY4PBD40hddWPdxvBpan46PT+vRmU+Jwt1KKYJBipuYv0qnTJN7Y4ssrHe7p\nPkHj6n074PUZy7GKcrhbaUWwimIHpycpflcvlNiyhZdWOtyTRRQLq4FvrNo0ONyt1CK4hWLDY4DN\nKCY4bTjJyyof7hH8BrgyNQ/r4q5VVlMOdyu9CL5Bc93u1wGfn+QllQ/3ZCA9zgLeMdmTJX1N0s2S\nlku6TNJzu1qdlZrD3ariA8AN6fh9EodP8NxGuFdmduo4vgM8lI4XtPD8D0TELhGxE7ACeF+3CrPy\nc7hbJUTwJMUuRb9Lp86WeNU4Tx+axNT1wroogqdojnl/s8SciZ8fqwEkiWKT8Acmen4nSBqQtELS\nTemrLzejLiOHu1VGBHdRbNQQFFvSLZGYNfw5adjgzNSsdLgnjVEz6wFHTvZkSecA9wI7AWd3sa6G\nAD4YEXPT1/JJX2E94XC3Song34BPpub2wDmjxoFvDEPtOoT7DcBP0/GkY94j4hjgxRTj5Du1+clk\nPA6/hBzuVkV/R3MkyUHAycO+N+lyv5JOlHSnpEFJndy7teOKMe8LHi/+Pfvk78ExN0jzlhZfuw2M\n/ZoYBC6iWF2zFz4j6RZJX5Q02Ugm65EZuQswm6oIBiWOBG6k2H/1sxLLIvghra3lfg3F7Nel3ayz\nc9auaf6xwq7N8/NGPEvSthFxZ+pzPxC4qQfFfTQi7kuhvhD4MPCpHnyuTcJX7lZJEfyO4gbrU8D6\nwGKJLWgh3CPi5oi4q/tVdsraNZM9IwX6gKTlwC0Um558utuVRcR96XENcA7w2m5/prXG4W6VFcGN\nwImp+UJgMYxYQbIOfe4ticIbImKn9PXuiHii7TeWFiItRboCaZ3VOSVtkR4F/DFwa9ufaR3hcLdK\ni+Bs4Oup+QZGTnDqm3Dvou2BvYG30pxINtz56a+F5RR/LfxdD2uzCbjP3ergRGAufHIuxQzW5K7P\nS4+thhUrI25YkKm2qns8PS4Djh/9zYhodTE36zGHu1VeBE9IHAKDt8Opw3+n083HeWO+LqnAML4V\nK8f+b1ixsgcffgTFFfvxRKzqwedZhzjcrRYiWCHd+zMYd9bqEEknAadQ9NMvl/TdiDiu2zVOV9a/\nOopAn5/t823aHO5WIw8/2MqzIuIM4IwuF2OWlW+ompnVkMPdzKyG3C1jNZL1xqNZqSgictdgZmYd\n5m4ZM7MacribmdWQw93MrIYc7mZmNeRwNzOrIYe7mVkNOdzNzGrI4W5mVkMOdzOzGnK4m5nVkMPd\nzKyGHO5mZjXkcDczqyGHu5lZDTnczcxqyOFuZlZDDnczsxpyuJuZ1ZDD3cyshhzuZmY15HA3M6sh\nh7uZWQ053M3MasjhbmZWQw53M7MacribmdWQw93MrIYc7mZmbZK0r6QbJd0qaUDS+rlrcribmbVB\n0nrAADA/Il4N3AUcnbUoHO5mZu3aFFgTEXem9tXAwRnrARzuZmbtegCYIek1qX0IsFXGegCHu5lZ\nWyIigMOA0yVdDzwCPJO3KpiRuwAzs6qLiOuAvQAk7Qdsl7ciX7mbmbVN0mbpcSPgQ8C/5K3I4W5m\nNjlpIdJSpCuQZo/xjFMk3QbcAnwrIpb2tsB1qeguMjOzcUlLgb1TazER8zNW0xJfuZuZTe7x9LgM\nOD5nIa3ylbuZ2WSKrpizgOOJWJW7nFY43M3MasjdMmZmNeRwNzOrIYe7mVkNOdzNzGrI4W5mVkMO\ndzOzGnK4m5nVkMPdzKyGHO5mZjXkcDczqyGHu5lZDTnczcxqyOFuZlZDDnczsxpyuJuZ1ZDD3cys\nhhzuZmY15HA3M6shh7uZWQ053M3MasjhbmZWQw53M7MacribmdXQ/wM9dMLn+D4sogAAAABJRU5E\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 2, 3])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "We see that we made a valid left turn at point 1, but a right turn at 2. So we remove point 2 from the hull:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nzF1xAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 3])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "We move on to points 4 and 5:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 3, 4, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 4 is a right turn, so we remove it:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\npBb6f8UkB+QYCHlkAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 3, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "But now we see point 3 is also a right turn. The addition of one new point (5) can remove multiple points (4 and 3) from the hull. We remove 3 and move on to 6, 7, and 8:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nBTnczcwq6H8BB2LxyYMH+6IAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 5, 6, 7, 8])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 7 is a right turn so we remove 7 and move on to 9:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 5, 6, 8, 9])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 8 is a right turn, so we remove 8. But then 6 and 5 are also right turns, so they too are removed. We proceed on to 10:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nA/8UwWnLnqNpwLmkt4PeBxwbEUXf8ulwN7O2kYN2M/qudDmxn1ODFLK1sL8rgtdGeM13Qc+D3S9F\n9Oyjmj+vFYCFwLSImC/p74DHI+KykVyvURzuZta2JFYkvae+FvYfBMb1c+obwF3U17D/9VCbqfI7\nfR7Lw+MiuLTv57U2cHdETM7j3YEvRcTHhv0f1EAOdzPrGBKrkJqpamG/A/03Uy0CfkE97OcN9HBW\nYkdgdh5+IoIf9f28RAr/AyPiPknnA3tHxLYN+E8aMYe7mXUsiTWBvagvfrbZAKc+QX0KZ2YEz/T6\nGvsCP83DD0Twy2Wvo6nAP5J+a7gF2D8iiu6z6nA3s64h8Wf0baZaZ4BTfwPcCgdsDe/ZCNbJPxQW\n/Apefw0WLIyYc1T/19A+wDER8clG1z8cDncz60r54ezW1IN+L5ZppjojfyztkNsirtur/rW0dkQ8\nJ2kc8BPgrIiY1fiqh25MyYubmZWS59gfyh//nLfS25n6FM5Uhp6Rp0naH1gBmFE62MF37mZm/ZJY\nDY67Cy7ZZtnP9r1zr6IVShdgZlZFadGylxvSCFWCw93MrAN5zt3MbEALFsIhAxyvNs+5m5l1IE/L\nmJl1IIe7mVkHcribmXUgh7uZWQdyuJuZdSCHu5lZB3K4m5l1IIe7mVkHcribmXUgh7uZWQdyuJuZ\ndSCHu5lZB3K4m5l1IIe7mVkHcribmXUgh7uZWQdyuJuZdSCHu5lZB3K4m5l1IIe7mVkHcribmXUg\nh7uZWQf6/wOA1m3YAsk2AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 9, 10])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Now what do we do? We got all the way to the end of our set of 11 points, but we only got half the hull (the lower half). Well, if looking at all the points in left-to-right order gives us the lower half of the hull, maybe looking at all the points in right-to-left order will give us the upper half. Let's try. " ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nIMNdkhr0/9GWHng179/7AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 9, 8])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Point 9 is a right turn; remove it and move on:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nf7se1IjE6GWnAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 8, 7, 6, 5])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Adding 5 reveals 6, and then 7, to be right turns; remove them and move on to 4:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nzVwUwdLG24FZEXFA+rWwtcqt3RzuZgWJiGOB7amuvs8cw6EaQzMHpg2vL0z9R6mWHGgmrOc43K12\nJJ0gabGkVZImr/8T/SUiVlHNYlnXQ0jr0wj3jYAbgG1T//MRPDfkvRdKukfSZZImYD1BEb7ZbfUi\naX/gaaoNnKdFxFN5K2oPSVMiYnEac78YeD4ivtjasd76XXjT+1b/7osr4LbvRiz4aNM5t42IZSnU\nZwN/iIjzsexa3uXcrF9FxN0AVQb2EWk2MJVqLZcZzXuIpkC/TtLE9K0FwD+2frLJk+Hcod/cHP6w\nS/M3ImJZ+vpSGu+f1fo5rZ0c7mb9YypwRGpfDUxvvBDVj+Bv6nZBkraLiMfS/1zeB9zb7RpseA53\ns/6xMn2dD8zMWUiTGyRtRXVT9S68OmTPcLib9Y8ZVFfsM5uHZHKKiKNy12DDc7hb3fXPwHsV6NPX\n+z4zHO5WonXceKxe1meA04BtgIWSbomIT3S/0F625CH4wFq+b/3AUyGtPNJcBm88ziHCV7tWO36I\nyUrUizcezbrKV+5WHmkSPXbj0azbHO5mZgXysIyZWYEc7mZmBXK4m5kVyOFuZlYgh7uZWYEc7mZm\nBXK4m5kVyOFuZlYgh7uZWYEc7mZmBXK4m5kVyOFuZlYgh7uZWYEc7mZmBXK4m5kVyOFuZlYgh7uZ\nWYEc7mZmBXK4m5kVyOFuZlYgh7uZWYEc7mZmBXK4m5kVyOFuZlYgh7uZWYEc7mZmBXK4m5kVyOFu\nZlYgh7uZ2RhJOlLSbyTdK+k6SeNy1+RwNzMbA0kbANcB0yNiH+Bh4CNZi8LhbmY2VlsAL0XE4tT/\nGfD+jPUADnczs7F6EhgvaVrqHwPslLEewOFuZjYmERHAB4HLJc0DngVezVsVjM9dgJlZv4uIO4DD\nASQdDeyetyJfuZuZjZmkrdLXjYDPAVflrcjhbma2ftJspLlItyJNGuYdp0m6H7gH+EFEzO1ugWtS\nNVxkZmZrJc0Fjki9OURMz1jNiPjK3cxs/Vamr/OBmTkLGSlfuZuZrU81FHM1MJOI5bnLGQmHu5lZ\ngTwsY2ZWIIe7mVmBHO5mZgVyuJuZFcjhbmZWIIe7mVmBHO5mZgVyuJuZFcjhbmZWIIe7mVmBHO5m\nZgVyuJuZFcjhbmZWIIe7mVmBHO5mZgVyuJuZFcjhbmZWIIe7mVmBHO5mZgVyuJuZFcjhbmZWIIe7\nmVmBHO5mZgX6f4EBFStKeGtdAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 8, 5, 4])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Remove 5 and continue on to 3 and then 2:" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAADsCAYAAACPFubKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAE+dJREFUeJzt3XmwZGV5x/Hvww4qDiDqACKyC27IIhojihtqQlAQcES4\nGCJq0EoqqIlWJZaRGJOYpEglCma5CEQcRcAFFCUZUhhZBQaDwiCBAAKyDaLszJM/zttz17m379Zv\n39PfT9WpPm93n+7nDjM/zn3f97wnMhNJUrusV7sASdL8M9wlqYUMd0lqIcNdklrIcJekFjLcJamF\nDPdJRMQLIuKyiFgVEWdFxIa1a5KkmTDcJ/dZ4HOZuQvwAPC7leuRpBkJL2IaKyIC+AXwnMxcExH7\nA5/MzIMqlyZJXfPMfaKtgNWZuaa07wC2rViPJM2Y4S5JLWS4T3QfsCQiOn8229GcvUvSomG4j5PN\nIMR/Au8sTx0DnFuvIkmaucEcUI04FdgVeBhYRubqsS/HC4CzgC2BHwFHZeYTPa9TkmZpUMN9BXBA\naS0n84iK1UjSvBvUbpmHy+MVwPE1C5GkhTCoZ+5LgFOA48d3yUhSGwxmuEtSyw1qt4wktZrhLkkt\nZLhLLRMRJ0fEQ7XrUF2Gu9QiEbEPsARwMG3AOaAqtURErA98D1gGrMrMZ1QuSRV55i61xwnAeZl5\nV+1CVN8GtQuQNHcRsQ1wGPDack8CDTjDXepzEfsMw447THzl5lsyrxwqjZcBOwM3lfZmEXFjZu7a\ngxLVhwx3qYiIM4G9gSeAy4HjM/PJulVBE+zLD5j4/OFr9zLzfGBppx0RDxnsg80+d2nEGZm5e2a+\nGNgUOK52QVPbfo8ITozg1RFsNu5FZ0oMOM/cpSIzLxjVvILmRi197OlbA39dGk9FcC1wKXAZ5D4R\nRKYhP6gMd2mciNgQOAr4cO1apvbkY8DGpbE+8PKyfbA890AEl7E28Lk8k/t7XqaqMNylif4JuDgz\nf1C7kKndeCnwbuAVwP5l24emSwlgC+CgsgEQwY00Yd8J/Osy8UY0LeRFTGq9LmeblPfGnwEvzcx3\n9KK2bjT1770fLH1h88zNl8Ojj0xePxsCL2Js4O82xcc/AlzFqMDP5Pb5/hnUe4a7Wi/i8BXrmG1y\nceby1468L44DjgVen5mP9qq+bkTwLuDfS3P3TG6YwbFbAPvRBH0n9LeY4pA7GDmzvxS4KnPtDW60\nSNgtI434PHAL8MNyHdDZmfnpqhXNg0weAL5bNiIImjnxnTP7VwAvZSQPtgUOLRs0g7UrGRv4qzJZ\n06ufQTNnuEtFZm5Yu4ZeKDNoVpXtdIAylfLljJzZvwJ4XjlkfWCvsn2gPLd63GDtZQ7W9hfDXRKl\n2+WSsgEQwbY0Id8J/H1g7Xz6JcCby9Z5/40wJvBXOlhbj+EuaVKZ3AF8vWxEsAHNYO3ovvvdRx2y\na9neU9qPRnAlI4F/qYO1vWO4awDcfEtzqf6SZ8E2ezbP3fmT5nl1K5MngWvK9gVYO1i7L2MDf8ty\nyCbAq8tGef/PmThY++se/QgDxdkyGhgRbAT8HNgK+F4mb6pcUtfmMluml0YN1o6eijl6sHa8p4Dr\nGBv4NzpYO3eGuwZKBP9As+55Atsvlm6CxRLuk4lgU8YO1u7PyGDtZFbTLNzWmXt/eSb3LXSdbWO4\na6BEsDdwZWl+PJPP1KynWxEsA84szUUV7pOJYBvGzszZFyYsfjbaKsYO1l7rYO3UDHcNlNJtcB2w\nJ3AD8MLFsLhW28J9vDJYuydj596/cIpDHqW5snbtYC1we63/lhHxVuAvaH4j/BUwlJk/q1HL2poM\ndw2aCE5kZDXFV2Zyac16ujEu3HfL5Maa9fRCBEsYGaztBP5WUxxyJ2P77q/s1WBtRPwvcFBm3hAR\nHwD2y8xje/Hd6+JsGQ2iM4HP0tzP4Bjo/3AfRJmsprnh9/dg7W9dOzF2Zs7LGMmxpcDbywawJmLC\nYO0NCzRYexfwzLK/hGYJh6o8c9dAiuB84C00g3dLM+mrtWTGG8Qz926Uwdq9GBv4209xyIOMDNZ2\nrqy9d+51xN7AhcDDwC+B/TPzobl+7pxqMtw1iCI4HPhKaR6RyfKa9UzHcO9eBEuZOFj7tCkOuYmx\nffcrM3m8+azpVxSNiPWAHwPHZOYVEXEisFtm/t78/ESzY7eMBtU3aM7al9B0zfR1uKt7mdwJnFu2\n0YO1o6dijh6s3bls7y7txyI6g7V77wun7DHxWw4f3dga2Cgzryjt5cAFEw7pMcNdAymTRyM4C3g/\ncFAES0soqGXKlbXXlu1UGDNYOzrwO4O1GwOvaralEz5vEvcAm0XELpm5CngjcP18/gyzYbhrkJ1G\nE+7r0Zy1/U3dctQr6xis3ZGJg7XTrhSamWsi4r3A8mjWir4feO8Cld41w12D7DKaue67AUMRfG4x\nzHnX/Cv/3X9WtjMBItgEbv1vmgHbaY7P7wDfWdAiZ2i92gVItZR/0KeV5p40l8hLQNN1B7/+5eSv\nPneHnhYzC565a9CdDpwEBDBEc9WjVHRWFAXYeBN4/l6wwUaw5fMj+EQmJ9WsbipOhdTAi+BCmkGw\n+4BtOtPg+olTIftDBLsAFzMy0vqxTP6qYknrZLeMNNI1sxXwtpqFTCFqFyDIZBVwIHB3eeqzEfzh\nTD4jIk6IiJsiYk1EbDnutZMjYlVEXBsR0/b1T8Vwl+AcoHM14VDFOrrlr9sVZfJT4PU0UyAB/jaC\nD83gIy4px986+smy+NjOmbkL8D6aG7bPmuGugVfuH9q5iOmtETy7Zj3qf5n8D/AGWHtT8JMjeH93\nx+Y1mXnrJC8dTPktMjMvA5ZExHNmW6PhLjWGy+MGwLKKdWiRyGQlTcCvLk99PoLj5vCR2wK3jWrf\nDmw32w9ztozU+AHNHOedaJYj+Pu65WgxyOTqCN4IXASf3Bz4YsRdfwT33z3yrpF1aLowfmxl1l1w\nhrtEM+c9gtOATwEvi+ClmVxbuy71v0yujODNsOYS+NT6wO5lKw5f16Hj3cHY2w9uxxyWDrZbRhpx\n+qj9Y6pVoUWnueHLbStncejoM/VvAEcDRMT+wOrMvHvSo7pguEtFJrcAK0rzqIjp1xWRRqzratax\nIuLDEXEbTR/7yog4FSAzzwdujoibgFOAD86lGrtlpLGGgdfSLON6EPDNmsWofTLzZODkdbx2wnx9\nj2fu0lhnw9r7bto1o0XLM3dplEx+FcHXaIL94Ai2yuS+2nVpMRi9Ds3453vPcJcmOo0m3DcEjgT+\nsW45WgxmMN2xJ+yWkSa6mJFLw4cq1iHNmuEujZPJGuBLpblPBHvWrKcYPWXOtWU0LcNdmtxpo/Yd\nWNWiY7hLk8jkZzSr90Ez593xKS0qhru0bp2z96U0C0RJi4bhLq3bV4FHyv5QxTqkGTPcpXXI5EGa\nG3kAHBLBkpr1SDNhuEtTGy6PGwNHVKxDmhHDXZrafzCy7KqzZrRoGO7SFDJ5ipE576+MYLea9Ujd\nMtyl6Y2e8350tSqkGTDcpWlkcgNwaWkeHcH6NeuRumG4S93pnL1vB7yuZiFSNwx3qTtfAR4r+w6s\nqu8Z7lIXMnkAOK80D41g8x6X4MJhmhHDXepep2tmU+CwmoVI0zHcpe5dCNxV9ocq1iFNy3CXupTJ\nk8AZpfmbEexUsx5pKoa7NDPOedeiYLhLM5DJj4GrSvPoCP8NqT/5F1OaueHyuAPwmnplSOtmuEsz\n92XgibLvnHf1JcNdmqFM7gO+VZrvjODpNeuRJmO4S7MzXB6fBryjYh3SpAx3aXYuAO4p+3bNqO8Y\n7tIsZPIEcGZpHhjB82vWI41nuEuzN3rO+3t6+L2uLaNpGe7SLGVyDXBtaR4TMWZxr/m2kJ+tFjLc\npbnpnL3vDLyqZiHSaIa7NDdnAk+W/aGKdUhjGO7SHGTyC5qZMwCHR7BpzXqkDsNdmrtO18zmwCE1\nC5E6DHdp7r4F3F/2hyrWIa1luEtzlMljNOvNALwhgm1r1iOB4S7Nl+HyuB69nfMuTcpwl+bHVcD1\nZX+h57xL0zLcpXmQSTJy9r47sF+9aiTDXZpPZwBryr6Liakqw12aJ5ncCVxYmkdGsMlCfdUCfa5a\nxHCX5tdwedwC+O15/Fz78DUjhrs0v84DHiz7ds2oGsNdmkeZPAqcVZoHRfDcmvVocBnu0vzrLEew\nPvDumoVocBnu0vy7FLix7A855101GO7SPCtz3jtn7y8C9qpYjgaU4S4tjNMZmbI4VLEODSjDXVoA\nmdwGXFSayyLYqGY9GjyGu7RwOl0zWwFvrVnIIIuI/4qIq8t2R0ScU7umXjDcpYVzDvBQ2R+qWMdA\ny8zXZOZembkX8EPg7No19YLhLi2QTH4NfLU03xbB1jXrGXQRsTlwIHBu7Vp6wXCXFtZwedwAWDZP\nn+naMrNzCPD9zPxV7UJ6wXCXFtYlwM1l3+UI6noXI3fMaj3DXVpA4+a87xXBS2b5UV4INQcR8Sxg\nX+DbtWvpFcNdWnhfGrXv2XsdhwHfzMzHaxfSK4a7tMAyuQVYUZpHRbBhvWpaKOJUIlYQcT4RS9bx\nriMYoC4ZMNylXul0zTwbeHPNQlpoV+AA4C3AKZO9ITNfl5kXTvZaWxnuUm+cDTxc9u2amV+dP9cr\ngONrFtJPDHepBzJ5CPhaaR4cwZY162mZZcBy4E1krq5dTL8w3KXe6XTNbAQcWbOQVslcTeYRBvtY\nhrvUOyuA/yv7Q/XK0CAw3KUeyWQNI9Mi941gj5r1qN0Md6m3Thu178CqFozhLvVQJjcBPyjNoyJY\nfzYfM48lqaUMd6n3hsvjNsAbK9ahFjPcpd77KvBo2bdrRgvCcJd6LJMHaW7kAXBIBOu6ZH40Fw7T\njBjuUh3D5XET4PCKdbRSRJwUETdExPUR8aHa9dRguEt1XATcUfbtmplHEXEssG1m7paZewBn1a6p\nBsNdqiCTp4DTS/NVEexas56WeT/wqU4jM++pWEs1hrtUz+g570dXq6J9dgKOjIgrIuL8iNi5dkE1\nGO5SJZn8FLisNI+O8N/jPNkYeCQz9wW+CPxr5Xqq8C+TVFfn7P15wOtqFtIitwNfL/vnwqxvbbio\nGe5SXWcBnVu/ObA6P84FDiz7BwA3VKylGsNdqiiTB4DzSvPQCJ5Rs55FYfrb6v0lcGhErAROAo7r\nbYH9wXCX6ut0zWxGcyPn6Qz62jJT3lYvMx/MzN/KzJdk5m9k5nU9r7APGO5Sfd8F7i77QxXrWCy8\nrV4XDHepskyeBM4ozddEsGPNehYBb6vXBcNd6g/Oee+Wt9XriuEu9YFMrgN+VJqTzXl34TDNiOEu\n9Y/h8vgC4Dcr1qEWMNyl/vFl4Imy75x3zYnhLvWJTO4FvlWa74zgaTXr0eJmuEv9pTOw+nTgHTUL\n0eJmuEv95QLg3rJv14xmzXCX+kgmjwNnluaBEWxfsx4tXoa71H86XTMBvKdmIVq8DHep/1wDrCz7\nx0RMmOM+6GvLqAuGu9RnMklGzt53AV5ZsRwtUoa71J/OBJ4q+0MV69AiZbhLfSiTu2lmzgAcAWxa\nsRwtQoa71L86XTObA78z3Zsj4l8i4pqIWBkR50TEMxe2PPWzyHRsRupHEWwM3AlsQTOI2hlY3T6T\n2ya+P56RmQ+V/c8BD2Tmp3tVr/qLZ+5Sn8rkMZr1ZqCLVSFHBXvQdOPcO/URcxcRwxFxc0RcXbaB\nvBl1PzLcpf42PJM3R8S/0ZztvwT454UoaJwETszMvcq2ctoj1BOGu9TfrgR+0u2bM/NYYBuaefKf\nWKiixnGt+T60Qe0CpF6LiBOAPwB2BJ6VmfdXLmmdMsmIoYdhh1HPrloe8cRjcPMtmVcOTTwm10TE\nWcBHe1TmZyLiT4GLgD/OzMd79L2aguGuQXQJ8E1gReU6uvTE4/DJ0U/s3zwcPuZdEbFzZt5U+twP\nBq7uQXF/kpl3RcRGwKnAx4A/78H3ahqGuwZOZl4D0GTgYvDEtGfCJdCHI2Lz8tSVwO8vaFlAZt5V\nHh8v/f0nLvR3qjuGu9QC2cxpfvW8f3DEqcCuwMPAsvE3pY6IpZl5Z/mfy9uB6+a9Bs2K4S5pKrsC\nB5T9U2iulh3tjIjYmmZQ9Wrg4z2sTVMw3CVN5eHyeAVw/PgXM/P1vS1H3TLcNegWQcf7zbeMHzwd\neX7BLaM5Yz9+fJeM+pvLD6h9pu8n/jDwEeA5wD3AtzPzfT2vU1pAhrvaJ2IFI/3Ey8kc308stZ5X\nqKqNpuwnlgaBZ+5qn4gl2E+sAWe4S1IL2S0jSS1kuEtSCxnuktRChrsktZDhLkktZLhLUgsZ7pLU\nQoa7JLWQ4S5JLWS4S1ILGe6S1EKGuyS1kOEuSS1kuEtSCxnuktRChrsktZDhLkktZLhLUgsZ7pLU\nQoa7JLWQ4S5JLWS4S1ILGe6S1EKGuyS1kOEuSS1kuEtSCxnuktRChrsktZDhLklzFBEHRsRVEXFd\nRAxHxPq1azLcJWkOImI9YBg4IjNfDNwKHFO1KAx3SZqrrYDHM/Om0v4+cGjFegDDXZLm6l5gg4jY\nu7QPA55XsR7AcJekOcnMBI4E/i4iLgN+CTxVtyrYoHYBkrTYZealwGsAIuJNwC51K/LMXZLmLCK2\nLo8bAx8FvlC3IsNdkqYXcSoRK4g4n4glk7zjIxFxPXAt8I3MXNHbAieKprtIkrROESuAA0prOZlH\nVKymK565S9L0Hi6PVwDH1yykW565S9J0mq6YU4DjyVxdu5xuGO6S1EJ2y0hSCxnuktRChrsktZDh\nLkktZLhLUgsZ7pLUQoa7JLWQ4S5JLWS4S1ILGe6S1EKGuyS1kOEuSS1kuEtSCxnuktRChrsktZDh\nLkktZLhLUgsZ7pLUQoa7JLWQ4S5JLWS4S1ILGe6S1EKGuyS10P8D8NAtsmXH/VgAAAAASUVORK5C\nYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 8, 4, 3, 2])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Now 3 is a right turn; remove it and continue on to 1 and finally 0:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\nrkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 8, 4, 2, 1 ,0])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Adding 0 makes, 1, and then 2 be right turns, so they are removed:" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [10, 8, 4, 0])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Let's bring back the lower hull and concatenate it with the upper hull:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAADsCAYAAACPFubKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAHyxJREFUeJzt3Xm4XFWd7vHvC4FAgCQEgkyiQgBl0oTBiDIFZ71iMwrt\nAIjQKDjidbw2IuKA0g23LwqooALKdLG1Ha4SDQrNbCCgAgkxCIgKGYAACST53T/2qlOnklPnVJ1U\n1dpV9X6ep57svU9V7d8J4a1da+21liICMzPrLevkLsDMzFrP4W5m1oMc7mZmPcjhbmbWgxzuZmY9\nyOFuZtaDHO5DkPQSSbdImivph5LWy12TmVkzHO5D+wrw9YjYEVgMvDdzPWZmTZEHMdWSJOAfwAsi\nYpWk6cDpEfHGzKWZmTXMV+5r2gxYEhGr0v4jwDYZ6zEza5rD3cysBznc17QQmCip8nezLcXVu5lZ\n13C4ryaKTojfAEekQ+8BfpSvIjOz5vVVuEtHLJGINR/vCYmHJe6U+BXM3gC2P1fafCHstjcsWSJx\nkMTuEltK+NZIMyu1MbkLKAdB0WmaOk5fATxQ+eEk4AdrvEI8ATwGPJ4eI20/EYFvTTKzjnC4A7Di\neeBSYDKweXpMBiYM86IJ6TGl0ZNIA4HfyIfB4xEsa/pXMTPD4Z5IwIkRrFjt6PoUV+6rh/7q24P/\nXL/OScYAW6ZHo1UtpcEPgrS9OIJVQ7+bmfWTvhrEJO05D7bfvHpk7DgYsx4sAX701Qg+sXbvj4CN\nGf6DYPXtSaR2oRZYBSyiueaiZ9xcZNZ7+ircVycxDrgZ2D0dOjSCaztcwxhgU4b+JlBve1wLS1hG\ncx8GC1f/hmNm5dPX4Q4gsSNwOzAeeArYK4L781Y1vPShtDnNfUNo5Z1Ri2muuegpfzsw66y+D3cA\niUOo3st+DzA9gqczltRSEusAE6nfVzDU9iYtLOF5mvswWBjB8haev69IOg84LiJa+d/QuozDPZH4\nMgy0uV8GvKufrzYlxlLMs9PIt4LKdivv/3+KoT8A6n0oLHFnMkjaC/gg8PaIGJ+7HsvH4Z6ktu9f\nAgelQx+I4PyMJXWV1Jk8nuaaijZtYQkrKaaOaPgbQgTPtvD82UlaF/gVcAww11fu/c3hPojEFsBs\nYGuKpoT9I7g5b1W9K430nURjHwaT02NsC0t4huaaixZFsLKF528pSR8CiIhzJT3lcO9vDvfVSOwL\nXE9xX/rDwLQIHstblcHAt4NxNNdUtBmtu9U0KG41bXggGrC0E817krYGrgAOpLgl9kmHe39zuA9B\n4lTgvLR7HfDGMl+xWX0S61K91bTRzuSNWljCcpr7MHg8gudrf4e9LoHtX7zmW89fEHH7scVz9Gbg\n2zAwqnk74IGI2KmFv4t1EYf7ENIV4mXA0enQFyP4bMaSrAMkXQbsCVoBE+6GuV+HzVcfg1Bve90W\nlvIENaH/sb3g60OMbD7y+ogrD6zzu7hZps95+oEhRBASJwIvB3YBPiNxSwQ/yVyatdelEfHPAJIu\nh8l7RcQ3R3pRuhiYQOOD0DansXmLdih262X0drtInEYxEO/3ETwz6Ie+autzDvc6IlgqcRhwG8WU\nAt+XmBbB/MylWZtExM8H7d5GsVBLA68jKOawWALMbeQ1ad6izWjow2DFyxhyzqKNJwNnp52VEndR\nBP0tEHtJqJ9v5+13DvdhRHCvxHHAVRRXUtdI7Ntrt9BZLUnrAe+kuF+8LSJ4Dng0PUao5/5ZwAFr\n/mTFc1RDf11gWnq8Px1bLHELA4HPrREsWsvSrUv01WIdoxHB1cA5afcVwPnpa7j1rvOB6yPixtyF\nDO/+m4AXAocDXwN+BzUXHpsCbwROB34OLJS4T+K7EidLTPPCM73LHaoNSP8DzAT2S4dOjOCijCVZ\nm0j6V+DlEXFo7loqGrlbpvpc1gN2A6anxyuBnYd5+2eBOyiu7m8Gbong4RaUbZk53BsksRXwe4r5\n2J8DXh3B7XmrslaSdAJwHHBwRPTMQikSk4B9KIK+EvjDjQ5+hGpTzs3AHat11loXcLg3QWI/isWz\n1wUeBPaMYGHeqqxh0oXAThQjU48hYkntj/U8sABYmg5dExFndrTGDkjNijtSDfrpFHeG1budcyUw\nh9rAn+u5fMrN4d4kiY8CX0+7vwDe6gFOXUKaRbVj8koijspYTamkaaSnURv4w90ttARqOmtvcWdt\nuTjcm5Sueq6k6MQCOD2Cz2csyRol/Qx4E8Vtjq9f/crdaklsQ21Tzt7AhsO85H5qA3/O6qNtrXMc\n7qMgMR64laKjKoA3R/CLvFXZiKSJwAXASQ725qWZU3enNvBfOsxLllEshFMJ/JvdWds5DvdRktiV\nIuDHUaxMNC2CBVmLMuswiU1Zs7N20jAv+Strdtb2zMI4ZeJwXwsS7wB+kHbvAF4TQc/cZWHWrNRs\nOYU1O2vrDZhcCdxNbeDf787atedwX0sS51IdyXhRBCfmrMesbCQ2ZM3O2hcO85IlFN+KK/fe3+q7\n0prncF9LaY6QWcCr0qHjI7g4X0Vm5SexNdWgnw7sRdHEWc9cajtr73Jn7fAc7i2Q7iqYTTHR0zLg\nVRHcmbcqs+6ROmt3ozbwR+qsvYNBnbXAw7kmSkvz6Z9FcYPFUuDYiHggRy0DNTncW0NiBsX6lesA\n84G9Ilictyqz7iUxkdrO2ukM31n7KLVt97d3qrNW0p+BN0bEfZJOBvaJiOM6ce66NTncW0fiE8CX\n0+5/AYe4Y8isNVJn7Q7Utt2/gvqdtatYs7P2vnb8PynpJuBDEXGrpE8BG0VE1gV+HO4tlP7xXQsc\nkg59JoKzMpZk1tNSZ+1UaidK226YlzxBtbO2MrL28bWvQ3sCv6SY2uJJYHpEPLW277tWNTncW0ti\nAsXAjSkUVw5viOC6vFWZ9Y80yd/qnbXDrYs7j9q2+zlpvv1G169dB7gHeE9E3CbpNGDniHhfa36j\n0XG4t4HEHhT/SDakWAtzWgQP5a3KrD+lztpdqQ38lw3zkuUMdNae9Aa4YJc1n1Jdv1bSC4AbI2JK\n2t8O+HlE7NrCX6NpXompDSKYI3ES8D2K5dKultg/guWZSzPrOxGsAO5KjwthoLN2b2oDf7P0krHA\nvsVjq0ZO8RgwTtKOETEXeB3wx1b+DqPhcG+TCL4v8SrgZIoe/3OAD+StyswAIlhCcXfbr2Cgv2x7\natvup9JARkbEKknHA1dKErAIOL5NpTfMzTJtJDEW+C1FuAO8K4JLM5ZkZg2S2ACO+2+4eOqaP602\ny5SV11Bto9QMcwQMDJ2+UGL3jCWZWYOKeaKefnLon2754o4WMwpulmmzCP4icQzFwh4bAtdI7B3B\nE5lLM7MRzV8AR6btsRvAi6bCmPVh0oskPhPBF3NWNxw3y3SIxGeBL6Tda4HDcg2VNrPRkdgRuJ5q\nT+snIvhqxpLqcrNM55wF/DRt/xPw8Yy1mNkoRDAXmAH8PR36isRHmnkPSadImidplaRJq/3sPElz\nJd0laYi2/sY53DskDXl+F/DndOhLEgfmq8jMRiOCe4GDKW6BBDhH4tQm3uKG9PoHBx9Mk49NiYgd\ngROBb6xNnQ73DkoTiR1GMUhiHeCKNKOkmXWRCP4AvBYGFgU/T+JfGntt3BkRDw7xo7cB303PuQWY\nmAZIjYrDvcMimA28P+1uAVwpsV7GksxsFCKYQxHwlfV4vyFxwlq85TZQM5L9YWDb0b6Z75bJIILv\npAFOJ1CMhDsb+HDeqsysWRHMlngdcB28fQJMvEhafi6sGLSQyPzHI+6Y0uBbavVTjLY2h3s+p1Is\nPTYN+JDETRFckbkmM2tSBLdLvAEm3AyXwBorSh3R6Fs9Qu3yg9umY6PiZplM0kLah8PAgh7flhhi\ngiIzK7sIboHlS0fx0sFX6j8G3g0gaTqwJCL+PuSrGuBwzyiCPwPvpPjqtRHFAKdN8lZlZqOzcmUj\nz5L0QUkPUbSxz5F0IUBE/AyYL2kecAHVvrlR8SCmEpD4PPC5tHsVcJQHOJl1F+mIJXDVhDV/csQT\nEVdN7HQ9vnIvhzMoVnGBooHOnatmtlZ85V4SEpsBv6dYImwlcFAEv8tblZk1StpzHkyZDBuOL44s\nfxZWPNfk3TKtq8fhXh4Se1OMXlufYiX3aRH8LW9VZtYoib2A29Lu2yP4z1y1uFmmRCK4Dfhg2t2K\nYgSrb1c16x6bD9pe64W314bDvXwuJA1BBvYHvpSxFjNrjsPdhpbuknk/MCcdOk3i0IwlmVnjBof7\nY3Wf1QEO9xKK4BmKCcYqC3pcIrFzxpLMrDGT05+rqM45k4XDvaQimEcarQZsQjHAaaOMJZnZyCpX\n7gvTNN/ZONxLLIIfU21z3xW4KK3SbmblVAn3rO3t4HDvBp8Dfp22jwY+kLEWMxteJdyztreDw730\nIlhBEeqV2eHOSdMFm1n5VNrcfeVuI4vgHxQzSD4PrAdcJbFF3qrMbAhulrHmRHAz8NG0uw3wA4l1\nM5ZkZoNIrANslnYd7taU/wNcnrZnAF/IWIuZ1dqUaqa6zd0alwY4nQj8IR36lMTbMpZkZlWlGZ0K\nDveuE8HTFAOcnkqHvifR8RnnzGwNDndbOxHcBxyXdidQDHAaN8xLzKz9SjP1ADjcu1YE1wBfS7t7\nAN/wACezrCYP2vaVu62VTwG/TdvvpmiPN7M83CxjrZEGOB1FsbAHwHlpwQ8z67xKuC8DnslZCDjc\nu15aqelIiqX51geulmquIMysMwamHijDAvcO9x4QwQ3Ax9PudsBlHuBk1nGlmXoAHO695N+Bq9L2\n6ykmHDOzzinN1APgcO8Z6Wvge4F706HPSbw5Y0lm/cbhbu0RwVMUA5yeToculXhJxpLM+klppvsF\nh3vPieCPFFfwUMx1cbXEBhlLMut5EmOB8WnXV+7WHhFcAZybdqcB/ztjOWb9YLNB2w53a6uPAzem\n7RMkjs9ZjFmPK9UAJnC496wInqcY4PSPdOh8iakZSzLrZaWaVwYc7j0tgkcoAn4VMJZigrFN81Zl\n1pNKNa8MONx7XgSzKOagAXgJ8P20YoyZtY6bZSyLs4Efpe23AJ/OWItZLxoc7guzVTGIw70PpAFO\nxwJz06EzJF6fryKznlNpllmS+ruyc7j3iQieoBjg9Cwg4HKJ7fJWZdYzSjU6FRzufSWCu4H3pd3N\nKAY4jc1YklmvcLhbXhFcBpyfdvcG/i1jOWa9olRTD4DDvV99FLglbZ8s8a6cxZj1gFJN9wsO974U\nwXLgCKr/EC+Q2CNjSWZdK61d7GYZK4cIHgKOBgLYkGKA08S8VZl1pY0pVkEDh7uVQQTXAf8r7U4B\nLvEAJ7OmlW7qAXC4G3wJ+K+0fQjV5frMrDGlm3oAHO59L4JVwLuB+enQWRIzMpZk1m1KN/UAONwN\niGAxxQCnZRT/Jn4osU3eqsy6hsPdyiuCO4GT0+5k4CppoJPIzOpzm7uVWwSXABel3VdRTDhmZsOr\ntLmvBJ7IWchgDndb3QeBOyrbEkfnLMasCwzc454m6SsFh7vViGAZcDiwKB36lsSuGUsyK7vSDWAC\nh7sNIYIFwD9TDHAaRzHAafywLzLrX6WbVwYc7lZHBL8Azki7OwPfScOszaxW6eaVAYe7De8M4Bdp\n+zDgIxlrMSsrN8tYd0kDnN4JPJgOfVVi/4wlmTVN0m8lzU6PRyRd27r3Zl1gUtp1s4x1jwgWUnSw\nPgesC1whsVXeqswaFxH7R8TUiJgK3ARc08K33xQGmit95W7dJYLbgVPS7pYUAb9expLMmiZpPDCD\n6mLxrVDKeWXA4W6N+xZwSdrej2LCMbNu8nbguohY2sL3LOXUA+BwtwalwRnvB+5Khz4mcXjGksya\ndTTwgxa/ZymnHgCHuzUhgmcp7pqpDLG+WOKlGUsya4ikzSnWDP5pi9/azTLWGyJ4AAbWXN2YYoDT\nxhlLMmvE4cBPIuK5Fr/v4Cv3hS1+77XicLemRfAT4Ky0uwtwkQc4WTbShUizkH6GVG+pyKNofZMM\nVMP9mQieacP7j5rD3Ubrc8B1afsdVO+mMeu0nYADgDcBFwz1hIg4KCJ+2YZzl3LqAXC42yhFsBI4\nBng4HTpHYt+MJVn/qlwx3wac1OFzl3LqAXC421qI4DGKtszngTEUC3xskbcq60PHAFcCrydiSYfP\nXcqpB8DhbmspgluAD6fdrSmW6BuTsSTrNxFLiDgqQ7CDw9163DeAy9L2QcAXMtZi1kluc7felQY4\nnQTckw59UuKQjCWZtZ3EBjBwG7Cv3K03RfA0xQCnJ9Oh70nsmLEks3Yr7dQD4HC3ForgfuDYtDue\nYoDTuHwVmbWVw936RwTXAmen3d2Bb3qAk/Wo0s4rAw53a49PA7PS9rvo/L3HZp1Q2nllwOFubRDB\nCopRq4+mQ+dK7JOxJLN2cLOM9Z8I/g4cAawA1geulmr+ZzBrG0lflHSfpD9KOrVNp6n8ew5gUZvO\nMWoOd2ubCG4ETku7LwQuT2tOmrWNpOOAbSJi54jYBfhhm05VCffF6dtqqTjcrd3OA65I268DTs9X\nivWJfwHOqOxERLs6O0s7rww43K3N0gCnE4A/pUOflXhLxpKs9+0AvEPSbZJ+JmlKm85T2qkHwOFu\nHRDBUooBTpW1Ky+V2D5jSdbbxgLPRsTewEXAd9p0ntJOPQAOd+uQCP4EHJ92J1J0sG6YsSTrXQ8D\n/zdt/wjYo03ncbOMGUAEVwH/lnanAv+RsRzrXT8CZqTtA4D7Wn2CNDDPzTJmg3wCuCFtHy/x3pzF\nWBcaeVm9LwOHSZoDfJGiz6fVxsPA1NalDHdFRO4arM9IbA38HngBsBx4dQR35K3KuoY0i+KKHOBK\nIo7qfAnsAMxLu8dG8N1O1zASX7lbx0XwV4oFi1dSdH5dLTEpb1XWRXIuq1dR6qkHwOFumURwPfDJ\ntPti4PuS/z1aQ3Iuq1dR6qkHwOFueX2d6l0NbwY+m7EW6xZ5l9WrcLib1ZMGOB0HzE2HTpd4Q8aS\nzBpV6ul+weFumUXwJHAoRTuqKOafeVHeqsxGVGlzfx54Kmch9TjcLbsI7gHel3YnUXSwjs1YktlI\nBu5xT99AS8fhbqUQweVUBzXtBZybsRyzkZR6ABM43K1cPgbcnLZPknhPzmLMhlHqeWXA4W4lEsFz\nFAt8VK6Gvinx8owlmdVT6nllwOFuJRPBwxRL9K0CNgCukRhqiLlZTm6WMWtWBDOp3vO+A/A9D3Cy\nspAYA2yadt0sY9akrwA/Sdv/g2LCMbMyGDxVhq/czZoRwSrg3cAD6dCZEgdnLMmsovTzyoDD3Uos\ngiUUKzgto/i3+gOJbfNWZVb+qQfA4W4lF8FdFAseQ3HFdJXE+hlLMiv91APgcLcukObKviDtTqeY\ncMxWI+nbku6UNEfStZIm5K6pR/nK3ayFPgzcnrZPkTgmZzEl9eGIeEVE7AHMB07NXVCPGtzmvjBb\nFSNwuFtXiGAZcDiwKB26SGK3jCWVTkQ8BSBJwIZ04KpS0iWS5kuanR7tWoy6TCpX7kvTv8tScrhb\n14jgQYqFGgIYRzHAaXzeqspF0sXAo8AewLc6cMoATouIqekxpwPnzK30Uw+Aw926TAT/Dzg97e4E\nXJxWojcgIo4DtgbmAJ/p0Gn77e+/9FMPgMPdutOZwM/T9qEUE441TNIpkuZJWiWp59ZujYhVwA+B\nvTt0yi9JukvSOZL64U6m0k89AA5360JpgNM7gQXp0JclDmjiLW4ADgYebHFpWUmakv4U8DZgdgdO\n+6mI2Inig2QS/TGS2OFu1i4RLKLoYF0OrAtcIbF1Y6+NOyOi+4JduhBpFtLPkCbW/kgCLpE0B7iL\nImjPandJEfG39OdzwMXAPu0+Zwl0RZv7mNwFmI1WBHdInAJcBLyAIuBnRPB85tLaZScY+IZyAXBU\n5QcREcBrWn5G6cJ03meAY1ZflFrSVhHxaPpw+Sfg7pbXUCIS4yg688FX7mbtE8G3gO+k3ddQTDjW\nq55Jf94GnNShc1Y+UN5EdSDZYJembwtzKL4tnNmhunLpigFM4Ct36w2nAFPh9KnAR6RH3wCLB31l\nnr8g4vZjM9XWSsdQBOxJq19Bt9GwHygR0W+TuTnczTolgmclDodV98EZY4Bdap9x5HAv757b+IpA\nP2rE57VWjg+UMuuKeWXAzTLWIyKYD4/eO/RP199g8J6kD0p6CNgGmKOiXdmGErGEiKMc7AO6Yrpf\n8JW79ZQn6szzMeWVEg8AM4HrIC6P4LxOVmY9w80yZiWzfXq8D0BiNgNhz+8iBtqWzYZTCfdVwOKc\nhYzE4W594PH5wDxgP4oJtQCmpsdpwHMSN1EE/XXA7RGsyFGplV4l3BdFsDJrJSNwuFsPmb9g6M7T\n+QsiOFZiLPAq4LXpsTdFv9P6FLf7HQB8AXhSYhbVsL83gmh//dYFumJeGQAVYx/M+o/EROBAiqkI\nXgu8tM5T/0q1CWdmBI90pEArnfShfwBwQwT7ZS5nWA53s0RiG6pB/1pgqzpPvZfqVf2sCJ7oTIWW\nm8Q9wK7AtREcmrue4TjczYaQphF+KdWgPwjYZIinrqIY4FMJ+5siWN6pOq2zJP5GMdXFRRGcmLue\n4TjczRogMYaijb5yZb8vsN4QT30W+B3VsL8rzWJpXU5iHeA5ionqvhTBpzOXNCyHu9koSGxEMZdN\n5cr+FXWeuhD4NSnsi8FW1o0kNqW6zOPHIjgnZz0jcbibtYDEZIqmm0rYv6TOUxdQvar/dUS5h7Bb\nlcSOwP1p990RfD9nPSNxuJu1gcT2VJtwDgY2q/PUu6iG/e8ieLozFVqzJPYFbky7b44YWA2slBzu\nZm2W2mr3oHpVvz/VwVSDPQ81g6lu82Cq8pB4G/CfaXefCG7LWc9IHO5mHZYGU02ndjDVukM89Smo\nGUz1Jw+mykfieODbaXf7CP6cs56RONzNMpOYQDEwphL2L6vz1EepHUz1cGcqNACJ/0l1MZhNIlia\ns56RONzNSiatBTt4MFW9tWHvo3YwlaflbSOJsynmIloObFj2b1EOd7MSS4OpdqZ2MNX4IZ66Crid\n2sFUyzpVZz+QuBg4Fngkgm0zlzMih7tZF0mDqfakGvb7Ukx8trplVAdTzQTuLPsshmUn8RPgrRR/\nl1Nz1zMSh7tZF5MYx5qDqYZaOnAR1cFUM4EHyt6sUDZpWujpFIPRXpe7npE43M16iMTmVAdTHQzs\nUOepD1I7mOofnamwe0nMo/j7/GEER+euZyQOd7MeJvESqp2zM6hdA3SwOVSv6n9b9jtBcpBYAkwA\n/iOCU3PXMxKHu1mfSIOpdqd2MNW4IZ66gupgqpnArRE836k6y0hiPYpJwwD+NYIzctbTCIe7WZ+S\nWJ/qYKqDgVcy9GCqpVQHU80E/tBv7fUSW1KMMwD4QATn56ynEQ53MwNAYjzVwVQHUyxKMZS/UYT8\nTIrOxYc6U2E+ErtTNF0BHBXBlTnraYTD3cyGJLEVtYOptqnz1PupXtX/JoLFnamwcyQOorjbCODg\niIHt0nK4m9mI0mCqnahe1c+g6Fxc3SrgDqphf2MvDKaSOAIGrtb3iODunPU0wuFuZk1Lg6mmUQ37\n11B/MNUNVOfEmd2Ng6kkToaBdvatIwba30vL4W5may0Npno11bCfxtCDqRZTNG9Uwn5eN3TOSnwO\n+HzaHRsxcOdMaTnczazlJDajGExVabOfUuepf6HahDMzgr93psLmSJwHnAo8GTFkc1TpONzNrO0k\nXkwR9JWwrzeY6m6qV/W/jeCpjhQ4AonLgaMppm2o90FVKg53M+uoNJhqN6pNOAcAGw3x1BXAzVTD\n/pZcg6kkfgm8LtUwPUcNzXK4m1lWaTDVK6le1U+n/mCq66mG/T2daq+XmE0xKdtPI3hrJ865thzu\nZlYqaTDV/lTDfrc6T/071Zkur4vgL22s6SFgW+C7ERzbrvO0ksPdzEotDaaaQTXsX1jnqXOpXtX/\nJoJFLTq/gGeADYCvRfDxNZ+jGcDZFLeD3gG8NyKy3vLpcDezrpGCdkdqZ7qcOMRTgyJkK2F/YwTP\njvKcG8NAx+4nIwbWUU0/1zrAAmBGRMyT9HngwYj4zmjO1yoOdzPrWhLrUtxTXwn71wBjh3jqcuBG\nqnPY/77RwVTpTp8/p90TIvh27c81GbgpIqak/f2AT0bEW5r+hVrI4W5mPUNiQ4rBVJWw35OhB1Mt\nAX5DNezn1uucldgLuC3tHhLBj2t/LlGE/2ERcYekc4GDImKPFvxKo+ZwN7OeJTEJOJDq5Gc71nnq\nQ1SbcGZG8LdB7/FG4Odp99UR/Pea59F04KsU3xp+Cbw1IrKus+pwN7O+IfEiagdTbVHnqX8AroND\nd4Mtt4Mt0ofC/Fth2bMwf0HE7ccOfQ69Hjg+It7R6vqb4XA3s76UOmd3oxr0B7LGYKrT02N1R14f\nceWB1ffS5Ih4TNJY4KfAmRExq/VVN25MzpObmeWS2tjvTo9/T0vp7UO1CWc6jWfkxyW9FVgHOD93\nsIOv3M3MhiSxCZxwI3xr9zV/WnvlXkbr5C7AzKyMiknLnmzJQKgcHO5mZj3Ibe5mZnXNXwBH1jle\nbm5zNzPrQW6WMTPrQQ53M7Me5HA3M+tBDnczsx7kcDcz60EOdzOzHuRwNzPrQQ53M7Me5HA3M+tB\nDnczsx7kcDcz60EOdzOzHuRwNzPrQQ53M7Me5HA3M+tBDnczsx7kcDcz60EOdzOzHuRwNzPrQQ53\nM7Me5HA3M+tBDnczsx70/wGEPdlt4BjQaQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_partial_hull(sorted(Points(11)), [0, 1, 9, 10] + [10, 8, 4, 0])" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "That's all there is to the basic idea of the algorithm, but there are a few edge cases to worry about: \n", "\n", "* **Degenerate polygons**: What happens when there are only 1 or 2 (or zero) points? Such a set of points should be considered convex because there is no way to draw a line segment that goes outside the points.\n", "\n", "* **Colinear points:** if three or more points are colinear, we should keep only the two \"outside\" ones. The rationale for not keeping them all is that we want the convex hull to be the minimal possible set of points. We need to keep the outside ones because they mark true corners in the hull. We can achieve this by rejecting a point when it is a \"straight\" turn as well as when it is a \"right\" turn.\n", "\n", "* **First and last points:** An astute reader might have noticed that our algorithm only rejects the middle point, point B, in the A->B->C turn. That means that the first and last point in sorted order will never be a candidate for rejection, and thus will always end up on the hull. Is that correct? Yes it is. The first point is the leftmost point, the one with lowest x value (and if there are ties, it is the lowest-leftmost point). That is an extreme corner, so it should always be on the hull. A similar argument holds for the last point in sorted order.\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Implementation of Convex Hull Algorithm" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def convex_hull(points):\n", " \"Find the convex hull of a set of points.\"\n", " if len(points) <= 3:\n", " return points\n", " # Find the two half-hulls and append them, but don't repeat first and last points\n", " upper = half_hull(sorted(points))\n", " lower = half_hull(reversed(sorted(points)))\n", " return upper + lower[1:-1]\n", "\n", "def half_hull(sorted_points):\n", " \"Return the half-hull from following points in sorted order.\"\n", " # Add each point C in order; remove previous point B if A->B-C is not a left turn.\n", " hull = []\n", " for C in sorted_points:\n", " # if A->B->C is not a left turn ...\n", " while len(hull) >= 2 and turn(hull[-2], hull[-1], C) != 'left':\n", " hull.pop() # ... then remove B from hull.\n", " hull.append(C)\n", " return hull" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can try it out on our 11 random points, but it is not easy to tell at a glance whether the answer is correct:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[Point(x=0.3253748207631174, y=1.7900592822602743),\n", " Point(x=1.3968712854329428, y=0.4086086096198411),\n", " Point(x=2.7310024878562857, y=0.05565070635109892),\n", " Point(x=2.835445111495586, y=1.375183795456248),\n", " Point(x=2.7309330192147097, y=1.4818235191572668),\n", " Point(x=1.8813296288048804, y=1.666404092312656)]" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "convex_hull(Points(11))" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "# Visualization of Results\n", "\n", "To visualize the results of the algorithm, I'll define a function to call convex_hull and plot the results: " ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def plot_convex_hull(points):\n", " \"Find the convex hull of these points, and show a plot.\"\n", " hull = convex_hull(points)\n", " plot_points(points)\n", " plot_points(hull, 'bs-', closed=True)\n", " print(len(hull), 'of', len(points), 'points on hull')" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6 of 11 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(Points(11))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now the octagon and pacman shapes:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8 of 8 points on hull\n" ] }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(octagon)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7 of 8 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(pacman)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "How about 100 random points?" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "15 of 100 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(Points(100))" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "Will 10,000 points be slow? " ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 loops, best of 3: 396 ms per loop\n" ] } ], "source": [ "P10K = Points(10000)\n", "\n", "%timeit convex_hull(P10K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "No problem! Still well under a second! Here's what it looks like:" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "27 of 10000 points on hull\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAEACAYAAABI5zaHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXuQntdZJ/i0r4lJbNkQSAKZL4QQIEEQkkwGHBLnaiD3\nkDhXQkIgxaWy7MLs1k7N1ixTU1u1tTPMMpudHQbBQkMGLYpJy7aEonQStWIbTDlRaBDBuOK47Var\nJXWrW92SutX33/7xvk+f3/md57xf2zJJ3Omv6pTU3/e+5/qc5zyX3/OcAQC289n57Hx2Pjuf7fW5\n4hvdgZ3Pzmfns/PZ+Tzxnx3mvvPZ+ex8dj7b8LPD3Hc+O5+dz85nG352mPvOZ+ez89n5bMPPDnPf\n+ex8dj47n2342WHuO5+dz85n57MNPzvMfeez89n57Hy24WeHue98dj47n53PNvzsMPedz85n57Pz\n2YafHea+89n57Hx2Ptvws8Pcdz47n53PzmcbfnaY+85n57Pz2flsw88Oc9/57Hx2Pjufbfi56hvd\ngX6fgYGXDZo977nlLw8/Anzpw9u9/Z3P1++zs9bfGp9vlXX+pmfuzSJ88pby+3d/i7S/8/n6fXbW\n+on8DAzYwON57fE2t/VHv3Hr/PU8WJ4EzL32ecGPDwzYCfpiQP4tvrve5m+4ytaugg1gznbNw65A\n1/PN5wduiNv/wVcMDNhs8MNWiGyrhPhE1fWEt3eNLV9zhW1cARvAsl27HLz6T96vq2z1Ku/Dql29\ntsXqOh76ocp++KFXDQzYavTLlbZ2pf9/3a7c2OqQrrD1KwbMBmBmG3bFlt+jz9eBCW7Xzwsr3//A\nzS1PWWrLMv1f/679v89zL3yh2Z/887LtJ/5g+aZh7vGJtus7zC79QPzGVdea2fc8ljbOW8ann7G1\nt66sfH/FVWZ242Npfzt9Vuxa/vO6b0Qf1uxq/++AmV1z+TXW+N7AgFX2ynr+dY1Yis9G/uiO7+ub\n4nPl1fYYecpj/zyv8j1ePDDw7qPp78uX5L9pmHtdVfpw5fkLp83s0+0f+Dn7xHuvteXrzMym7RmP\n3mVv++w77c/fdJPNPsvM7Ix919eusrVrvsPOPueCPX36TnvbwdfYyI8/zS7esGFXrP2Fvemzi/Zt\nK2aG99net99ks882M/uUndw4HW6++ZNmNsTf/Jx94mdvtHPfPWCwU/asr95u7/70223/a59uF25c\n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\nzv/boWdsH7J1a86142ZmBhtauNkufeWv2ebrzrXjzzMzW7TTvrdgp+8+22aGu/+fHjIszNpZc0OG\n/3GOnfj5eTvj737PPnb9l+3XHn2XPf0759rx58/aWX+7ZGuOnWvHL+i+8ozuvwuwoXNhQwe32/Mv\n/2Xbun7IcOayDU8P2/IFZvarS7Zm56yddde1dsMT/nLIzuu1Ct+xpy4/wqYNNjS3bMMnhgynD9vy\n87pjmh8ynGFmtmRrfnZ26Klbr7UbrnyvXXfNmfbkJ8KGZoZteeIsm32emdkxe+Tnl4bWHTvT5p4I\nG5q51m544382HDGzq79nT/n8OXbClm346LAtP6r7/KUhw5ru35i3My58l33gNf/JXnGuDdm5v2Xr\nr/qwvePWRTtt6UybWx4yDHf7cmTBTp8/22bMzGzezrhrydYcOttmLli24eOwoeN/Zb/yil+1r3x5\nyPDIIcOLT9g564dtee1ZNpvNCWwIQ4ZH0EdLQ4Y1yzY8bWZLw7bsnz/CzF68bMO7zMyGbdlgQ9Pz\ndsZFX7SXXf1S2zR/g1371mvsQ394xtCPPfEMu+jiIcOZZmYn7Jxb19jS7Fk2a/N2xre/aC/7nd+w\nL71n2YZnT7eFL59uC08ZtmVbtuHpeTvjog8NffZJf2SvP+ov3m0/OnuWzdqyDR9ctNM6y0NP+OqQ\n/QjOtDlbtNO+PWR41LAt/3czW5i3M7acbgtPX2NLj4QNrcyZmdmQwWbtLPtRu/8KM1tjZna/Pf5v\nz7S5F8m6LA/bsv/uzG6zBTv9Wx+1t77l40P2GDOzq+2jV7zZ/uAPTrPF886w+RfAho4OGR7VpfW/\n/bhd/baPDNmjzcwm7dGPHzI8ashgsKHnmdncd+2plz7R7nndp+0Nb77Kbvzz023hMbvsJ+0b9tVH\nmNlz/qZ5/1lmZsv2Yttn85NzduZPLAw9Zes77YNv/M+GaTN7i5kNm9n5NmQXWjPe937bnrl9jS1d\nsGzDtmzDtmRrlpdteNjMHrVsw7Zop/3DoaF//a132Iff9/f2tBOb7Nef+Ug7dsGyDb9gvz3u/5+1\ns06ca8dvnx961dz1dv0n7rMfP/FJu+p3z7Xjj+/Ykzv32V88wszsW2Zmdn2vbXbS11Bzqvxgr6Gh\nl283+8Il6ZPrLR789fKvfhd9/k99XW8/3P0bXIOr367r7Yd/z11veV+uD+9qru8cMRv7EvDNV53M\nG4d73/LDc62xeViSigbX4Bpcg6vPrlPD2M3sB2WWeWjXOvvGoUfZwmNuD7672L5pN9rzvvsm++Tr\nvmk/e8LMhqgN+99Ps7975PvsPe+EDdm77AO/Dxuy99j7rr7erv/k9+0p/rvhJ9rdj3i3vf8tsCF7\nn73nxnvtJ2b8GT9m9537VvvoFR+xt39urz1hht8xbPuuXzZ7ivbvR2zXsavtzfedbwefftQede8J\nO+fgabZ41vl28OmHbe09S7Zm7jE29dSj9qh7b7BrP7Lf/tkJM7PH2QPnXGU3vupGu2rk9+xjrz/f\nDv7METtv7EN2zUf9Hr4eZw+cc6V96lWfsitHzGzoKrvx1WY2dKNd9ad+/+/bW998gU38zBE7b+wm\ne+1/eKX9+cs/ZVf+xwP2uBl+1kfsbW++wCbWHbHzxhbs9BPn28GnHbHzxj5s7/j4AXvczEW2/+w3\n2Kcv+7S9ofgtf/cm++TlF9jEugU7/fin7Mr3fdd+epLvvdAOnP0G+/Rvf9re8Plxu2iWv/ugXXNl\ntw/3/on9zmdfYX/xsr+wV3zxlfbnvwUbsk/bG0bG7aIZfd4V9pl/+xm74v+5zt57w+m28IhFO23+\nRrvquu/ZT035fR+wa994gU08fdmGl4Ztec0RO+/eP7V//7l/Yxte9ll7/f87YRdmzzUzu8DGz369\nffb/8u/fb++66nw7+NRj9si9x+3cg5+xKz7Pv7vAxs9+nf3RK//IXvfnZjZ0uX3u//ycXb6e73mf\nvfuN9IzJz9rrPz9hF85eZ9dfcaGNP+2InXffJ+wtf3jQLpg53ybO9meYmXX//ouDdkHRVzOz823i\n7NfaTa+4yV7r9wyZmf2kff/Rl9vn3vw5u/wPdtmTD51vE2e/xv74t262S7/0b2zDy2BD+Jxdvn7S\nzg+fq9dj7eA577APX3uGzT9y0U6bPc0Wzzpi5+2+0a76zKSdP3OtfeDyC238p7uffTZ67jvthssv\ntPGnHrHzdn/Krvzs5fa5377AJp56zB657wybP/cme+2N99iTDpVvn3iDmT2p/Hz8+xfY+Gdfb599\n5R/Z6z4/bhcdt0Y6XDYz0N/LZoYftT1nXWMfumLYlpf/zP7dn77G/vjVw7Y89AF71yeGbXn5Pfa+\nK99v7/6DXfbkY/y7/2L/+iOPtcnnzNjZ31uw0/e/0z743m/bs4+a2fLP2d+c+2F7x7teZE+4cKkx\nP9N1fTCTLx89FYzdzOykDPanzsGanA1N+8X9Zi87bPaS/fz52fbM9evsxeORA2KdvXi85sz4wTqL\nyUFSBrNEEMk2GGLve1bTVvucB9u/f4x+n+yYGSpYf3bnB9a/tmecqvX+p2pt8/lQ6HuV42/dc/+0\n4672s4YQbPgc876TTxjm7YfC5v5grqGhfzFi9sQfL7+5595TduKdxPXD3r/BNbj67Xo47LkfRB8f\ndsx9cA2uwTW4Blfv62HlUB1cg2twDa7BtbprwNwH1+AaXIOrD68Bcx9cg2twDa4+vAbMfXANrsE1\nuPrwGjD3wTW4Btfg6sNrwNwH1+AaXIOrD68Bcx9cg2twDa4+vAbMfXANrsE1uPrwGjD3wTW4Btfg\n6sNrwNwH1+AaXIOrD68Bcx9cg2twDa4+vAbMfXANrsE1uPrwGjD3wTW4Btfg6sNrwNwH1+AaXIOr\nD68Bcx9cg2twDa4+vAbMfXANrsE1uPrwGjD3wTW4Btfg6sNrwNwH1+AaXIOrD68Bcx9cg2twDa4+\nvAbMfXANrsE1uPrwGjD3wTW4Btfg6sNrwNwH1+AaXIOrD6//CUK+KrMvwpR0AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_convex_hull(P10K)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "How about a non-random set? Here is a set of coordinates of 80 US cities:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9 of 80 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "P = Point\n", "\n", "USA = {\n", " P(-621, 289), P(-614, 297), P(-613, 319), P(-613, 342), P(-612, 263), \n", " P(-612, 332), P(-603, 247), P(-599, 277), P(-592, 238), P(-591, 323), \n", " P(-586, 229), P(-581, 289), P(-581, 305), P(-576, 253), P(-568, 260), \n", " P(-563, 322), P(-560, 234), P(-560, 285), P(-559, 292), P(-558, 246),\n", " P(-557, 259), P(-555, 225), P(-549, 271), P(-543, 321), P(-535, 313), \n", " P(-530, 249), P(-524, 278), P(-524, 288), P(-515, 308), P(-505, 206), \n", " P(-504, 327), P(-492, 207), P(-488, 194), P(-488, 248), P(-487, 264), \n", " P(-484, 305), P(-484, 328), P(-482, 297), P(-480, 289), P(-477, 210), \n", " P(-470, 319), P(-468, 291), P(-462, 247), P(-461, 328), P(-452, 271), \n", " P(-450, 210), P(-450, 226), P(-450, 245), P(-441, 311), P(-440, 301), \n", " P(-438, 233), P(-438, 293), P(-431, 278), P(-425, 266), P(-423, 273),\n", " P(-422, 213), P(-422, 236), P(-420, 251), P(-415, 297), P(-413, 196), \n", " P(-409, 214), P(-409, 290), P(-401, 181), P(-401, 253), P(-400, 230), \n", " P(-400, 282), P(-394, 251), P(-394, 301), P(-387, 263), P(-385, 272), \n", " P(-371, 285), P(-370, 285), P(-369, 299), P(-363, 309), P(-357, 292), \n", " P(-355, 297), P(-352, 306), P(-344, 314), P(-340, 328), P(-608, 270)\n", " }\n", "\n", "plot_convex_hull(USA)" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "A decidedly non-random set of points:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4 of 100 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "grid = {Point(x+0.5, y+0.5) \n", " for x in range(10) for y in range(10)}\n", "\n", "plot_convex_hull(grid)" ] }, { "cell_type": "markdown", "metadata": { "run_control": {} }, "source": [ "A variant with some noise thrown in:" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13 of 100 points on hull\n" ] }, { "data": { "image/png": "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\nAUdeJYlnKFNNAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def noisy(points, d=0.3, seed=42): \n", " \"Add some uniform noise to each of the points.\"\n", " random.seed(seed)\n", " def noise(): return random.uniform(-d, +d)\n", " return {Point(x + noise(), y + noise())\n", " for (x, y) in points}\n", "\n", "plot_convex_hull(noisy(grid))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Circles and donuts:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "28 of 790 points on hull\n" ] }, { "data": { "image/png": "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\nbFBTwNAAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "square = {Point(random.uniform(-1, 1), random.uniform(-1, 1)) for _ in range(1000)}\n", "circle = {p for p in square if p.x ** 2 + p.y ** 2 < 1}\n", "plot_convex_hull(circle)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "28 of 628 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "donut = {p for p in square if 0.2 < (p.x ** 2 + p.y ** 2) < 1}\n", "plot_convex_hull(donut)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "19 of 720 points on hull\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def rad(degrees): return degrees * math.pi / 180.0\n", "\n", "sine = {Point(rad(d), 5 * math.sin(rad(d))) for d in range(720)}\n", "plot_convex_hull(noisy(sine))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "38 of 360 points on hull\n" ] }, { "data": { "image/png": "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\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "donut2 = noisy({Point(5 * math.sin(rad(d)), 5 * math.cos(rad(d))) for d in range(360)})\n", "\n", "plot_convex_hull(donut2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Tests\n", "\n", "So far, everything looks good! But I would gain even more confidence if we could pass a test suite:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'tests pass'" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def tests():\n", " # Tests of turn\n", " assert turn(octagon[0], octagon[1], octagon[2]) == 'left'\n", " assert turn(octagon[2], octagon[3], octagon[4]) == 'left'\n", " assert turn(octagon[1], octagon[0], octagon[7]) == 'right'\n", " assert turn(octagon[5], octagon[6], octagon[7]) == 'left'\n", " assert turn(octagon[2], octagon[1], octagon[0]) == 'right'\n", " assert turn(pacman[1], pacman[2], pacman[3]) == 'left'\n", " assert turn(pacman[3], pacman[4], pacman[5]) == 'right'\n", " assert turn(Point(0, 0), Point(0, 1), Point(0, 2)) == 'straight'\n", " assert turn(Point(2, 1), Point(3, 1), Point(4, 1)) == 'straight'\n", " assert turn(Point(2, 1), Point(4, 1), Point(3, 1)) == 'straight'\n", " assert turn(Point(0, 0), Point(1, 1), Point(2, 2)) == 'straight'\n", " assert turn(Point(0, 0), Point(-1, -1), Point(2, 2)) == 'straight'\n", " # More tests of turn, covering negative denominator\n", " A, B = Point(-2, -2), Point(0, 0)\n", " assert turn(A, B, Point(1, 3)) == 'left'\n", " assert turn(A, B, Point(2, 2)) == 'straight'\n", " assert turn(A, B, Point(3, 1)) == 'right'\n", " assert turn(A, B, Point(-1, 1)) == 'left'\n", " assert turn(A, B, Point(-1, -4)) == 'right'\n", " assert turn(A, B, Point(-1, -1)) == 'straight'\n", " assert turn(B, A, Point(-3, -4)) == 'left'\n", " assert turn(B, A, Point(-4, -3)) == 'right'\n", " assert turn(B, A, Point(-1, -1)) == 'straight'\n", " assert turn(B, A, Point(-3, -3)) == 'straight'\n", " \n", " # Tests of convex_hull\n", " assert convex_hull(octagon)== octagon\n", " assert convex_hull(circle) == convex_hull(donut)\n", " assert convex_hull(circle) == convex_hull(convex_hull(circle))\n", " for n in (0, 1, 2, 3):\n", " assert convex_hull(Points(n)) == Points(n)\n", " collinear = {Point(x, 0) for x in range(100)}\n", " assert convex_hull(collinear) == [min(collinear), max(collinear)]\n", " P = Point(5, 5)\n", " assert convex_hull(collinear | {P}) == [min(collinear), max(collinear), P]\n", " grid1 = {Point(x, y) for x in range(10) for y in range(10)}\n", " assert convex_hull(grid1) == [Point(0, 0), Point(9, 0), Point(9, 9), Point(0, 9)]\n", "\n", " return 'tests pass'\n", " \n", "tests()" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "## How Many Points on the Hull?" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "The number of points on the hull for Points(N) seems to increase slowly as N increases. \n", "How slowly? Let's try to find out. We'll average the number of points on the hull for Points(N) over, say, 60 random trials:" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [], "source": [ "def average_hull_size(N, trials=60):\n", " \"\"\"Compute the average hull size of N random points\n", " (averaged over the given number of random trials).\"\"\"\n", " return sum(len(convex_hull(Points(N, seed=trials+i)))\n", " for i in range(trials)) / trials" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We'll do this for several values of *N*, taken as powers of 2:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " N Hull Size\n", " 1: 1.0\n", " 2: 2.0\n", " 4: 3.7\n", " 8: 5.1\n", " 16: 7.1\n", " 32: 8.6\n", " 64: 11.0\n", " 128: 12.6\n", " 256: 14.6\n", " 512: 16.4\n", "1024: 18.1\n", "2048: 19.8\n", "4096: 21.6\n", "8192: 23.2\n" ] } ], "source": [ "hull_sizes = [average_hull_size(2**e) \n", " for e in range(14)]\n", "\n", "print(' N Hull Size')\n", "for e in range(14): \n", " print('{:4}: {:4.1f}'.format(2**e, hull_sizes[e]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Then we'll plot the results, with *N* on a log2 scale:" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEQCAYAAAC5oaP8AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8VNX5x/HPA6ioaP1hFWmlomnVqrTuomiMVgMVlWp/\nglbUuv1sVVDqTlTiQlt3BAXrgkpdcV9QS1AiioqVfXXHirLUDYkaJMnz++PcwBAnySRkcmf5vl+v\nvDJzZ+6dJ5Cc555z7n2OuTsiIpJ/2sQdgIiIxEMJQEQkTykBiIjkKSUAEZE8pQQgIpKnlABERPJU\n2hKAmXUxs4lmNtfM5pjZwGh7qZktMrPp0VevdMUgIiL1s3TdB2BmWwFbufsMM+sATAV+B/QFVrj7\njWn5YBERSUm7dB3Y3ZcAS6LHFWY2H/hp9LKl63NFRCQ1rTIHYGZdgd2AN6JNA8xsppndZWabtUYM\nIiKytrQngGj451HgHHevAEYB2wK7AouBG9Idg4iI/FDa5gAAzGw94FngeXcfluT1rsAz7t6tznYV\nKBIRaQZ3T3mIPZ1XARlwFzAvsfE3s84JbzsKmJ1sf3fP2q8hQ4bEHoPijz8OxZ99X9kcu3vTz5vT\nNgkM9AD6A7PMbHq0bTBwnJntCjjwIXBGGmMQEZF6pPMqoFdJ3sN4Pl2fKSIiqdOdwGlQVFQUdwjr\nRPHHS/HHJ5tjb460TgI3l5l5JsYlIpLJzAzPhElgERHJbEoAIiJ5SglARCRPKQGIiOQpJQARkTyl\nBCAikqeUAERE8lQ6S0GIiAgwbtwkhg8fz8qV7dhggyoGDiymd+/CuMNSAhARSadx4yZxzjn/4v33\nh67e9v77JQCxJwENAYmIpNHw4ePXavwB3n9/KCNGlMUU0RpKACIiaeIOn3ySfKClsrJtK0fzQ0oA\nIiJpMH8+9OwJCxdWJX29ffvqVo7oh5QARERa0PLl8Je/QGEh9O4N999fTEFByVrvKSgYzIABh8YU\n4RqaBBYRaQE1NXD33XDppXD44TB3Lmy5JUAh7drBiBGXUVnZlvbtqxkwoFfsE8CgctAiIuvs9ddh\n4EBYbz0YMQL22COeOJpaDlo9ABGRZlq8GC6+GCZMgGuugeOPB0u5+Y2f5gBERJpo5Uq49lro1g1+\n8hNYsAD698+uxh/UAxARaZLnnoNzz4UddghDP7/4RdwRNZ8SgIhICt55BwYNgvfeg5tvht/+Nu6I\n1p2GgEREGrBiBVx0Eey3Hxx0EMyenRuNPygBiIgkVVMDY8bAjjvCsmUwZw6cfz6sv37ckbUcDQGJ\nSN6rW62zV69ixo4tpLoaHn8c9tkn7gjTQ/cBiEheS1ats23bEs4+uyc33lhImywaJ2nqfQBZ9KOJ\niLS8ZNU6q6uHsmBBWVY1/s2R4z+eiEjDKioyt1pnuikBiEjeevFFmDo1c6t1ppsSgIjkncrKULHz\npJOgpCRzq3Wmm64CEpG8MmtWqNmz/fYwcyZsvnkhu++emdU6001XAYlIXqipgWHD4G9/g+uuC2f/\n2Va7pzGqBioiUseiRaHBr6yEKVNgu+3ijigzaA5ARHLa2LGhPv/BB8PLL6vxT6QegIjkpOXLYcCA\ncMb/7LOw115xR5R51AMQkZzzyiuw666w8cYwbZoa//qoByAiOeP776G0NKzNe/vtcMQRcUeU2dLW\nAzCzLmY20czmmtkcMxsYbe9oZmVm9o6ZjTezzdIVg4jkjwULYN99w2WeM2ao8U9FOoeAVgGD3H1n\noDtwlpn9ErgYKHP37YEXo+ciIs3iDiNHwv77w+mnwzPPQKdOcUeVHdI2BOTuS4Al0eMKM5sP/BQ4\nEjgwetu9QDlKAiLSDEuWwCmnhHr9kyeHZRolda0yB2BmXYHdgClAJ3dfGr20FFCuFpFG1a3Zv/fe\nxdxxRyGnnQZDhsB668UdYfZJewIwsw7AY8A57r7CEm69c3c3s6S3/JaWlq5+XFRURFFRUXoDFZGM\nlaxm/0svlTB0KFx4Ye6XbKhPeXk55eXlzd4/raUgzGw94FngeXcfFm1bABS5+xIz6wxMdPcd6+yn\nUhAislrPnpcyfvzVSbZfxgsvXBVDRJkpYxaEsXCqfxcwr7bxjzwNnBQ9Pgl4Ml0xiEhu+Pbb/K3Z\nn07pHALqAfQHZpnZ9GjbJcDfgbFmdiqwEOibxhhEJMu99FJ+1+xPJ1UDFZGM9MUXcMEFUFYGJ588\nifvvX3sOoKBgMDffnB9lm1OlaqAiktXc4dFH4Zxz4Pe/hzlzYNNNC9l77/ys2Z9O6gGISMZYtAjO\nOgvefRfuvBP22y/uiLJLxkwCi4ikqqYGRo2C3XYLX9Onq/FvDRoCEpFYLVgAp50G1dVQXg477xx3\nRPlDPQARicX338NVV4UaPsceC6++qsa/takHICKt7o03wln/NtuEev0/+1ncEeUnJQARaTUVFVBS\nEpZpvOkm6Ncv9xZmzyYaAhKRVvH887DLLvDVV+HSzmOPVeMfN/UARCSt/vtfGDQolGu+/XYoLo47\nIqmlHoCIpIU73HdfOOvv1Cmc9avxzyzqAYhIi0is119TU0VFRTHV1YU8+6wWZc9USgAiss6S1evv\n2LGE0aNhr71UriFTaQhIRNbZ8OHj12r8Ab74YiijRpXFFJGkQglARNZJRQXMm6d6/dlICUBEmu3p\np8Pdu9XVqtefjZQARKTJPv4YjjoKzj8fRo+GO+4opqCgZK33FBQMZsCAQ2OKUFKhSWARSVlVFdxy\nC1x9NZx9Njz4ILRvDxAmelWvP7toPQARSclbb8EZZ8Cmm8Jtt8EOO8QdkdSl9QBEpEV9/TUMHAiH\nHx5W6XrpJTX+uUIJQESSql2acaed4JtvYO5cOPFE1e/JJZoDEJEfWLgwjPF/8EEY5z/ggLgjknRQ\nD0BEVlu1Cq67DvbcMyzJOGOGGv9cph6AiADw+uthkrdzZ5gyBQoK4o5I0k0JQCTPffklXHJJuKnr\nxhu1SEs+0RCQSJ5yD+P7O+8cGvx587RIS75RD0AkTySWa66uruKbb0K55scfh+7d445O4qAEIJIH\nkpVr3nzzEu66C7p31926+UpDQCJ5IFm55s8/V7nmfKcEIJLjvvtO5ZolOSUAkRw2eTLsuiusWqVy\nzfJDSgAiOeibb+Dcc+GYY+Dvf4e77lK5ZvkhTQKL5Jjycjj11HAn7+zZsPnmoHLNkozKQYvkiBUr\n4KKLwg1dt90WqndKflE5aJE8VFYG3bpBZSXMmaPGX1KjISCRLLZ8eViWcfx4+Mc/oFevuCOSbJLW\nHoCZjTazpWY2O2FbqZktMrPp0Zd+ZUWa4bnnYJddoG3bMNavxl+aKq1zAGZ2AFABjHH3btG2IcAK\nd7+xgf00ByBSjy++gEGD4JVX4M474eCD445IMkVGzQG4+yvAl0leUrkpkWZ46qkw1v+jH8GsWWr8\nZd3ENQcwwMxOBN4CznP3r2KKQyQrfPYZDBgQFmZ/6CEt0iItI46rgEYB2wK7AouBG2KIQSRrPPJI\nOOv/yU9g5kw1/tJyWr0H4O7Lah+b2Z3AM8neV1pauvpxUVERRUVF6Q5NJFaJ5Zo32KCKE04o5skn\nC5k7Fx5/HPbdN+4IJdOUl5dTXl7e7P3TfiOYmXUFnkmYBO7s7oujx4OAvdz9D3X20SSw5JVk5Zrb\ntCnh6KN78s9/FtK+fYzBSdZo6iRwWnsAZvYgcCDwYzP7GBgCFJnZroADHwJnpDMGkWyQrFxzTc1Q\nVqy4jPbtVa5B0qPRBGBmbYDjgW3d/Uoz+xmwlbu/2di+7n5cks2jmx6mSG5buVLlmqX1pTIJPBLY\nF6gdpqmItolIC6iuho8/VrlmaX2pJIB93P1M4DsAd/8CWC+tUYnkiWXLwh28G21UTNeuKtcsrSuV\nOYDvzWx1P9TMtgBq0heSSH6YPBmOPRZOPBGuuKKQf/1L5ZqldTV6FZCZ9Qf6AnsA9wL/C1zq7mPT\nFpSuApIc5g433QTXXAOjR0Pv3nFHJLmiqVcBpXQZqJn9EvhN9PRFd5/fzPhSC0oJQHLU8uVw8snw\n8cfhBq+uXeOOSHJJi9cCMrPRQHt3vyX6mm9mpesSpEg+mjED9twTOneGV19V4y/xS2USuCdwr5md\nlLCtT5riEclJo0fDoYfCFVfArbfCBhvEHZFIapPAy4Ai4H4z2wc4J60RieSQb7+Fs8+GN96Al1+G\nnXaKOyKRNVIqBufuy4EjgP8CE4EfpTMokVzw7ruhfs/KlfDmm2r8JfOkkgCeAfBgCHANsDCdQYlk\nu8cegx494M9/hvvugw4d4o5I5IfSXgyuOXQVkGSrVavgoovgiSfCVT577hl3RJJPWqwYnJlNdvce\nZlZBKNyWyN190+YGKZKLFi2Cfv2gY0eYOjV8F8lk9Q4BuXuP6HsHd9+kzpcaf5EEZWXhbP+II8Ky\njWr8JRukUg20APjE3SvN7CCgG2GRdy3jKHmvuhquvhpuvz0s1ah1iySbpFIKYiahDERX4DngKWBn\ndz8sbUFpDkCywGefwfHHQ2VlaPw7d447Isl36VgQpsbdq8zsaGCEu48ws+nND1EkOyUu2fjdd1V8\n8EExp55ayNVXQ7tWX1xVZN2lWg30D8CJhHsBQOWgJc8kW7Jxq61KOOAAaNdOFTslO6VyH8ApQHdg\nqLt/aGbbAv9Mb1gimSXZko1LlgxlxIiymCISWXeN9gDcfS4wMOH5h4SbwUTywooVMH++lmyU3JNS\nKQiRfFRTA2PGwI47QlWVlmyU3KMEIJLElCmw335wyy3w6KNwxx3FFBRoyUbJLbp2QSTBp5/CJZfA\nhAnw17/CCSdAmzYAYaJXSzZKLqn3PgAze6aB/dzdj0xPSLoPQFpfZWVYpvH66+H//g8GD4ZNNok7\nKpGmacn7AG5ogXhEMpo7PPkknHce/PrXoWxzQUHcUYm0DlUDlbw1Zw6cey4sWQLDhsEhh8Qdkci6\naclqoLMb2M/d/VdNikwkQ3z+OQwZAmPHwuWXw5/+pDt5JT819Gt/RAOviWSdqiq47Ta48kro2xfm\nz4fNN487KpH41JsA3H1hK8YhklYTJoThnk6d4MUXoVu3uCMSiV8q5aATF4RZn1AHqEJrAkg2eP/9\nMME7ezbccAP06QOW8gipSG5LpRTE6tVMzawNcCShNpBIRkms1tm2bRUdOxYzcWIh550XyjW3bx93\nhCKZpVlXAZnZDHffNQ3x1B5fVwFJkySr1tmhQwm33tqTE0/UzVqSH1p8PQAz+33C0zaExWG+a0Zs\nImmTrFpnRcVQHnjgMiUAkXqkcvHbEayZA6gCFgJ90hWQSHNUVKhap0hTpTIH8MdWiEOk2RYtgpkz\nVa1TpKkauhFsRMJTBxLHldzdByISs3fegeJiOOaYYl55pWStYaBQrbNXjNGJZLaGegBTWdPwXwFc\nzpokoBlaid3UqXD44TB0KJxySiHjxqlap0hTpHQVkJlNd/fdmnxws9FAb2CZu3eLtnUEHga2Icwn\n9HX3r+rsp6uApEETJ0K/fnD77fC738UdjUhmaOpVQOleEOZuoG4f/GKgzN23B16Mnouk7IknQuP/\n8MNq/EXWRVoTgLu/AnxZZ/ORwL3R43sB/QlLykaPhjPPhBdegIMOijsakezW0CRwYgmIDc1sRcLL\nvg6lIDq5+9Lo8VKgUzOPI3nm2mth5Eh4+WXYfvu4oxHJfg0Vg+tQ32stxd3dzDTYLw1yh4sugnHj\n4NVXYeut445IJDfEUQV9qZlt5e5LzKwzsCzZm0pLS1c/LioqoqioqHWik4xSVQVnnAFz58KkSSrf\nLJKovLyc8vLyZu+f9hXBzKwr8EzCVUDXAp+7+zVmdjGwmbtfXGcfXQUkVFbCccfBt9/CY49Bh7T3\nSUWyW1OvAkprAjCzB4EDgR8TxvsvB54CxgI/Q5eBSj2+/jpc4bPlljBmDKy/ftwRiWS+jEoAzaUE\nkN+WLYPf/hb22QdGjIC2KucjkpJMuw9ApEk++ggOOCDc4XvrrWr8RdJJCUAyxrx5ofE/6yy44gqt\n3CWSbnFcBSTyA1OmhOUab7gBjj8+7mhE8oMSgMRu/Hjo3x/uuQcOOyzuaETyh4aAJFZjx8IJJ4T6\nPmr8RVqXegASm1GjQinnsjL41a/ijkYk/ygBSKsZN24Sw4ePp7KyHZ9+WkVFRTGTJxey3XZxRyaS\nn5QApFWMGzeJc87511ordnXtWsL8+bDddlq0RSQOmgOQVjF8+Pi1Gn+AhQuHMmJEWUwRiYgSgKTd\nu+/CtGnJO5uVlbrTSyQuSgCSNosXw5/+BPvuC5ttVpX0Pe3bV7dyVCJSSwlAWtxXX8HgwbDLLrDJ\nJvD22zBsWDEFBSVrva+gYDADBhwaU5QioklgaTGVlXDLLWHlriOOgBkzoEuX8Frv3mGid8SIy6is\nbEv79tUMGNBr9XYRaX2qBirrrKoqlGwuLYU99gjX9u+0U9xRieSfplYDVQ9Ams0dnnoqDPdssQU8\n/HAY7xeR7KAEIM0yaRJcfDFUVMD114f6/areKZJdlACkSWbNgksuCaWbr7oqLNmomv0i2UlXAUlK\nPvwwFG0rLoaePWHBglDBU42/SPZSD0BWq63Vs3JlOzbYoIqBA4vZa69Chg6F++6DAQNg5MhwaaeI\nZD8lAAGS1+r5979LWLUKTj65kPnzwwLtIpI7dBmoANCz56WMH3/1D7YfcMBlTJp0VQwRiUhTaVF4\naZaVK5N3Btu00SC/SK5SAhAAvvpKtXpE8o0SQJ77/nsYNAg+/bSYn/5UtXpE8okmgfPYwoXQrx90\n6gQLFhTy+uuq1SOSTzQJnKeefhpOPx0uvBD+8hfdxSuSC1QLSBq0alW4k/eRR+DJJ1W7RySfKQHk\nkf/8Jwz5dOwI06bB5pvHHZGIxEmTwHli3DjYay846ih45hk1/iKiHkDOW7UKLr0UHngAHnsM9t8/\n7ohEJFMoAeSwRYvg2GND7Z5p00LNfhGRWhoCylHPPw977gm9e4fhHzX+IlKXegA5pqoKLr88LNE4\ndiwU6jJ+EamHEkAO+eSTsEBL+/ZhyEfVO0WkIRoCyhHjx4chn+JieOEFNf4i0jj1ALJcdTWUlsLo\n0eFKn4MOijsiEckWsSUAM1sIfA1UA6vcfe+4YskWdVfs6t+/mNGjC2nbNgz5dOoUd4Qikk1iqwVk\nZh8Ce7j7F0leUy2gOpKt2NW2bQn9+vVkzJhCrc0rIlm3IIxKkKVo+PDxazX+ANXVQ/n88zI1/iLS\nLHEmAAcmmNlbZnZ6jHFkhcrK5KN1lZVq/UWkeeKcBO7h7ovNbAugzMwWuPsrtS+WlpaufmNRURFF\nRUWtH2EGcA83ck2frhW7RGRt5eXllJeXN3v/jFgPwMyGABXufkP0PO/nANzhxRdDHZ9vvoE+fSbx\n0ENrzwEUFAzm5pu1aIuIBFmxHoCZbQS0dfcVZrYxUAxcEUcsmejVV0PDv3gxXHEF9O0LbdoUsu++\nWrFLRFpOLD0AM9sWeCJ62g64393/lvB6XvYA3noLLrsM5s+HIUPghBOgne7UEJEUNbUHkBFDQHXl\nWwKYPTs0+G++CSUlcOqpsP76cUclItkm2y4DzWvvvAN/+AMceigccAC8+y78+c9q/EWkdSgBxGDh\nQjjlFOjRA3bZBd57DwYNgg03jDsyEcknSgCt6NNP4cwzYY89YOutwxn/4MHQoUPckYlIPlICaAXL\nlsF550G3bqGxf/ttuPJK2GyzuCMTkXyma0xaUN1ibaecUsysWYXcdlsY658zBzp3jjtKEZFACaCF\nJCvWNmFCCYccAtOmFbLNNjEGJyKShIaAWkiyYm01NUMxK1PjLyIZSQmghXz5pYq1iUh20RDQOlq1\nCm68UcXaRCT7qAewDqZOhb33hpdegttuK6agoGSt1wsKBjNgwKExRSci0jD1AJrh229D6YYxY+D6\n66F/fzArZKutVKxNRLKHagE10YQJcMYZ0L073HQTbLll3BGJiARZUQ46G33xBZx/fqjRP2oUHHZY\n3BGJiKwbzQE0wh3Gjg01ezbZJNzMpcZfRHKBegANWLQo1O754AN4/PEw7CMikivUA0iipgZGjoTd\ndoO99oJp09T4i0juUQ+gjvnz4fTTw+NJk+CXv4w3HhGRdFEPIPL996FCZ2EhHH+8Gn8RyX3qAQBv\nvAGnnQbbbhuGe7p0iTsiEZH0y6sEULdc82mnFfPqq4U88ggMGwbHHAOW8hW0IiLZLW8SQLJyzS++\nWMJBB8GcOYV07BhjcCIiMcibOYBk5Zqrq4fStm2ZGn8RyUt5kQA++wzef1/lmkVEEuVsAli1Cp56\nCo4+Gn7+c/j2W5VrFhFJlHMJYMYMOPdc2HrrUKmzd2/4z3/gjjtUrllEJFFOTAIvWwb33w/33APL\nl8OJJ8LkyeHMv1ZtWWaVaxYRCbK2HPTKlTBuXGj0J02CPn3gj3+EAw+ENjnXrxERaVxOl4N2Dzdq\n3XMPPPRQqNB50knh7H+TTeKOTkQku2TsuXLPnpcybtwkABYvDuP53bpB376wxRbw5pswcWI461fj\nLyLSdBk7BAROp04ldOnSk/feK+Too0Njv//+ultXRCSZnBoCWrp0KFtueRmLFhWy8cZxRyMiklsy\ndgioVseObdX4i4ikQcYnAN2oJSKSHhmdAHSjlohI+mTsHEDPnpfpRi0RkTSK5SogM+sFDAPaAne6\n+zV1Xm/0RjAREVlbU68CavUhIDNrC9wC9AJ2Ao4zs5xafLG8vDzuENaJ4o+X4o9PNsfeHHHMAewN\nvOfuC919FfAQ0CeGONIm23+JFH+8FH98sjn25ogjAfwU+Djh+aJom4iItKI4EoAG90VEMkCrTwKb\nWXeg1N17Rc8vAWoSJ4JDKQgREWmqpkwCx5EA2gFvA78BPgXeBI5z9/mtGoiISJ5r9fsA3L3KzM4G\n/kW4DPQuNf4iIq0vI6uBiohI+mVcKQgz62VmC8zsXTO7KO54msLMupjZRDOba2ZzzGxg3DE1lZm1\nNbPpZvZM3LE0lZltZmaPmtl8M5sXzTdlDTO7JPrdmW1mD5jZBnHH1BAzG21mS81sdsK2jmZWZmbv\nmNl4M9sszhgbUk/810W/PzPN7HEz+1GcMTYkWfwJr51nZjVm1rGhY2RUAsiBm8RWAYPcfWegO3BW\nlsUPcA4wj+y8Wutm4Dl3/yXwKyBrhhbNrCtwOrC7u3cjDI8eG2dMKbib8Lea6GKgzN23B16Mnmeq\nZPGPB3Z2918D7wCXtHpUqUsWP2bWBTgU+KixA2RUAiDLbxJz9yXuPiN6XEFogH4Sb1SpM7OtgcOA\nO4GsWnYnOlM7wN1HQ5hrcvflMYfVFF8TTiA2ii6U2Aj4JN6QGuburwBf1tl8JHBv9Phe4HetGlQT\nJIvf3cvcvSZ6OgXYutUDS1E9//4ANwIXpnKMTEsAOXOTWHRGtxvhlyhb3ARcANQ09sYMtC3wXzO7\n28ymmdkdZrZR3EGlyt2/AG4A/kO4Ou4rd58Qb1TN0sndl0aPlwKd4gxmHZ0CPBd3EE1hZn2ARe4+\nK5X3Z1oCyMZhhx8wsw7Ao8A5UU8g45nZ4cAyd59Olp39R9oBuwMj3X134Bsye/hhLWZWAJwLdCX0\nGjuY2fGxBrWOooqOWfk3bWYlwPfu/kDcsaQqOuEZDAxJ3NzQPpmWAD4BuiQ870LoBWQNM1sPeAy4\nz92fjDueJtgPONLMPgQeBA42szExx9QUiwhnPv+Onj9KSAjZYk/gNXf/3N2rgMcJ/yfZZqmZbQVg\nZp2BZTHH02Rm9kfCUGi2JeACwgnEzOjveGtgqpltWd8OmZYA3gJ+YWZdzWx9oB/wdMwxpczMDLgL\nmOfuw+KOpyncfbC7d3H3bQmTjy+5+4lxx5Uqd18CfGxm20ebDgHmxhhSUy0AupvZhtHv0SGEyfhs\n8zRwUvT4JCCbToJqS9VfAPRx98q442kKd5/t7p3cfdvo73gR4aKCepNwRiWA6Myn9iaxecDDWXaT\nWA+gP3BQdCnl9OgXKhtlY9d9AHC/mc0kXAX015jjSZm7zwTGEE6Casdvb48vosaZ2YPAa8AOZvax\nmZ0M/B041MzeAQ6OnmekJPGfAowAOgBl0d/vyFiDbEBC/Nsn/PsnavRvWDeCiYjkqYzqAYiISOtR\nAhARyVNKACIieUoJQEQkTykBiIjkKSUAEZE8pQQgIpKnlACkRZhZi9Y8MrP7o3UhZpvZXVGFzNrX\nDjez0pb8vCSfX9QaayKY2RZmNsXMpppZj3U81hlmdkIj7/m1mf22kfd0MrOsKoImzaMEIC2lpe8o\nvM/dd4xq428InJbw2nnAqBb+vBZlZqn+bf0GmOXue7j75HX5THf/h7v/s5G37Uaoc9PQcZYCX5pZ\nNtVSkmZQApAWZcF10Zn7LDPrG21vY2Yjo9WWxpvZODP7fX3HcffnE57+m6gue7TYxfq1JYfN7B4z\nu9nMJpvZ+7XHrHsGb2a3mNlJ0eOFZvbX6Fb/t8xs9yim98zsjITP3dTMno16IqOiGj2YWbGZvRad\ntY81s40Tjvt3M5sK/G+df5euZvaShZWmJlhYPW5X4BqgTxRL+zr7LDSza6J/xylRxdCkx4q2l5rZ\nedHj8iiWKWb2tpntHxUqvBLoF31eXzM7MKFsybTan4VQ0+e4Rv67JcspAUhLOxr4NaEWzyHAdRaq\nQx4NbBOt1nUCsC+p1CoJjVZ/oDYh9ACmJbzFga3cvQdwOPXXnkksTezAR+6+GzAJuAc4irCK2xUJ\n++xNqE21E6HS4tFm9mOgBPiNu+8BTAX+knDcz6Kz+bF1Pn8EcHe00tT9wPBo8aDLgYfcfbckxcec\nsC7Arwgr5Q2r71j1/Ixt3X0fQpnpIdEiS5clfN5YQm/qzOjfYn+gNoY3gcJ6/i0lRygBSEvbH3jA\ng2XAy8BehIZ7LKweYpiY4vFGAi8nDI/8DFhc5z1PRsedT+oLkNRWmZ0NvO7u37j7Z8BKM9s0eu3N\naHW6GkKJ7P2BfQgJ4TUzmw6cGMVU6+F6Pq87UFtb/r7oWBDqtTdUs/3B6PtDhKTZ0LHqejz6Po1Q\nJjjZ500fjngSAAACJElEQVQGbjKzAcD/uHt1tH1xwj6So9o1/haRJnHqb9CatNCMmQ0BNnf30xs5\nzvdJXqti7ROcDevsszL6XlNn/xrW/F0k9lCMNT9bmbv/oZ6wv6lne2JszVU3nsbU/ozV1PO37u7X\nmNmzQG9gspn1dPe3WfPzSg5TD0Ba2iuEMeY2ZrYFYRhhCuFM8/fRHEEnoKihg5jZaUAxULeh/QjY\nKoU4PgJ2MrP1zWwzQmnipB/VwDH2jsbb2wB9CT/bG0CPhPH4jc3sFynE8xprFnk/njD0lIp+Cd9f\na+RYjfUmIKw9vEntEzMrcPe57n4tYa5lh+ilzqSwqLhkN/UApKU4gLs/YWb7AjOjbRe4+zIze4xw\nxcs8wrrP04CGFm0fBSwEXo/mXh9z96sJiWRgss+uE8fHZjYWmAN8yNrzBnX3/cH+0fd/E8bef05Y\nIOcJWL1i1INmtkH03hLg3QZ+FghrFdxtZhcQVsmqrd3e2LKJ/2NhfYNK1kzKNudYtdsnAhdHw1d/\nA/Y3s4MIPZ85rJlr2ZvUk5RkKa0HIK3GzDZ292/MbHNCr2C/hlYrauA4LwHHu3vduYCcYmFZvz2i\nBeNb+7PvB66P1oiWHKUhIGlNz0ZnnpOAK5vT+EeuB/7UcmFlrFjOziysIbuZGv/cpx6AxMrMHge2\nrbP5QncviyMekXyiBCAikqc0BCQikqeUAERE8pQSgIhInlICEBHJU0oAIiJ56v8BWNMGchRXi4QA\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_hull_sizes(hull_sizes):\n", " plt.plot(hull_sizes, 'bo-')\n", " plt.ylabel('Hull size')\n", " plt.xlabel('log_2(number of points)')\n", "\n", "plot_hull_sizes(hull_sizes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That sure looks like a straight line! \n", "\n", "That means we can define estimated_hull_size by computing a slope and intercept of the line. (I won't bother doing linear regression; I'll just draw a straight line from the first to the last point in hull_sizes.)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "button": false, "collapsed": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def estimated_hull_size(N):\n", " \"Estimated hull size for N random points, (inter/extra)polating from hull_sizes.\"\n", " slope = (hull_sizes[-1] - hull_sizes[0]) / (len(hull_sizes) - 1)\n", " return hull_sizes[0] + slope * math.log(N, 2)\n", "\n", "# Plot actual average hull sizes in blue, and estimated hull sizes in red\n", "plot_hull_sizes(hull_sizes)\n", "plt.plot([estimated_hull_size(2**e) \n", " for e in range(len(hull_sizes))], \n", " 'r--');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an estimate of the number of points on the hull of a quadrillion random points:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "86.15634904778565" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "estimated_hull_size(10**15)" ] }, { "cell_type": "markdown", "metadata": { "button": false, "deletable": true, "new_sheet": false, "run_control": { "read_only": false } }, "source": [ "# Concluding Remarks and Further Reading\n", "\n", "The convex hull problem is an interesting exercise in algorithm design.\n", "The algorithm covered here is called [Andrew's Monotone Chain](https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Convex_hull/Monotone_chain).\n", "It is a variant of the [Graham Scan](https://en.wikipedia.org/wiki/Graham_scan).\n", "You can read more from [Tamassia](http://cs.brown.edu/courses/cs016/docs/old_lectures/ConvexHull-Notes.pdf) or [Wikipedia](https://en.wikipedia.org/wiki/Convex_hull)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.0" } }, "nbformat": 4, "nbformat_minor": 0 }