polylabel 1.0.2

A Rust implementation of the Polylabel algorithm
Documentation
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from shapely.geometry import LineString, Polygon, Point, box, shape\n",
    "from shapely.geometry.polygon import orient"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "polygon = Polygon([(0.0, 0.0), (4.0, 0.0), (4.0, 1.0), (1.0, 1.0), (1.0, 4.0), (0.0, 4.0),\n",
    "                          (0.0, 0.0)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.16 -0.16 4.32 4.32\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,4.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0864\" opacity=\"0.6\" d=\"M 0.0,0.0 L 4.0,0.0 L 4.0,1.0 L 1.0,1.0 L 1.0,4.0 L 0.0,4.0 L 0.0,0.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x104db7c90>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "polygon"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(0.0, 0.0, 4.0, 4.0)"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "polygon.bounds"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.16 -0.16 4.32 4.32\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,4.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0864\" opacity=\"0.6\" d=\"M 0.0,0.0 L 0.0,4.0 L 1.0,4.0 L 4.0,1.0 L 4.0,0.0 L 0.0,0.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x104fe1d90>"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "polygon.convex_hull"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[(0.0, 0.0), (4.0, 0.0), (4.0, 1.0), (1.0, 4.0), (0.0, 4.0), (0.0, 0.0)]"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "list(orient(polygon.convex_hull).exterior.coords)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "[\n",
    "    Point(Coordinate { x: 0, y: 0 }),\n",
    "    Point(Coordinate { x: 4, y: 0 }),\n",
    "    Point(Coordinate { x: 4, y: 1 }),\n",
    "    Point(Coordinate { x: 1, y: 4 }),\n",
    "    Point(Coordinate { x: 0, y: 4 }),\n",
    "    Point(Coordinate { x: 0, y: 0 })\n",
    "]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# From Rust \n",
    "Polygon([(0., 0.), (0., 0.), (4., 0.), (4., 1.), (1., 4.), (0., 4.), (0., 0.)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-0.16 -0.16 4.32 4.32\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,4.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.0864\" opacity=\"0.6\" d=\"M 0.0,0.0 L 0.0,4.0 L 1.0,4.0 L 4.0,1.0 L 4.0,0.0 L 0.0,0.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x104f1f490>"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# From Rust Quickhull\n",
    "Polygon([(0., 0.), (0., 4.), (1., 4.), (4., 1.), (4., 0.), (0., 0.)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-273.968409519 -323.968409519 497.924569065 647.897482755\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,-0.0393362833963)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"4.3193165517\" opacity=\"0.6\" d=\"M -75.5727402877,110.019601411 L -47.0142500145,224.253562504 L -44.19860524,233.565201784 L -40.4915168482,242.559198518 L -35.9280666778,251.150438483 L -30.551440703,259.257618925 L -24.4125203449,266.804017962 L -17.5694009582,273.718220639 L -10.0868420484,279.934794756 L -2.03565442373,285.394910087 L 6.50796991896,290.046895113 L 15.4631788337,293.846726015 L 24.7452251651,296.758443291 L 34.2662687489,298.754492054 L 43.9362076827,299.815982802 L 53.6635310009,299.932870171 L 63.3561846833,299.104048004 L 72.9224428043,297.337359816 L 82.2717755762,294.649524569 L 91.3157060729,291.065978454 L 99.968647527,286.620634172 L 108.148713276,281.355560009 L 115.778491691,275.320581722 L 122.78577876,268.572811014 L 129.104261385,261.176105064 L 134.674144933,253.200462215 L 139.4427191,244.72135955 L 189.4427191,144.72135955 L 193.403164872,135.71902563 L 196.46014848,126.371191766 L 198.584100595,116.768276889 L 199.754476834,107.003167254 L 199.959956481,97.1703179803 L 199.19855199,87.3648394134 L 197.47762821,77.6815771497 L 194.813831145,68.2141946222 L 191.232926945,59.0542671207 L 186.769552674,50.2903960105 L 181.466881277,42.0073517161 L 175.376203983,34.2852537616 L 168.556434174,27.1987957973 L 161.073537538,20.816523109 L 152.999894,15.2001695995 L 98.3365328625,-18.9644311116 L 97.0142500145,-24.2535625036 L 94.1698350446,-33.6458343286 L 90.4185130847,-42.7140783764 L 85.7964114161,-51.3709624995 L 80.3480434044,-59.5331161715 L 74.125879812,-67.1219333906 L 67.1898434757,-74.0643296986 L 59.606732217,-80.293446024 L 51.4495755428,-85.7492925713 L 42.7969313308,-90.3793265557 L 33.7321292749,-94.1389582191 L 24.3424683743,-96.9919802532 L 14.7183761963,-98.9109164963 L 4.95253800962,-99.8772865434 L -4.86099582541,-99.8817837225 L -14.6277156134,-98.9243647234 L -17.9537568093,-98.264358359 L -53.648209037,-226.764386379 L -56.7355378616,-236.079635559 L -60.7210544402,-245.047418125 L -65.5663760693,-253.581369429 L -71.224839653,-261.599302856 L -77.6419510937,-269.024001322 L -84.7559101003,-275.783960923 L -92.4982053587,-281.814079553 L -100.794274333,-287.056283872 L -109.564221344,-291.460088588 L -118.723587009,-294.983082654 L -128.184161627,-297.59133771 L -137.854834695,-299.259734836 L -147.642472344,-299.972206454 L -157.452814273,-299.721891074 L -167.191381527,-298.511199369 L -176.764386379,-296.351790963 L -186.079635559,-293.264462138 L -195.047418125,-289.27894556 L -203.581369429,-284.433623931 L -211.599302856,-278.775160347 L -219.024001322,-272.358048906 L -225.783960923,-265.2440899 L -231.814079553,-257.501794641 L -237.056283872,-249.205725667 L -241.460088588,-240.435778656 L -244.983082654,-231.276412991 L -247.59133771,-221.815838373 L -249.259734836,-212.145165305 L -249.972206454,-202.357527656 L -249.721891074,-192.547185727 L -248.511199369,-182.808618473 L -246.351790963,-173.235613621 L -196.351790963,6.76438637861 L -193.325766603,15.9207640237 L -189.431849243,24.7430926622 L -184.706250787,33.1493281005 L -179.192917447,41.0612956486 L -172.943121057,48.4054171137 L -166.014982271,55.1133950487 L -158.472930061,61.1228478916 L -150.387102552,66.3778900898 L -75.5727402877,110.019601411 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x10507a210>"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Polygon([\n",
    "    (-75.57274028771249, 110.01960141091608),\n",
    "    (-47.01425001453319, 224.2535625036333),\n",
    "    (-44.1986052400443, 233.56520178444188),\n",
    "    (-40.491516848197264, 242.55919851821028),\n",
    "    (-35.928066677809895, 251.1504384831045),\n",
    "    (-30.55144070299677, 259.2576189250935),\n",
    "    (-24.412520344941953, 266.8040179623472),\n",
    "    (-17.56940095820731, 273.7182206387879),\n",
    "    (-10.086842048356445, 279.93479475582495),\n",
    "    (-2.0356544237308825, 285.394910086574),\n",
    "    (6.507969918963688, 290.0468951126591),\n",
    "    (15.463178833668529, 293.8467260149487),\n",
    "    (24.745225165064543, 296.758443290685),\n",
    "    (34.26626874888323, 298.7544920543751),\n",
    "    (43.93620768274765, 299.8159828020204),\n",
    "    (53.66353100085455, 299.9328701709592),\n",
    "    (63.35618468325523, 299.10404800363494),\n",
    "    (72.92244280430123, 297.33735981566144),\n",
    "    (82.27177557618647, 294.64952456911897),\n",
    "    (91.31570607290114, 291.0659784535237),\n",
    "    (99.96864752703414, 286.6206341717666),\n",
    "    (108.14871327570971, 281.355560009008),\n",
    "    (115.77849169077639, 275.3205817216414),\n",
    "    (122.78577875973701, 268.57281101383126),\n",
    "    (129.10426138467784, 261.17610506386103),\n",
    "    (134.67414493283295, 253.20046221503722),\n",
    "    (139.44271909999156, 244.72135954999587),\n",
    "    (189.4427190999916, 144.72135954999578),\n",
    "    (193.40316487178438, 135.7190256296874),\n",
    "    (196.46014848027284, 126.37119176608674),\n",
    "    (198.5841005952538, 116.76827688896145),\n",
    "    (199.75447683394128, 107.00316725394137),\n",
    "    (199.959956480919, 97.1703179802708),\n",
    "    (199.19855199019082, 87.36483941339068),\n",
    "    (197.47762821014587, 77.68157714970485),\n",
    "    (194.8138311454814, 68.21419462218802),\n",
    "    (191.23292694514913, 59.05426712072333),\n",
    "    (186.76955267374814, 50.29039601045239),\n",
    "    (181.46688127708177, 42.007351716050565),\n",
    "    (175.37620398257155, 34.28525376159651),\n",
    "    (168.5564341738489, 27.198795797276006),\n",
    "    (161.07353753840516, 20.81652310901589),\n",
    "    (152.99989400031805, 15.200169599491232),\n",
    "    (98.33653286253586, -18.964431111622638),\n",
    "    (97.01425001453319, -24.253562503633297),\n",
    "    (94.16983504461093, -33.64583432864707),\n",
    "    (90.41851308474087, -42.71407837639184),\n",
    "    (85.79641141607766, -51.37096249948156),\n",
    "    (80.34804340438832, -59.53311617147662),\n",
    "    (74.12587981200636, -67.12193339062866),\n",
    "    (67.189843475707, -74.06432969864774),\n",
    "    (59.606732217031976, -80.2934460239878),\n",
    "    (51.44957554275259, -85.74929257125446),\n",
    "    (42.79693133079759, -90.37932655572841),\n",
    "    (33.73212927494458, -94.13895821910516),\n",
    "    (24.342468374316272, -96.99198025324264),\n",
    "    (14.718376196296493, -98.91091649633165),\n",
    "    (4.952538009623515, -99.87728654335396),\n",
    "    (-4.860995825414805, -99.88178372248515),\n",
    "    (-14.627715613363762, -98.92436472343178),\n",
    "    (-17.953756809330994, -98.26435835897965),\n",
    "    (-53.64820903700594, -226.76438637860946),\n",
    "    (-56.7355378616229, -236.07963555856995),\n",
    "    (-60.72105444017349, -245.0474181249662),\n",
    "    (-65.5663760693013, -253.58136942939535),\n",
    "    (-71.22483965299563, -261.59930285566344),\n",
    "    (-77.64195109371464, -269.02400132182726),\n",
    "    (-84.75591010033425, -275.7839609229046),\n",
    "    (-92.49820535873518, -281.81407955256725),\n",
    "    (-100.79427433320987, -287.05628387201347),\n",
    "    (-109.56422134444159, -291.46008858796654),\n",
    "    (-118.72358700857137, -294.98308265364733),\n",
    "    (-128.18416162723517, -297.59133771033885),\n",
    "    (-137.85483469517902, -299.2597348360279),\n",
    "    (-147.64247234423098, -299.9722064543555),\n",
    "    (-157.4528142733637, -299.72189107416057),\n",
    "    (-167.19138152692128, -298.5111993693906),\n",
    "    (-176.76438637860946, -296.3517909629941),\n",
    "    (-186.0796355585698, -293.26446213837716),\n",
    "    (-195.04741812496607, -289.2789455598266),\n",
    "    (-203.58136942939524, -284.4336239306988),\n",
    "    (-211.59930285566332, -278.7751603470045),\n",
    "    (-219.02400132182714, -272.3580489062855),\n",
    "    (-225.78396092290453, -265.2440898996658),\n",
    "    (-231.8140795525672, -257.50179464126495),\n",
    "    (-237.0562838720134, -249.20572566679022),\n",
    "    (-241.46008858796648, -240.4357786555585),\n",
    "    (-244.98308265364727, -231.27641299142869),\n",
    "    (-247.59133771033882, -221.8158383727649),\n",
    "    (-249.25973483602792, -212.145165304821),\n",
    "    (-249.97220645435553, -202.35752765576902),\n",
    "    (-249.72189107416057, -192.54718572663626),\n",
    "    (-248.51119936939062, -182.8086184730787),\n",
    "    (-246.35179096299407, -173.23561362139054),\n",
    "    (-196.35179096299407, 6.7643863786094585),\n",
    "    (-193.32576660256726, 15.920764023655508),\n",
    "    (-189.43184924301974, 24.74309266215056),\n",
    "    (-184.7062507874361, 33.14932810051302),\n",
    "    (-179.19291744665992, 41.0612956486063),\n",
    "    (-172.94312105678188, 48.40541711367358),\n",
    "    (-166.01498227118805, 55.11339504865113),\n",
    "    (-158.47293006129595, 61.12284789161923),\n",
    "    (-150.3871025524086, 66.37789008984335),\n",
    "    (-75.57274028771249, 110.01960141091608)\n",
    "])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-273.968409519 -323.968409519 497.924569065 647.897482755\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,-0.0393362833963)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"4.3193165517\" opacity=\"0.6\" d=\"M 199.19855199,87.3648394134 L 197.47762821,77.6815771497 L 194.813831145,68.2141946222 L 191.232926945,59.0542671207 L 186.769552674,50.2903960105 L 181.466881277,42.0073517161 L 175.376203983,34.2852537616 L -71.224839653,-261.599302856 L -77.6419510937,-269.024001322 L -84.7559101003,-275.783960923 L -92.4982053587,-281.814079553 L -100.794274333,-287.056283872 L -109.564221344,-291.460088588 L -118.723587009,-294.983082654 L -128.184161627,-297.59133771 L -137.854834695,-299.259734836 L -147.642472344,-299.972206454 L -157.452814273,-299.721891074 L -167.191381527,-298.511199369 L -176.764386379,-296.351790963 L -186.079635559,-293.264462138 L -195.047418125,-289.27894556 L -203.581369429,-284.433623931 L -211.599302856,-278.775160347 L -219.024001322,-272.358048906 L -225.783960923,-265.2440899 L -231.814079553,-257.501794641 L -237.056283872,-249.205725667 L -241.460088588,-240.435778656 L -244.983082654,-231.276412991 L -247.59133771,-221.815838373 L -249.259734836,-212.145165305 L -249.972206454,-202.357527656 L -249.721891074,-192.547185727 L -248.511199369,-182.808618473 L -246.351790963,-173.235613621 L -196.351790963,6.76438637861 L -193.325766603,15.9207640237 L -189.431849243,24.7430926622 L -184.706250787,33.1493281005 L -30.551440703,259.257618925 L -24.4125203449,266.804017962 L -17.5694009582,273.718220639 L -10.0868420484,279.934794756 L -2.03565442373,285.394910087 L 6.50796991896,290.046895113 L 15.4631788337,293.846726015 L 24.7452251651,296.758443291 L 34.2662687489,298.754492054 L 43.9362076827,299.815982802 L 53.6635310009,299.932870171 L 63.3561846833,299.104048004 L 72.9224428043,297.337359816 L 82.2717755762,294.649524569 L 91.3157060729,291.065978454 L 99.968647527,286.620634172 L 108.148713276,281.355560009 L 115.778491691,275.320581722 L 122.78577876,268.572811014 L 129.104261385,261.176105064 L 134.674144933,253.200462215 L 139.4427191,244.72135955 L 189.4427191,144.72135955 L 193.403164872,135.71902563 L 196.46014848,126.371191766 L 198.584100595,116.768276889 L 199.754476834,107.003167254 L 199.959956481,97.1703179803 L 199.19855199,87.3648394134 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x104f9b8d0>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# from rust quick_hull\n",
    "p = Polygon([\n",
    "    (199.19855199019082, 87.36483941339068),\n",
    "    (197.47762821014587, 77.68157714970485),\n",
    "    (194.8138311454814, 68.21419462218802),\n",
    "    (191.23292694514913, 59.05426712072333),\n",
    "    (186.76955267374814, 50.29039601045239),\n",
    "    (181.46688127708177, 42.007351716050565),\n",
    "    (175.37620398257155, 34.28525376159651),\n",
    "    (-71.22483965299563, -261.59930285566344),\n",
    "    (-77.64195109371464, -269.02400132182726),\n",
    "    (-84.75591010033425, -275.7839609229046),\n",
    "    (-92.49820535873518, -281.81407955256725),\n",
    "    (-100.79427433320987, -287.05628387201347),\n",
    "    (-109.56422134444159, -291.46008858796654),\n",
    "    (-118.72358700857137, -294.98308265364733),\n",
    "    (-128.18416162723517, -297.59133771033885),\n",
    "    (-137.85483469517902, -299.2597348360279),\n",
    "    (-147.64247234423098, -299.9722064543555),\n",
    "    (-157.4528142733637, -299.72189107416057),\n",
    "    (-167.19138152692128, -298.5111993693906),\n",
    "    (-176.76438637860946, -296.3517909629941),\n",
    "    (-186.0796355585698, -293.26446213837716),\n",
    "    (-195.04741812496607, -289.2789455598266),\n",
    "    (-203.58136942939524, -284.4336239306988),\n",
    "    (-211.59930285566332, -278.7751603470045),\n",
    "    (-219.02400132182714, -272.3580489062855),\n",
    "    (-225.78396092290453, -265.2440898996658),\n",
    "    (-231.8140795525672, -257.50179464126495),\n",
    "    (-237.0562838720134, -249.20572566679022),\n",
    "    (-241.46008858796648, -240.4357786555585),\n",
    "    (-244.98308265364727, -231.27641299142869),\n",
    "    (-247.59133771033882, -221.8158383727649),\n",
    "    (-249.25973483602792, -212.145165304821),\n",
    "    (-249.97220645435553, -202.35752765576902),\n",
    "    (-249.72189107416057, -192.54718572663626),\n",
    "    (-248.51119936939062, -182.8086184730787),\n",
    "    (-246.35179096299407, -173.23561362139054),\n",
    "    (-196.35179096299407, 6.7643863786094585),\n",
    "    (-193.32576660256726, 15.920764023655508),\n",
    "    (-189.43184924301974, 24.74309266215056),\n",
    "    (-184.7062507874361, 33.14932810051302),\n",
    "    (-30.55144070299677, 259.2576189250935),\n",
    "    (-24.412520344941953, 266.8040179623472),\n",
    "    (-17.56940095820731, 273.7182206387879),\n",
    "    (-10.086842048356445, 279.93479475582495),\n",
    "    (-2.0356544237308825, 285.394910086574),\n",
    "    (6.507969918963688, 290.0468951126591),\n",
    "    (15.463178833668529, 293.8467260149487),\n",
    "    (24.745225165064543, 296.758443290685),\n",
    "    (34.26626874888323, 298.7544920543751),\n",
    "    (43.93620768274765, 299.8159828020204),\n",
    "    (53.66353100085455, 299.9328701709592),\n",
    "    (63.35618468325523, 299.10404800363494),\n",
    "    (72.92244280430123, 297.33735981566144),\n",
    "    (82.27177557618647, 294.64952456911897),\n",
    "    (91.31570607290114, 291.0659784535237),\n",
    "    (99.96864752703414, 286.6206341717666),\n",
    "    (108.14871327570971, 281.355560009008),\n",
    "    (115.77849169077639, 275.3205817216414),\n",
    "    (122.78577875973701, 268.57281101383126),\n",
    "    (129.10426138467784, 261.17610506386103),\n",
    "    (134.67414493283295, 253.20046221503722),\n",
    "    (139.44271909999156, 244.72135954999587),\n",
    "    (189.4427190999916, 144.72135954999578),\n",
    "    (193.40316487178438, 135.7190256296874),\n",
    "    (196.46014848027284, 126.37119176608674),\n",
    "    (198.5841005952538, 116.76827688896145),\n",
    "    (199.75447683394128, 107.00316725394137),\n",
    "    (199.959956480919, 97.1703179802708),\n",
    "    (199.19855199019082, 87.36483941339068),\n",
    "])\n",
    "p"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-128.0 -128.0 756.0 756.0\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,500.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"5.04\" opacity=\"0.6\" d=\"M 0.0,-100.0 L -9.80171403296,-99.5184726672 L -19.5090322016,-98.0785280403 L -29.0284677254,-95.6940335732 L -38.2683432365,-92.3879532511 L -47.1396736826,-88.1921264348 L -55.557023302,-83.1469612303 L -63.4393284164,-77.3010453363 L -70.7106781187,-70.7106781187 L -77.3010453363,-63.4393284164 L -83.1469612303,-55.557023302 L -88.1921264348,-47.1396736826 L -92.3879532511,-38.2683432365 L -95.6940335732,-29.0284677254 L -98.0785280403,-19.5090322016 L -99.5184726672,-9.80171403296 L -100.0,0.0 L -100.0,500.0 L -99.5184726672,509.801714033 L -98.0785280403,519.509032202 L -95.6940335732,529.028467725 L -92.3879532511,538.268343237 L -88.1921264348,547.139673683 L -83.1469612303,555.557023302 L -77.3010453363,563.439328416 L -70.7106781187,570.710678119 L -63.4393284164,577.301045336 L -55.557023302,583.14696123 L -47.1396736826,588.192126435 L -38.2683432365,592.387953251 L -29.0284677254,595.694033573 L -19.5090322016,598.07852804 L -9.80171403296,599.518472667 L 0.0,600.0 L 500.0,600.0 L 509.801714033,599.518472667 L 519.509032202,598.07852804 L 529.028467725,595.694033573 L 538.268343237,592.387953251 L 547.139673683,588.192126435 L 555.557023302,583.14696123 L 563.439328416,577.301045336 L 570.710678119,570.710678119 L 577.301045336,563.439328416 L 583.14696123,555.557023302 L 588.192126435,547.139673683 L 592.387953251,538.268343237 L 595.694033573,529.028467725 L 598.07852804,519.509032202 L 599.518472667,509.801714033 L 600.0,500.0 L 599.518472667,490.198285967 L 598.07852804,480.490967798 L 595.694033573,470.971532275 L 592.387953251,461.731656763 L 588.192126435,452.860326317 L 583.14696123,444.442976698 L 577.301045336,436.560671584 L 570.710678119,429.289321881 L 563.439328416,422.698954664 L 555.557023302,416.85303877 L 547.139673683,411.807873565 L 538.268343237,407.612046749 L 529.028467725,404.305966427 L 519.509032202,401.92147196 L 509.801714033,400.481527333 L 500.0,400.0 L 100.0,400.0 L 100.0,100.0 L 500.0,100.0 L 509.801714033,99.5184726672 L 519.509032202,98.0785280403 L 529.028467725,95.6940335732 L 538.268343237,92.3879532511 L 547.139673683,88.1921264348 L 555.557023302,83.1469612303 L 563.439328416,77.3010453363 L 570.710678119,70.7106781187 L 577.301045336,63.4393284164 L 583.14696123,55.557023302 L 588.192126435,47.1396736826 L 592.387953251,38.2683432365 L 595.694033573,29.0284677254 L 598.07852804,19.5090322016 L 599.518472667,9.80171403296 L 600.0,0.0 L 599.518472667,-9.80171403296 L 598.07852804,-19.5090322016 L 595.694033573,-29.0284677254 L 592.387953251,-38.2683432365 L 588.192126435,-47.1396736826 L 583.14696123,-55.557023302 L 577.301045336,-63.4393284164 L 570.710678119,-70.7106781187 L 563.439328416,-77.3010453363 L 555.557023302,-83.1469612303 L 547.139673683,-88.1921264348 L 538.268343237,-92.3879532511 L 529.028467725,-95.6940335732 L 519.509032202,-98.0785280403 L 509.801714033,-99.5184726672 L 500.0,-100.0 L 0.0,-100.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x105058210>"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = Polygon(\n",
    "[\n",
    "    (0.0, -100.0),\n",
    "    (-9.801714032956664, -99.51847266721963),\n",
    "    (-19.509032201613387, -98.07852804032294),\n",
    "    (-29.02846772544675, -95.69403357322072),\n",
    "    (-38.268343236509445, -92.38795325112848),\n",
    "    (-47.13967368260018, -88.19212643483529),\n",
    "    (-55.5570233019606, -83.14696123025428),\n",
    "    (-63.439328416364795, -77.30104533627349),\n",
    "    (-70.710678118655, -70.71067811865453),\n",
    "    (-77.30104533627389, -63.439328416364326),\n",
    "    (-83.14696123025468, -55.55702330196001),\n",
    "    (-88.1921264348356, -47.13967368259957),\n",
    "    (-92.38795325112875, -38.2683432365088),\n",
    "    (-95.69403357322092, -29.028467725446088),\n",
    "    (-98.07852804032306, -19.509032201612705),\n",
    "    (-99.5184726672197, -9.80171403295597),\n",
    "    (-100.0, 0.0),\n",
    "    (-100.0, 500.0),\n",
    "    (-99.51847266721968, 509.80171403295606),\n",
    "    (-98.07852804032305, 519.5090322016129),\n",
    "    (-95.69403357322088, 529.0284677254463),\n",
    "    (-92.38795325112868, 538.2683432365089),\n",
    "    (-88.1921264348355, 547.1396736825998),\n",
    "    (-83.14696123025453, 555.5570233019603),\n",
    "    (-77.3010453362737, 563.4393284163646),\n",
    "    (-70.71067811865474, 570.7106781186548),\n",
    "    (-63.439328416364525, 577.3010453362738),\n",
    "    (-55.55702330196019, 583.1469612302545),\n",
    "    (-47.13967368259977, 588.1921264348355),\n",
    "    (-38.268343236508976, 592.3879532511287),\n",
    "    (-29.028467725446223, 595.6940335732208),\n",
    "    (-19.5090322016128, 598.078528040323),\n",
    "    (-9.80171403295602, 599.5184726672197),\n",
    "    (0.0, 600.0),\n",
    "    (500.0, 600.0),\n",
    "    (509.8017140329562, 599.5184726672196),\n",
    "    (519.509032201613, 598.078528040323),\n",
    "    (529.0284677254464, 595.6940335732208),\n",
    "    (538.268343236509, 592.3879532511287),\n",
    "    (547.1396736825999, 588.1921264348355),\n",
    "    (555.5570233019603, 583.1469612302544),\n",
    "    (563.4393284163647, 577.3010453362737),\n",
    "    (570.7106781186549, 570.7106781186546),\n",
    "    (577.3010453362738, 563.4393284163644),\n",
    "    (583.1469612302545, 555.5570233019602),\n",
    "    (588.1921264348355, 547.1396736825997),\n",
    "    (592.3879532511287, 538.2683432365089),\n",
    "    (595.6940335732208, 529.0284677254463),\n",
    "    (598.078528040323, 519.5090322016129),\n",
    "    (599.5184726672197, 509.80171403295606),\n",
    "    (600.0, 500.0),\n",
    "    (599.5184726672197, 490.19828596704394),\n",
    "    (598.078528040323, 480.4909677983872),\n",
    "    (595.6940335732208, 470.9715322745538),\n",
    "    (592.3879532511287, 461.73165676349106),\n",
    "    (588.1921264348355, 452.8603263174003),\n",
    "    (583.1469612302545, 444.44297669803984),\n",
    "    (577.3010453362738, 436.5606715836355),\n",
    "    (570.7106781186548, 429.28932188134524),\n",
    "    (563.4393284163646, 422.69895466372634),\n",
    "    (555.5570233019603, 416.85303876974547),\n",
    "    (547.1396736825998, 411.8078735651645),\n",
    "    (538.2683432365089, 407.6120467488713),\n",
    "    (529.0284677254463, 404.3059664267791),\n",
    "    (519.5090322016127, 401.921471959677),\n",
    "    (509.801714032956, 400.4815273327803),\n",
    "    (500.0, 400.0),\n",
    "    (100.0, 400.0),\n",
    "    (100.0, 100.0),\n",
    "    (500.0, 100.0),\n",
    "    (509.8017140329562, 99.51847266721967),\n",
    "    (519.509032201613, 98.07852804032302),\n",
    "    (529.0284677254464, 95.69403357322085),\n",
    "    (538.268343236509, 92.38795325112864),\n",
    "    (547.1396736825999, 88.19212643483544),\n",
    "    (555.5570233019603, 83.14696123025446),\n",
    "    (563.4393284163647, 77.30104533627363),\n",
    "    (570.7106781186549, 70.7106781186547),\n",
    "    (577.3010453362738, 63.439328416364496),\n",
    "    (583.1469612302545, 55.55702330196017),\n",
    "    (588.1921264348355, 47.139673682599714),\n",
    "    (592.3879532511287, 38.26834323650893),\n",
    "    (595.6940335732208, 29.028467725446205),\n",
    "    (598.078528040323, 19.509032201612804),\n",
    "    (599.5184726672197, 9.801714032956049),\n",
    "    (600.0, 0.0),\n",
    "    (599.5184726672197, -9.801714032956049),\n",
    "    (598.078528040323, -19.509032201612804),\n",
    "    (595.6940335732208, -29.028467725446205),\n",
    "    (592.3879532511287, -38.26834323650893),\n",
    "    (588.1921264348355, -47.139673682599714),\n",
    "    (583.1469612302545, -55.557023301960186),\n",
    "    (577.3010453362738, -63.439328416364525),\n",
    "    (570.7106781186548, -70.71067811865474),\n",
    "    (563.4393284163646, -77.30104533627369),\n",
    "    (555.5570233019603, -83.14696123025452),\n",
    "    (547.1396736825998, -88.1921264348355),\n",
    "    (538.2683432365089, -92.38795325112868),\n",
    "    (529.0284677254463, -95.69403357322089),\n",
    "    (519.5090322016127, -98.07852804032305),\n",
    "    (509.801714032956, -99.5184726672197),\n",
    "    (500.0, -100.0),\n",
    "    (0.0, -100.0)\n",
    "])\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sa = set(a.convex_hull.exterior.coords)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"300\" height=\"300\" viewBox=\"-128.0 -128.0 756.0 756.0\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,500.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"5.04\" opacity=\"0.6\" d=\"M 600.0,0.0 L 599.518472667,-9.80171403296 L 598.07852804,-19.5090322016 L 595.694033573,-29.0284677254 L 592.387953251,-38.2683432365 L 588.192126435,-47.1396736826 L 583.14696123,-55.557023302 L 577.301045336,-63.4393284164 L 570.710678119,-70.7106781187 L 563.439328416,-77.3010453363 L 555.557023302,-83.1469612303 L 547.139673683,-88.1921264348 L 538.268343237,-92.3879532511 L 529.028467725,-95.6940335732 L 519.509032202,-98.0785280403 L 509.801714033,-99.5184726672 L 500.0,-100.0 L 0.0,-100.0 L -9.80171403296,-99.5184726672 L -19.5090322016,-98.0785280403 L -29.0284677254,-95.6940335732 L -38.2683432365,-92.3879532511 L -47.1396736826,-88.1921264348 L -55.557023302,-83.1469612303 L -63.4393284164,-77.3010453363 L -70.7106781187,-70.7106781187 L -77.3010453363,-63.4393284164 L -83.1469612303,-55.557023302 L -88.1921264348,-47.1396736826 L -92.3879532511,-38.2683432365 L -95.6940335732,-29.0284677254 L -98.0785280403,-19.5090322016 L -99.5184726672,-9.80171403296 L -100.0,0.0 L -100.0,500.0 L -99.5184726672,509.801714033 L -98.0785280403,519.509032202 L -95.6940335732,529.028467725 L -92.3879532511,538.268343237 L -88.1921264348,547.139673683 L -83.1469612303,555.557023302 L -77.3010453363,563.439328416 L -70.7106781187,570.710678119 L -63.4393284164,577.301045336 L -55.557023302,583.14696123 L -47.1396736826,588.192126435 L -38.2683432365,592.387953251 L -29.0284677254,595.694033573 L -19.5090322016,598.07852804 L -9.80171403296,599.518472667 L 0.0,600.0 L 500.0,600.0 L 509.801714033,599.518472667 L 519.509032202,598.07852804 L 529.028467725,595.694033573 L 538.268343237,592.387953251 L 547.139673683,588.192126435 L 555.557023302,583.14696123 L 563.439328416,577.301045336 L 570.710678119,570.710678119 L 577.301045336,563.439328416 L 583.14696123,555.557023302 L 588.192126435,547.139673683 L 592.387953251,538.268343237 L 595.694033573,529.028467725 L 598.07852804,519.509032202 L 599.518472667,509.801714033 L 600.0,500.0 L 600.0,0.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x10500ba90>"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# rust convex hull\n",
    "b = Polygon([\n",
    "    (600, 0),\n",
    "    (599.5184726672197, -9.801714032956049),\n",
    "    (598.078528040323, -19.509032201612804),\n",
    "    (595.6940335732208, -29.028467725446205),\n",
    "    (592.3879532511287, -38.26834323650893),\n",
    "    (588.1921264348355, -47.139673682599714),\n",
    "    (583.1469612302545, -55.557023301960186),\n",
    "    (577.3010453362738, -63.439328416364525),\n",
    "    (570.7106781186548, -70.71067811865474),\n",
    "    (563.4393284163646, -77.30104533627369),\n",
    "    (555.5570233019603, -83.14696123025452),\n",
    "    (547.1396736825998, -88.1921264348355),\n",
    "    (538.2683432365089, -92.38795325112868),\n",
    "    (529.0284677254463, -95.69403357322089),\n",
    "    (519.5090322016127, -98.07852804032305),\n",
    "    (509.801714032956, -99.5184726672197),\n",
    "    (500, -100),\n",
    "    (0, -100),\n",
    "    (-9.801714032956664, -99.51847266721963),\n",
    "    (-19.509032201613387, -98.07852804032294),\n",
    "    (-29.02846772544675, -95.69403357322072),\n",
    "    (-38.268343236509445, -92.38795325112848),\n",
    "    (-47.13967368260018, -88.19212643483529),\n",
    "    (-55.5570233019606, -83.14696123025428),\n",
    "    (-63.439328416364795, -77.30104533627349),\n",
    "    (-70.710678118655, -70.71067811865453),\n",
    "    (-77.30104533627389, -63.439328416364326),\n",
    "    (-83.14696123025468, -55.55702330196001),\n",
    "    (-88.1921264348356, -47.13967368259957),\n",
    "    (-92.38795325112875, -38.2683432365088),\n",
    "    (-95.69403357322092, -29.028467725446088),\n",
    "    (-98.07852804032306, -19.509032201612705),\n",
    "    (-99.5184726672197, -9.80171403295597),\n",
    "    (-100, 0),\n",
    "    (-100, 500),\n",
    "    (-99.51847266721968, 509.80171403295606),\n",
    "    (-98.07852804032305, 519.5090322016129),\n",
    "    (-95.69403357322088, 529.0284677254463),\n",
    "    (-92.38795325112868, 538.2683432365089),\n",
    "    (-88.1921264348355, 547.1396736825998),\n",
    "    (-83.14696123025453, 555.5570233019603),\n",
    "    (-77.3010453362737, 563.4393284163646),\n",
    "    (-70.71067811865474, 570.7106781186548),\n",
    "    (-63.439328416364525, 577.3010453362738),\n",
    "    (-55.55702330196019, 583.1469612302545),\n",
    "    (-47.13967368259977, 588.1921264348355),\n",
    "    (-38.268343236508976, 592.3879532511287),\n",
    "    (-29.028467725446223, 595.6940335732208),\n",
    "    (-19.5090322016128, 598.078528040323),\n",
    "    (-9.80171403295602, 599.5184726672197),\n",
    "    (0, 600),\n",
    "    (500, 600),\n",
    "    (509.8017140329562, 599.5184726672196),\n",
    "    (519.509032201613, 598.078528040323),\n",
    "    (529.0284677254464, 595.6940335732208),\n",
    "    (538.268343236509, 592.3879532511287),\n",
    "    (547.1396736825999, 588.1921264348355),\n",
    "    (555.5570233019603, 583.1469612302544),\n",
    "    (563.4393284163647, 577.3010453362737),\n",
    "    (570.7106781186549, 570.7106781186546),\n",
    "    (577.3010453362738, 563.4393284163644),\n",
    "    (583.1469612302545, 555.5570233019602),\n",
    "    (588.1921264348355, 547.1396736825997),\n",
    "    (592.3879532511287, 538.2683432365089),\n",
    "    (595.6940335732208, 529.0284677254463),\n",
    "    (598.078528040323, 519.5090322016129),\n",
    "    (599.5184726672197, 509.80171403295606),\n",
    "    (600, 500),\n",
    "    (600, 0),\n",
    "])\n",
    "b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "sb = set(b.exterior.coords)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "sa == sb"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-10.8 -10.8 21.6 21.6\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,0.0)\"><polyline fill=\"none\" stroke=\"#66cc99\" stroke-width=\"0.432\" points=\"0.0,10.0 1.0,1.0 10.0,0.0 1.0,-1.0 0.0,-10.0 -1.0,-1.0 -10.0,0.0 -1.0,1.0 0.0,10.0\" opacity=\"0.8\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.linestring.LineString at 0x10506ad90>"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls = LineString([\n",
    "    (0.0, 10.0),\n",
    "    (1.0, 1.0),\n",
    "    (10.0, 0.0),\n",
    "    (1.0, -1.0),\n",
    "    (0.0, -10.0),\n",
    "    (-1.0, -1.0),\n",
    "    (-10.0, 0.0),\n",
    "    (-1.0, 1.0),\n",
    "    (0.0, 10.0)\n",
    "])\n",
    "ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"100.0\" height=\"100.0\" viewBox=\"-10.8 -10.8 21.6 21.6\" preserveAspectRatio=\"xMinYMin meet\"><g transform=\"matrix(1,0,0,-1,0,0.0)\"><path fill-rule=\"evenodd\" fill=\"#66cc99\" stroke=\"#555555\" stroke-width=\"0.432\" opacity=\"0.6\" d=\"M 0.0,-10.0 L -10.0,0.0 L 0.0,10.0 L 10.0,0.0 L 0.0,-10.0 z\" /></g></svg>"
      ],
      "text/plain": [
       "<shapely.geometry.polygon.Polygon at 0x104fe1790>"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "ls.convex_hull"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}