{ "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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\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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\niAWdyUSNAAAAAElFTkSuQmCC\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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\nJwAAAABJRU5ErkJggg==\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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\nZuQlqbH/AxfLr4h5SHPkAAAAAElFTkSuQmCC\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": "iVBORw0KGgoAAAANSUhEUgAAAXkAAADsCAYAAACR39Z5AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGtxJREFUeJzt3Xm4nVV99vHvLQlgShAIFGSSQUGGIqCo0QI1oGJVUEhC\nGISoCGrxLYoD1oli1WJfaXGoCChBJoEI4oi+2KJxiL4ySsAGFCUioMgUQAiEX/9Ya2efk5xhn7OH\n9exn35/r4jrPes4+e/8g4c7KetagiMDMzOrpaaULMDOz7nHIm5nVmEPezKzGHPJmZjXmkDczqzGH\nvJlZjTnkxyBpG0mLJS2VdJGkKaVrMjObCIf82E4FPhUROwAPAG8uXI+Z2YTIi6FGJ+lPwKYR8ZSk\nFwMnR8QBpesyM2uVe/KjkDQDuD8insq3fg9sXrAkM7MJc8ibmdWYQ34UEfFnYANJjf9GWwJ3FizJ\nzGzCHPJj+29gTr4+GriiYC1mZhM2kCEvHbZIItb8Z+7Vq730JOBdkpYCGwFf7HmxZmZtGNB53ytX\ntvKqiLgdeFGXizEz65qB7MmbmQ0Kh/wwU9cuXYGZWScN6HDNsqUwN1/P2Aw23TFdb7udxNQInihW\nmplZB3nFKyBxFnBMbp4ewQkl6zEz6xSHPCCxLvBjYM98a14EFxcsycysIzwmD0TwGDAbuD/f+qLE\nzgVLMmuLpE9LWl66DivPIZ9FcDtwJBDAXwFflZhetiqziZP0fGAD0u9lG3AO+SEi+Dbw0dx8LqlH\nr4IlmU1I3obj34D3lK7FqsEhv6ZTgO/m6zngh7DWV44HvhYR94A7KOYHryOSmAFcC2wNrAReFsGi\nslWZjU3SM4FLgH3zGQjLI8JDjgPOPfkRRPBn0oPYFcBawMUSm5WtymxcewDbA7dJuh2YlvddsgHm\nnvwYJI4DzsjNHwL7RfBkwZKsyySdD7yA9Af8z4HjIqKlvY56QpoO7ArcRMSYs2fckzdwT348ZwLn\n5ut9gE8UrMV64/yIeG5E7AZMo7lIrrwU8IuAHwCLcnss7sGZQ34sEQTwduDGfOvdEgcXLMm6LCKu\nHNL8OemwmKrYFdgZmArsBOwy1osjYv1eFGXV5pAfRwSPAocAD+ZbCyR2LFiS9YCkKcAbgCvHe20P\n3QTcTBpKugVYUrYc6wcek2+RxIE0T4ZaArwogkcKlmRdJOlM4OGIeFfpWoZJQzS7AEvGG5M3A4f8\nhEh8HHh/bl4EHJGHdKzipJlnwlY7rPmdZUsjfnrs8Nfqw8DuEeGhOet7A7rV8KR9CHghsB9wGPAT\n4LNFK7IWbbUDXLLvmvfnDmtJOgZ4JTCrJ2WZdZnH5CcggpXA4cCd+dZpEjMLlmSd93ngr4HFkq6V\n9MHSBZm1wz35CYrgjxKzSfPmpwKXSuwZwR8Ll2YdEBFTS9dg1knuyU9CBIuBxgO5LYCLJNYqWJKZ\n2Ygc8pP3OeDCfD2L5u6VZmaV4eGaSYogJI4Fnkea0vZ+icURfL1waTaiZUvhHc+CGds07z10V7pv\nVl+eQtkmiR2AXwDTSQumXhDBbWWrspFIfJLh+6w/BGwWwV8KlWTWdR6uaVMES4H5ufkM0olS08pV\nZGP4q9Xa6wOvK1GIWa845DsggsuA/5ubuwGf94lSldQI+buB+/L1/DKlmPWGQ75z3k+aVglwFHDs\nGK+1Mhohfz9pxTLA/hJbFKrHakTSfpKukXSdpB9K2q50TeCQ75i8z/yhwF351qcl9ipYkq2pEfKP\nAAvy9dNIG5GZtes/gcMiYg9SJ6ISC+kc8h0Uwd2kdfIrgbWBhRIbl63Khhga8teQdnQEONrDa9YB\nT5Gey5G//qFgLas45Dssgh/RnMGxNXCBF0pVxnr56yN5Y7kFuf1c0p5EZu14C/AdSXcARwL/Wrge\nwCHfLf8BXJqvXwF8uGAt1jS0Jw9wPqn3BXB078uxmnkncEBEbA2cA/x74XoAh3xX5F7im4Ff5Vsf\nlvj7giVZMizkI7gL+F6+N09i3SJVWX+QpiPNHOnYRUkbA8+LiF/kW5dANTYvdMh3SQTLgYMZ0muU\n2LZgSbZmTx6aQzYbAq/taTXWP8Y/X/d+YH1Jz87tV5BO7yrOId9FEdxC6tFDCpGF7i0WNVLIX0Hz\naEcP2dhoxjxfNyJWksbkL5N0HXAEw1dXF+OQ77IILgZOz809gc8ULGdgSUwhzXgCeLhxP4LHgK/k\n5gESm/W6NusL456vGxFXRMRuEbFHRMyKiN/2uMYROeR74z3Aj/P1MRJvKlnMgBq6pcHqZ/Oem7+u\nReqBmQ2XztPdG9gX2Lufztd1yPdABE+QFko1Dhb5T4k9CpY0iMYK+cVAYzfK+Z4zbyOKWE7E4n4K\neHDI90wEd5KC/ilgHdJGZhuWrWqgjBryeTZUoze/K/gPYKsPh3wPRXA1aY8bgG2B8yT/GvTIekOu\nV+/JA5wHNPbdnt/1amzgSfoHSbdKWilpo9W+9+n8vesl7d7O5zhgeu/fgMvz9auBfypYyyAZa7iG\nCJYB38/Nw6VVD2nNuuVHwH7A74belPQqYPuIeA5wHHBGOx/ikO+xPDTwRuDWfOsUiVcULGlQjBny\nWWPIZgZ48Zp1V0TcEBF3wBrPgA4Cvpxf8zPgGZI2neznOOQLiOBB4BDgL6Rf4Aslti5bVe21EvKX\nA42HavO7Wo3Z6LYAlg1p35nvTYpDvpAIfklaPAGp57hQYp2CJdXduCEfwSM09xx6tcQmXa/KrMsc\n8gVFcAFpD2qAvajIhkY11UpPHprbHEwBDu9aNVZ/Y+x1s5rVD9q+E9hqSHvLfG9SHPLlvQv4Wb5+\nm+QDLLpkaMg/POqr0sOw3+Rrb3NgkzP+XjfDXs3wcfmvk06XQ9KLgQci4p7JluKQLyyCx4E5wL35\n1hckditYUl211JNfbc78Hv61sEkac68bAEnvkLSMNN5+g6QzASLi28Dtkm4DvgC8vZ1CFLH63xSs\nBIn9SdveCrgN2CuCB8pWVR8SpwLvBR6PGHuTOIltgNtz87QITuxyeVY3zZ78TqS9boptheCefEVE\ncBXwodx8NrDAy+s7aqQdKEcUwW9Jf80GOEJiareKspqq0F43Dvlq+QTwjXx9EKnnaZ2x6ui/Fl+/\nIH/dFHhlx6ux+qvIXjcO+QqJ4CnSw77Gg7+PS8wqWFKdtNyTz74KPJqv/QDW+pZDvmIiuJ+0UOox\n0q/PV6TJL4SwVSYU8vlkr4W5eaDERmO93qyqHPIVFMH1wNtycxPgUu+l0raJ9uShOctmbWBeZ8sx\n6w2HfEVFsAA4KzdnkjY2s8mbTMhfDdyRr+d3shizXnHIV9v/Aa5pXEscVrKYPtcI+bEWQg2Tn5F8\nOTf3kti541WZdZlDvsLy+aOzgfvyrbOlNRdVWEsm05OH5pAN+AGs9SGHfMXlOdtHkPa3mEY6UWr9\nokX1p0mFfAS30Tyf90iJtTpalVmXOeT7QARXAqfk5o7AF71QasIm25OHZm9+c2D/zpRj1hsO+f5x\nCnBlvp4NvLNgLX1FYgqs2sZ5MiF/CWlKK/gBrPUZh3yfyA8Bj6R5VNgnJfYpWFI/aXWb4RHlQ14a\nRza+TmKDjlRl1gMO+T4SwZ9JvfgVwFrAxRLPLFtVX2gr5LMF+eu6wNy2qjHrIYd8n4ngF8DxubkZ\nKei9gdbYOhHy36d5cINn2VjfcMj3p7Np9iz3Jm1sZqNrO+QjWAmcl5svkdih7arMesAh34fywRZv\nB27It06UmF2wpKrrRE8ehs+ZP6qN9zHrGYd8n4rgL6SNzB7Mt86R2LFgSVXW6tF/Y4rgVzSPajxK\n8v8/Vn3+TdrHIvg1acYNpP3SL5NW7ZtuTZ3qyUOzN78V8LI238us6xzyfS6CbwIfy82dgbO8UGoN\nnQz5i0mzm8APYK0POOTr4SPAVfl6Hs3ZN5Z0LOQjuA+4IjcPkZjezvuZdZtDvgbyzI/Dgd/nW6dJ\nvKRgSVUzdAir3Z48NIdspoEfeFu1OeRrIoI/kQLnCWAK6aCRvy5bVWV0crgG4LvAPfl6fgfez6xr\nHPI1EsHPgBNyc3PS0YFTCpZUFY2QXxHBk+2+WX6P83NzH4nt2n1Ps25xyNfP54EL8vXLgI8WrKUq\n2tmBcjSeM299wSFfM3mh1HHATfnWSRIHFSypCjoe8hH8Erg2Nz1n3irLvzFrKIJHSAulHsq3vizx\n7IIlldaNnjw0t5bYFvjbDr+3WUc45GsqgqU0HwquTzpRalq5ioqa8PmuLbqI9KAb/ADWKsohX2MR\nXA58Mjd3A84Y0IVSXenJR3Av8K3cnCMNm8VjVgkO+fr7AHB1vn4Dabx+0HRruAaaQzbrAQd34f3N\n2uKQr7k83W8ecFe+dbrECwuWVEJjMVQ3Qv47wL352tscWOU45AdABPcAc4AngbWBhRIbl62qp7rW\nk49gBc0pq7Mktu70Z5i1wyE/ICL4MfDu3NwKuFBirYIl9VI3h2ugOWdepCExs8pwyA+WT5N2UQR4\nOWljs0HQ7ZC/HrgxXx89oA+3raIc8gMkL5Q6Brgl3/qQxKsLltR1+W8r6+RmV0I+/3dt9OafA8zs\nxueYTYZDfsBE8DBpFkhjzvj5EtsWLKnbOr052WguAFbmaz+AtcpwyA+gfIzdm3JzA9JCqacXLKmb\nehLy+eH2d3JzXo3/e1qfccgPqAguBf49N/cAPluwnG7qyPmuLWoM2awPA79fkFWEQ36wvQ/4Ub5+\nk8SbSxbTJb0argH4BnB/vp7f5c8ya4lDfoBF8ARwKM0DMD4n8fyCJXVDp0+FGlUEj5P2swF4ucQW\n3fw8s1Y45AdcBH8gBf1K0iyUhRIbla2qo3rZk4fmNgdPA47sweeZjckhb0TwA+Ck3NwGOK9G+6P3\nOuR/QXOKqufMW3F1+R/Z2vcp4LJ8/fekjc3qoKchn+fML8jNnYC9uv2ZZmNxyBuwKpzeCCzNt/5Z\n4pUFS+qUXvfkIZ3/+lS+9px5K8ohb6tE8BDpRKlHSfuwXCjxrLJVta3nIZ+fc3wvNw+TVq24Nes5\nh7wNE8FNwFtycyPg0j4PqRI9eWjOmd8QeG0PP9dsGIe8rSGCC2kujtoLOL1gOe1qhPyKPGW0V64A\nHszXHrKxYhzyNpoTgcX5+jipb4Oq2ztQjiiCv9Dc8fNVEpv28vPNGhzyNqJ8GMYcmqcenSHxvIIl\nTVaRkM8aQzZrAUcU+Hwzh7yNLoLfk44OfApYl7SR2QZlq5qwbh79N56fArfm6/meM28lOORtTBF8\nH/hgbm4PnNtnC6WK9eRX22f+b4Dde12DWT/9z2rlnErafAvgQOC9BWuZqJLDNQDnAZGv+/W5Ri1I\n+qGkayVdJ+lOSZeN/1P9zyFv44rgKeAo4Nf51sck9itY0kQUDfkI7gD+KzePkFi7RB0GEbFPROwZ\nEXuQhtIc8mYNETxAWij1GOn3zUUSW5atqiWle/LQHLLZGHhVwToMkLQ+MAv4WulaesEhby2L4Abg\nrbm5CWmhVNV7plUI+ctoHlgyv2AdlhwEXBUR3T5EphIc8jYhEZwLfCE3X0za2KzKiod8BI8Al+bm\nayQ2KVWLAXAYzX3/a88hb5NxAmlLXYDjJQ4vWcw4GiFfute2IH+dQgoZK0DSDNIq7m+VrqVXHPI2\nYRE8BswG7su3zpLYtWBJI5JYizS/H8oO10A6ZvH2fO1ZNt0gTUeaiTR9jFfNAb4ZESt6VVZpDnmb\nlAh+BxxOmh44jbRQav2yVa2h1OZka8gzlBoPYPeU+JuS9dROCvZFwA+ARWME/VwGaKgGHPLWhgi+\nC5ycmzsA51RsVWdlQj778pBr9+Y7a1dgZ2Aq6bCWXUZ6UUTMiojvjfS9unLIW7v+BfhOvj4YeFfB\nWlZXqZCP4HZSTxPgSIkpJeupmZuAm4EVpOMXl5Qtpzoc8taWPAxxJPDbfOtUiX3KVTRMpUI+awzZ\nbAq1OHmrGiKWA3sD+wJ757bhkLcOiOA+0oPYx0k7Ll4isXnZqoBqhvxC0slb4CGbzopYTsRiB/xw\nDnnriAiuAY7PzU2BiyWmFiwJKhjyESwHvpqbB0lsVLIeqz+HvHVMBGcDX8rNvyVtbFZS5UI+awzZ\nrA0cWrIQqz+HvHXa8cB1+fqdEnMK1lLVkP9vYFm+nl+wDhsADnnrqHzs3WzggXzrSxI7FSpnaMiX\nXvG6Sn5Y3ZhO+UKJ55asx+rNIW8dF8FvgDfk5nqkhVLrjfEj3VLVnjw0h2zAD2Ctixzy1hURfJM0\nhx7S4pSzCyyUGvoHS6VCPoJbgZ/k5lF5CwazjnPIWzedDPy/fH0o8I4ef36jJ/9EBE/0+LNbsSB/\n3Rz65hAW6zMOeeuaCFaS9rdpPGT8lMRLe1hC8W2Gx3EJ6RAW8APYjpP0MUn/I2mJpOPH/4l6cshb\nV0VwL+lB7BOkbXYvkdi0Rx9f6ZCP4EGapxO9XuIZJeupE0nzgS0iYseI2AX4SuGSinHIW9dF8HPg\nH3Nzc+ArPdq3pdIhny3IX9cl7ZBonfE24JRGIyLuLVhLUQ5565UzgPPy9d8BH+vBZ/ZDyF8F/CFf\ne5ZN52wPzJP0/yV9S9KzSxdUikPeeiKCIJ0P+8t8670Sr+/yx1Y+5PNzi8Yffi+VeE7JempkHeDR\niNgLhq3EHjgOeeuZCB4FDgEeyrcWdDnUKh/y2dA580cVq6JelgGXA0TE5cBuZcspxyFvPZXnhzeC\nbH3gMmnYoqVOqsr5rmOK4Bbg57l5lOT/L8c1/lF/XwNmpZfq74D/6VVpVePfTNZzEVxBc/OyXYEz\nurRQqrEYquo9eWj25rcmPbOw0bR21N+pwCGSbiQ9/zmmhxVWikPeSvkgaaMuSIeOvLULn9EvwzWQ\npvg1Dpf2A9ixjXvUX0Q8GBGviYjdIuKlEfHL1V8zKBzyVkQETwKH0ZxZcrrEizr8MX0T8vngla/n\n5myJ0YYhzEf9TYhD3oqJ4B5gDvAkqVe2UGKTTrx33gtm3dysfMhnjSGbaaQH1DYSH/U3IQ55KyqC\nnwAn5uaWwIUd2qxr2pDrfgn57wL35Ov5BeuoPh/11zKHvFXBZ2guO98f+OcOvGeVtxkeUd5E7YLc\n3Fdi25L1WD045K24vFDqLaRxVoAPSLymzbftu5DPPGfeOsohb5UQwcOkcejGnPbzJLZr4y37MuQj\nuJHm8YlHFdiD32rGIW+VEcGvgDfm5gakE6WePsm3q+TRfy1akL9uRzoQ3WzSHPJWKREsBE7Lzd2B\nz02yN9uXPfnsItKMI/ADWGuTQ96q6CTSikZIPfvJrFas7NF/44ngT8A3c3NOF7d9sAHgkLfKybNM\nDgXuzrc+K/GCCb5NP/fkofkAdjp0fbdOqzGHvFVSBHeRgn4lsDZpodSMCbxFv4f8t4E/52tvc2CT\n5pC3yorgh8D7cvNZwPkT2KGxr0M+ghU058zvJ7FVyXqsfznkrepOAxbm6wOAD7X4c30d8lljyEbA\nG0oWYv3LIW+VlhdKvZnmfuAfkTighR9thPyTuVfcj66jeZLW0Z4zb5PhkLfKi+Ah0kKpR0m92gsk\nthnnx/pmB8rR5D/gGr35HYAXFyzH+pRD3vpCBEtoTqXciPQgdt0xfqTvQz67gPTwGVp4ACvpbEnX\n538ukTRtvJ+xenPIW9+I4CLSZmYAzwdOH+PlfXH033giuBu4MjfntbAC+ISI2D0idiedc3p8Vwu0\nynPIW795N/DTfH2sNOqK0H46+m88C/LXZwAHjvXCiHgYQJKApwPR1crSZ50j6TeSrpN0raSBPTS7\nihzy1lfyQ9S5wJ/yrc9L7D7CS+syXAPwDeD+fD1/vBdL+hJwF7Ajzb/5dNuJEbFHROwZETf26DOt\nBQ556zsR/B6YBzxFOv3pqxIbrvay2oR8BI/T3G//FRKbj/36eBPwTNLRePO6XF6Ds6Si/AtjfSmC\n/wI+kJvbAeeutlBqzJCX9A+SbpW0UtJGXSy1Q17/TDgZOPlpcPwiae7V6Z+ZZ4706ogI4GLg4B4V\n+PH8sPdTkqb26DOtBVNKF2DWhlNJ0woPAl5L2tjs4/l74/Xkf0QaBrm6i/V10NQNU8gD6Q+1vNf+\n3GGvkrR9RPw6j8kfCPyqB8WdFBH35HA/i7RK+V968LnWAvfkrW/leeRHA7flWx+V2D9fjxnyEXFD\nRNwB9VlglIP9XEk3ADcAmwGndOCNpyPNRJo+0rcj4p789QngHOCFbX+mdYx78tbXInhQ4hBgMWk2\nyUUSe1KjMflW5SGazh4ykoJ9EbAzcDPS3qsfni1ps4i4O/8h8zrgpo7WYG1xT976Xj4y77jc3Bi4\nFFbNJx+YkO+SXUkBPxXYCdhlhNdcMORvDzPwUE2luCdvtRDBeRIvgX99Kzz2ouZ37j1S+uO+sGxp\nxE+PHelHe1Zkf7qJdMD6TqTZOktWf0FE7Nfroqx1DnmrkxPgwSPgE0PHjvNDyrmj/Yzoi3H5ZUtH\n/ndYtrSrHxuxHGlvUg9+yepDNVZ9DnmrjQgel5YtoYWNvCS9A3gvsClwg6RvR8RIPf1KGOVvIb36\n8OWkZx7WhxzyVjMrHm/lVRHxGXq3GtSsGD94NTOrMYe8mVmNebjGaqbQA0qzilJaP2FmZnXk4Roz\nsxpzyJuZ1ZhD3sysxhzyZmY15pA3M6sxh7yZWY055M3Maswhb2ZWYw55M7Mac8ibmdWYQ97MrMYc\n8mZmNeaQNzOrMYe8mVmNOeTNzGrMIW9mVmMOeTOzGnPIm5nVmEPezKzGHPJmZjXmkDczqzGHvJlZ\njTnkzcxqzCFvZlZjDnkzsxpzyJuZ1ZhD3sysxhzyZmYdIGmWpGsk3SjpHEmVyNdKFGFm1s8kCVgA\nzI2I3YDfAfNL1tTgkDcza98M4PGI+HVuXwUcUrCeVRzyZmZtioh7gSmS9sy3ZgNbFixpFYe8mVln\nzAP+Q9Ji4CFgZeF6AJhSugAzszqIiJ8B+wBIejmwQ9mKEvfkzcxaIU1Hmok0feRva5P8dR3gfcAZ\nvSxvNA55M7PxpGBfBPwAWDRK0L9H0s3A9cAVEXF1DysclSKidA1mZtUmzSQF/FRgBbAvEYvLFtUa\n9+TNzMZ3E3AzKeBvAZaULad17smbmbUiDdHsAiwhYnnpclrlkDczqzEP15iZ1ZhD3sysxhzyZmY1\n5pA3M6sxh7yZWY055M3Maswhb2ZWYw55M7Mac8ibmdWYQ97MrMYc8mZmNeaQNzOrMYe8mVmNOeTN\nzGrMIW9mVmMOeTOzGnPIm5nVmEPezKzGHPJmZjXmkDczqzGHvJlZjTnkzcxqzCFvZlZj/wtsmrBu\nuo+17wAAAABJRU5ErkJggg==\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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\nXu3xhMF/x4mDviKbudc9Rxh5zZqCn0ezLeO1RMxdtegjYtPMvKv8kNkfuGZMM2hULHn1vEx+HcHh\nwNeBDYGzItgrkwfH8n3K5iXTGFpxb8zoP4y8B1gM3AVLZpbfs9N2oin4icAOwEyaH6iP9c2I2JDm\n/x6uAo7oaEINyJJXK2TyjQieBR89Ah54Jtx3a8QdN614xVo/oEzYf3IET2bg0l4+jTLau2z/DtwJ\n3DXI44+ZLF3+TRG/P586JX8NcC1NwV9Hc1nmSjLz+Z0OpaGz5NUmR8N9r4ETpgJPLI/iiE0jeB+r\nzXk/6Ulw8h2jfN+HefSMe7XHqseXZI7kBqVFN676IeuK4+Mo836aq3RmAgvXNCev7uYllGqViNde\nDKfPXv0rHyyP5b4AfJymgzemuXfopFW/6c8MfsZ9F3DPUC/dlDrNM3m1zINLB3nBEuAueHt5DDhd\n4rXe6nmWvPrELQuAfTJZUjuJ1Eneiqw+sfQBC179yDN5tUylDyilLuUHr5LUYk7XSFKLWfKS1GKW\nvCS1mCUvSS1myUtSi1nyktRilrwktZglL0ktZslLUotZ8pLUYpa8JLWYJS9JLWbJS1KLWfKS1GKW\nvCS1mCUvSS1myUtSi1nyktRilrwktZglL0ktZslLUotZ8pLUYpa8JLWYJS9JLWbJS1KLWfKS1GKW\nvCS1mCUvSWMgIp4XEZdHxK8j4pSI6Ip+7YoQktTLIiKAU4GDMnNn4HfAITUzLWfJS9LozQCWZuYt\nZfxz4BUV8zzKkpekUcrMPwETImJWOXQAsEXFSI+y5CVpbBwMfDYi5gN/BZZVzgPAhNoBJKkNMnMB\nsBdAROwLbFs3UcMzeUkaioipRMwhYuqavxwblV8nAe8FTuxkvLWx5CVpME2xzwMuAOatpeiPjYhr\ngauA72fm+R1MuFaRmbUzSFJ3i5hDU/ATgQeBvcmcXzfU0HgmL0mDuwa4lqbgrwMW1o0zdJ7JS9JQ\nNFM0M4GFZN5fO85QWfKS1GJO10hSi1nyktRilrwktZglL0ktZslLUotZ8pLUYpa8JLWYJS9JLWbJ\nS1KLWfKS1GKWvCS1mCUvSS1myUtSi1nyktRilrwktZglL0ktZslLUotZ8pLUYpa8JLWYJS9JLWbJ\nS1KLWfKS1GKWvCS12P8DNZrqgpzBy5EAAAAASUVORK5CYII=\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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\nrkJggg==\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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\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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\nOeTNzCrs/wEQ9RRP5yV8CAAAAABJRU5ErkJggg==\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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\nAAAASUVORK5CYII=\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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\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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\nQmCC\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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\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": "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\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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\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": "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\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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\nCnkRkQr7f1PEM2SRRT6YAAAAAElFTkSuQmCC\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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\nTkSuQmCC\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": [ "10 loops, best of 3: 48.3 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": "iVBORw0KGgoAAAANSUhEUgAAAXkAAAEACAYAAABWLgY0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsvXu4ndddHvg7sh1f5TjX5tAwbajKlF4QzLQg0TYGiekU\nJJpAJKa0DjDY7lDL7hDZ0LHpNKEzSVqSAAEmQAiXQAIPlEIYWmD6lD5poaV0OlOPqkrOkXSkWLYT\n3+PEOufsvY/2O39836v1rnf91paTGOIezn6e75HO3t+3vnX5rd/l/V3WEoDY/mx/tj/bn+3P1vzs\n+Fx3YPuz/dn+bH+2P79/n20mv/3Z/mx/tj9b+LPN5Lc/25/tz/ZnC3+2mfz2Z/uz/dn+bOHPNpPf\n/mx/tj/bny382Wby25/tz/Zn+7OFP9tMfvuz/dn+bH+28GebyW9/tj/bn+3PFv5sM/ntz/Zn+7P9\n2cKfbSa//dn+bH+2P1v4s83ktz/bn+3P9mcLf7aZ/PZn+7P92f5s4c82k9/+bH+2P9ufLfy58nPd\ngefyWVra+96Iz//C9pfzK8Dv/q2t/v7tzx/cZ3ut//B8/rCs9X8RTH5YiF+8uf3+Gz+z5paWdkbE\nn42I4wF86g/8/Vvp82nP5Qv9/Z/BWn82ffhcz9/v82dpKZYud88T8bIbboxP/tlPxo3HXx5PPstH\nP5PXfXq3f2729R+0cPkvhMn3Pl+4Z2kpHoyyuEtLMV+6KmZXzeKqTcQOLMV8x1Uxu3IWV10c/156\naTz+sitj88pZXLX59NL8acQOaBtx6T/zHVfExSsi/uvr8/f/qb+4tBRP1d8hroiLV16MKy5ehuae\nK0HKfYgr4uIVQ9sh/19aqn/rNn3Zd47zddUsrpoN84LYEfMd89gxt8eXIhDXxNo1/H1jCRvtPZ/u\nGIdxsk159xJ/WwosIZYQEfGi2HgR/54uYVruu9z7tB195Is6e+KLbl5awqwdEuLKmF56ZnMJC+Zf\nz25YimHNZldwVPMlzPl9093uOD7dD+I5ztEf2Ofl8eTn6M1/uvP9F+5dWorViNgYr8lz+P9GRExe\nHJ/AF8exl56IP332yXj5M/l9X/ilEe//8+17f3+EywuKyecS7uprIzb+XP7ElVdHxOfrN4gdMY2r\nF/79ZLz8UgMR8YpefxA7YjN2RMQVnTt2XBkRL7FRxMXft2mt267f8/y8V+brKrY7745/KTbiWv6x\n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\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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\ngg==\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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\npNcdqg1h46UAAAAASUVORK5CYII=\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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\nhBT8P7A959r75ABgAAAAAElFTkSuQmCC\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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\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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\nBv8fLdTLMnE7hQAAAAAASUVORK5CYII=\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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\nYSAIguX/A4KDcggsT5ndAAAAAElFTkSuQmCC\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": "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\nAElFTkSuQmCC\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)." ] } ], "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.1" } }, "nbformat": 4, "nbformat_minor": 0 }