diff --git a/.idea/.name b/.idea/.name new file mode 100644 index 0000000..5a4a47d --- /dev/null +++ b/.idea/.name @@ -0,0 +1 @@ +assignment_09 \ No newline at end of file diff --git a/.idea/assignment_09.iml b/.idea/assignment_09.iml new file mode 100644 index 0000000..6f63a63 --- /dev/null +++ b/.idea/assignment_09.iml @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..f9edad6 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..aada090 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..462847e --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,320 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1460347454539 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/FoliumTests.ipynb b/FoliumTests.ipynb new file mode 100644 index 0000000..6efe134 --- /dev/null +++ b/FoliumTests.ipynb @@ -0,0 +1,63 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import folium\n", + "map_osm = folium.Map(location=[33.42,-112.065])\n", + "map_osm" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import view\n" + ] + } + ], + "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 +} diff --git a/assignment_09.ipynb b/assignment_09.ipynb new file mode 100644 index 0000000..5c8970b --- /dev/null +++ b/assignment_09.ipynb @@ -0,0 +1,418 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import point\n", + "import numpy as np\n", + "import scipy.spatial as ss" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[]\n" + ] + } + ], + "source": [ + "new_pattern = point.PointPattern()\n", + "print(new_pattern.set_of_points)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "new_pattern.create_random_points(100)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100\n", + "0.9142760164698801 0.15245063193191088\n", + "0.48292614290484737 0.9184628109684032\n", + "0.33337651658050294 0.14784305046750346\n", + "0.9327600879601421 0.2358142955339223\n", + "0.5345702139280762 0.1830012587408244\n", + "0.002849203469585393 0.5434766718623576\n", + "0.6251115361250151 0.2645918875037627\n", + "0.7182434387659785 0.2395936701848791\n", + "0.21368200421050754 0.267438850795948\n", + "0.3521725340587013 0.5056825585905379\n", + "0.5439423094433921 0.2712087706030353\n", + "0.82615355908667 0.6547727443633703\n", + "0.08986045973059864 0.9246296996694158\n", + "0.24471380776144358 0.8116256262258893\n", + "0.21024467340906994 0.37991618148937134\n", + "0.5747940828502552 0.8063150200582564\n", + "0.6025047760765152 0.9753594541295302\n", + "0.7866415747670197 0.22319518296945173\n", + "0.2579375000076477 0.8799154276145454\n", + "0.9888673392391436 0.13713011317465384\n", + "0.5702736966115158 0.770253540370834\n", + "0.8766275270801958 0.641916441376012\n", + "0.07201277369943748 0.7742175904664074\n", + "0.9478697924248484 0.1604053259950955\n", + "0.7305570577634707 0.18514257900216402\n", + "0.5537733831272414 0.4397696756607836\n", + "0.1551455561334898 0.48356741119165836\n", + "0.4279734358661875 0.7431233536565317\n", + "0.059476358378460215 0.0855312189522206\n", + "0.9787609352882003 0.9116216475342881\n", + "0.5144408762183188 0.6466992634194961\n", + "0.7665654174343465 0.8116327405751677\n", + "0.04954603647738143 0.12260715200453676\n", + "0.293864892759087 0.22602694869125362\n", + "0.36400690068460106 0.4544533170785756\n", + "0.45493764851109353 0.6516003388905123\n", + "0.29499855187404833 0.7308962595207906\n", + "0.48498111247671694 0.8773148081492596\n", + "0.23332745739723426 0.3401382348786517\n", + "0.3468309538263892 0.3241406065723006\n", + "0.40918925690082286 0.9383262981016628\n", + "0.105568084445395 0.07797118207917819\n", + "0.6817937716026468 0.7904206275561758\n", + "0.07007824361811354 0.556865336462241\n", + "0.2819049352306924 0.16689764114822214\n", + "0.6144378442123944 0.2797050017013618\n", + "0.31649064551762973 0.8441030137320968\n", + "0.8230946562010628 0.30067911209431886\n", + "0.2618994372009026 0.33352195422658415\n", + "0.981869901555576 0.2193626317783588\n", + "0.9269895104965136 0.5088279168426362\n", + "0.849475891067517 0.18481959677726145\n", + "0.2068049066207207 0.7087007874012001\n", + "0.8916661885934265 0.14880488519629842\n", + "0.23707561990224568 0.41691407513779255\n", + "0.2886420631832953 0.3653916005369152\n", + "0.7435969547589796 0.6927859059931808\n", + "0.5222235112808983 0.7990156931243353\n", + "0.6230869279780937 0.5672448689886037\n", + "0.9854109280758173 0.7673786925278128\n", + "0.7879314480728475 0.40910935134790005\n", + "0.0308960116621797 0.7962125987209373\n", + "0.587634060500698 0.351406109599945\n", + "0.4808262378401841 0.5650946324495782\n", + "0.08853053030971048 0.004176858656150029\n", + "0.41498096721400035 0.4296172802136691\n", + "0.745140060664367 0.15938841008146687\n", + "0.7887168376609083 0.20307882866212235\n", + "0.7409672069267957 0.41630659997950914\n", + "0.6269155513832362 0.8408910861033316\n", + "0.01660540098455332 0.11206648725322677\n", + "0.5218590922009425 0.11550308536945275\n", + "0.18937887758506478 0.10953410548782527\n", + "0.36222684192188925 0.8322795568797339\n", + "0.14357517377699935 0.8817086061690274\n", + "0.9302055316266093 0.6029112018423958\n", + "0.07853663510888098 0.09398472590186813\n", + "0.014658941403184134 0.11447865853102557\n", + "0.14529708534678143 0.32752012910329686\n", + "0.6410269827316531 0.4864479883050712\n", + "0.473544960405193 0.22739874008158323\n", + "0.35491532619647814 0.21635264638392082\n", + "0.4373322595213115 0.5417906778459081\n", + "0.8860375525077219 0.14201178855679664\n", + "0.09945908682911275 0.13854368523393434\n", + "0.05931279084493868 0.6757281907181366\n", + "0.1914869579350612 0.40647248738390696\n", + "0.9766361248822688 0.027057545855305953\n", + "0.5373914243497263 0.7900942340523922\n", + "0.361305006192813 0.5213786521648469\n", + "0.8208587933342094 0.970676245567716\n", + "0.6478749011749924 0.11459295410797588\n", + "0.22799010563773037 0.6865104135458886\n", + "0.40828408180197384 0.4639285130096892\n", + "0.4299356804231873 0.2810535030806197\n", + "0.06283394090070793 0.5165536456890886\n", + "0.4834708255248602 0.6378151236470068\n", + "0.4278802294627707 0.35732215757078334\n", + "0.20072055070401662 0.27405623006300184\n", + "0.14163527086350292 0.5786473576092528\n" + ] + } + ], + "source": [ + "print(len(new_pattern.set_of_points))\n", + "for i in range(len(new_pattern.set_of_points)):\n", + " print(new_pattern.set_of_points[i].x,new_pattern.set_of_points[i].y)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 0.02290187, 0.04119928, 0.05488535, 0.05179219, 0.06868461,\n", + " 0.06574966, 0.01850227, 0.05582604, 0.01455297, 0.01815955,\n", + " 0.07100568, 0.05208556, 0.06875675, 0.06955834, 0.03251291,\n", + " 0.0363437 , 0.13242461, 0.02022312, 0.06863672, 0.04714376,\n", + " 0.0363437 , 0.05208556, 0.04663012, 0.03452273, 0.0295963 ,\n", + " 0.09462909, 0.08523101, 0.09541243, 0.0208508 , 0.14439617,\n", + " 0.03221912, 0.08738527, 0.034586 , 0.06032674, 0.04527967,\n", + " 0.03168871, 0.08037559, 0.04119928, 0.02932803, 0.07132735,\n", + " 0.07636548, 0.03141867, 0.07455794, 0.04095745, 0.05488535,\n", + " 0.01850227, 0.04723975, 0.08563052, 0.02932803, 0.05179219,\n", + " 0.09413824, 0.05547144, 0.0306794 , 0.008822 , 0.04570278,\n", + " 0.04160339, 0.09088781, 0.0175971 , 0.08276461, 0.14439617,\n", + " 0.04751253, 0.04663012, 0.07654732, 0.0493437 , 0.0757356 ,\n", + " 0.03495868, 0.0295963 , 0.02022312, 0.04751253, 0.0625472 ,\n", + " 0.00309956, 0.06868461, 0.08955706, 0.04723975, 0.06875675,\n", + " 0.06627225, 0.0208508 , 0.00309956, 0.07700746, 0.08276461,\n", + " 0.0691419 , 0.0618122 , 0.0493437 , 0.008822 , 0.04922652,\n", + " 0.09930484, 0.03251291, 0.11075005, 0.0175971 , 0.01815955,\n", + " 0.16805537, 0.10708475, 0.0306794 , 0.03495868, 0.0691419 ,\n", + " 0.04095745, 0.03168871, 0.07343688, 0.01455297, 0.07479883])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_pattern.nearest_neighbor_kdtree()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.054670644019223634" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_pattern.nn_kdtree_avg()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0.52" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "new_pattern.np_compute_g(.05)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "tuples = np.random.uniform(-1, 1, (1,2))" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.66428233 0.53293921]]\n", + "[ 0.66428233 0.53293921]\n" + ] + } + ], + "source": [ + "print (tuples)\n", + "print (tuples[0])" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.532939208977\n" + ] + } + ], + "source": [ + "print(tuples[0][1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Assignment 8: Pysal" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "from point import PointPattern\n", + "import pysal as ps" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "shapefile = ps.open(ps.examples.get_path('new_haven_merged.shp'))\n", + "dbf = ps.open(ps.examples.get_path('new_haven_merged.dbf'))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(-72.976512, 41.337662) [' Thu, Sept. 18th 2014', 'all-cases-dead-on-arrival', ' 1605 WHALLEY AVE', ' AMITY/POND LILY', ' 01:53 p.m.']\n", + "-72.976512\n" + ] + } + ], + "source": [ + "for geometry, attributes in zip(shapefile, dbf):\n", + " print(geometry, attributes)\n", + " print(geometry[0])\n", + " break" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "new_pattern = point.PointPattern()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "unmarked_point = point.Point()\n", + "\n", + "for geometry in zip(shapefile,dbf):\n", + " unmarked_point.x = geometry[0]\n", + " unmarked_point.y = geometry[1]\n", + " new_pattern.set_of_points.append(unmarked_point)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/exit.png b/exit.png new file mode 100644 index 0000000..6d40c5b Binary files /dev/null and b/exit.png differ diff --git a/globe.png b/globe.png new file mode 100644 index 0000000..3340e3f Binary files /dev/null and b/globe.png differ diff --git a/point.py b/point.py new file mode 100644 index 0000000..8318676 --- /dev/null +++ b/point.py @@ -0,0 +1,367 @@ +import random +import math +import numpy as np +import scipy.spatial as ss +import pysal as ps + + +class Point: + """ + For whatever reason, cannot get import to work, just moved functionality + into this file instead. + """ + def __init__(self,x = 0,y = 0,mark = ""): + self.x = x + self.y = y + self.mark = mark + + def __eq__(self, other): + return self.x == other.x and self.y == other.y + + def __gt__(self, other): + direction = "" + if self.y > other.y: + direction += "N" + elif self.y == other.y: + direction += "-" + else: + direction += "S" + if self.x > other.x: + direction += "E" + elif self.x == other.y: + direction += "-" + else: + direction += "W" + + return direction + + def __neg__(self): + return Point(-self.x,-self.y,self.mark) + + def shift_point(self,x_move,y_move): + this_point = (self.x,self.y) + self.x += x_move + self.y += y_move + + """ + Made redundant by __eq__ + def coincident(self, check_point): + if check_point.x == self.x and check_point.y == self.y: + return True + else: + return False + """ + + +class PointPattern: + def __init__(self): + self.set_of_points = [] + + def avg_nearest_neighbor_dist(self,mark): + average_nearest_neighbor_distance(self.set_of_points, mark) + + def num_coincident_points(self): + coincident_points = 0 + len_list = len(self.set_of_points) + for i in range(len_list): + if i == len_list-1: + break + for j in range(len_list+1): + if self.set_of_points[i] == self.set_of_points[j]: + coincident_points += 1 + + return coincident_points + + def list_marks(self): + mark_list = [] + len_list = len(self.set_of_points) + for i in range(len_list): + if not mark_list: + mark_list.append(self.set_of_points[i].mark) + elif self.set_of_points[i].mark not in mark_list: + mark_list.append(self.set_of_points[i].mark) + + return mark_list + + def list_mark_subsets(self): + mark_list = PointPattern.list_marks(self) + mark_count = [] + sub_set = [] + for i in range(len(mark_list)): + sub_set = [] + for j in range(len(self.set_of_points)): + if mark_list[i] == self.set_of_points[j].mark: + sub_set.append(self.set_of_points[j]) + mark_count.append(sub_set) + + return mark_count + + def create_random_points(self, n=100, marks = []): + if not marks: + self.set_of_points = create_random_unmarked_points(n) + else: + self.set_of_points = create_random_marked_points(n,marks) + + def k_realizations(self,k = 99): + return permutations(k,n = 100) + + def critical_points(self,realizations): + return find_crit_points(realizations) + + def compute_g(self, min_dist): + gs = 0 + len_list = len(self.set_of_points) + all_pts_min_dists = [] + for i in range(len_list): + local_nn = 0 + for j in range(len_list): + if i != j: + new_distance = euclidean_distance(self.set_of_points[i],self.set_of_points[j]) + if local_nn == 0: + local_nn = new_distance + elif new_distance < local_nn: + local_nn = new_distance + + all_pts_min_dists.append(local_nn) + + for k in range(len(all_pts_min_dists)): + if all_pts_min_dists[k]<=min_dist: + gs += 1 + + return gs + """ + Assignment 8 stuff + """ + + def nearest_neighbor_kdtree(self, mark=""): + buffer = build_np_array(self.set_of_points, mark) + kdtree = ss.KDTree(buffer) + calc_distances = [] + values = [] + for i in buffer: + nn_distance, nn = kdtree.query(i, k=2) + #do we remove the first one since it is the coincident? + calc_distances.append(nn_distance[1]) + values.append(nn) + distances = np.array(calc_distances) + return distances + + def nn_kdtree_avg(self, mark=""): + return np.mean(self.nearest_neighbor_kdtree(mark)) + + def np_compute_g(self, min_dist, mark=""): + buffer = build_np_array(self.set_of_points, mark) + g = 0 + n = len(self.set_of_points) + list_of_min_dists = [] + for i in range(len(self.set_of_points)): + local_nn = 0 + for j in range(len(self.set_of_points)): + if i != j: + new_dist = ss.distance.euclidean(buffer[i],buffer[j]) + if local_nn == 0: + local_nn = new_dist + elif new_dist < local_nn: + local_nn = new_dist + list_of_min_dists.append(local_nn) + + for k in range(len(list_of_min_dists)): + if list_of_min_dists[k] <= min_dist: + g += 1 + + return g/n + + def np_gen_random_points(self, n = 100, dom_spec = False): + lop = [] + if dom_spec: + lx,ly,mx,my = minimum_bounding_rectangle(self.set_of_points) + for i in range(n): + x = np.random.uniform(lx, mx) + y = np.random.uniform(ly, my) + n_p = Point(x,y) + lop.append(n_p) + else: + for i in range(n): + tuples = np.random.uniform(0,1,(1,2)) + n_p = Point(tuples[0][0],tuples[0][1]) + lop.append(n_p) + + return lop + +""" +Assignment_08 +""" + + +def build_np_array(points, mark=""): + if not points: + return "No Points in List" + point_buffer = [] + + if mark == "": + for i in range(len(points)): + new_tuple = [points[i].x,points[i].y] + point_buffer.append(new_tuple) + + else: + for i in range(len(points)): + if points[i].mark == mark: + new_tuple = [points[i].x,points[i].y] + point_buffer.append(new_tuple) + + return np.array(point_buffer) + + +def nn_kdtree(points): + tree = ss.KDTree(points) + distances = [] + values = [] + for i in points: + nn_distance, nn = tree.query(i, k=2) + distances.append(nn_distance) + values.append(nn) + + return distances,values + + +def np_create_rand_points(self, n, specified): + lop = [] + if not specified: + for i in range(n): + tup = np.random.uniform(0,1,(1,2)) + point_n = Point(tup[0],tup[1]) + lop.append(point_n) + else: + minimum_bounding_rectangle(self.set_of_points) + + return lop + + +""" +Old Assignment +""" + + +def create_random_marked_points(n, marks = []): + list_of_tuples = [(random.uniform(0,1), random.uniform(0,1)) for i in range(n)] + list_of_marks = [random.choice(marks) for i in range(n)] + list_of_points = [] + for j in range(n): + new_point = Point(list_of_tuples[j][0],list_of_tuples[j][1],list_of_marks[j]) + list_of_points.append(new_point) + + return list_of_points + + +def create_random_unmarked_points(n): + list_of_tuples = [(random.uniform(0,1), random.uniform(0,1)) for i in range(n)] + list_of_points = [] + for j in range(n): + new_point = Point(list_of_tuples[j][0],list_of_tuples[j][1], "") + list_of_points.append(new_point) + + return list_of_points + + +def euclidean_distance(a, b): + distance = math.sqrt((a.x - b.x)**2 + (a.y - b.y)**2) + return distance + + +def average_nearest_neighbor_distance(points, mark=""): + mean_d = 0 + total = 0 + local_nn = 0 + num_of_points = len(points) + + if not mark: + for i in range(num_of_points): + local_nn = 0 + for j in range(num_of_points): + if i != j: + new_distance = euclidean_distance(points[i],points[j]) + if local_nn == 0: + local_nn = new_distance + elif new_distance < local_nn: + local_nn = new_distance + + total += local_nn + + else: + for i in range(num_of_points): + local_nn = 0 + for j in range(num_of_points): + if i != j and points[i].mark == points[j].mark: + new_distance = euclidean_distance(points[i],points[j]) + if local_nn == 0: + local_nn = new_distance + elif new_distance < local_nn: + local_nn = new_distance + + total += local_nn + + mean_d = total/num_of_points + + return mean_d + + +def permutations(p = 99, n = 100): + list_means = [] + + for i in range(p): + marks = ["elf", "dwarf", "human", "orc"] + rand_points = create_random_marked_points(n, marks) + newMean = average_nearest_neighbor_distance(rand_points) + list_means.append(newMean) + + return list_means + + +def find_crit_points(list_means): + entries = list_means + maxEntry = 0 + minEntry = 2 + for i in range(len(list_means)): + if entries[i] > maxEntry: + maxEntry = entries[i] + if entries[i] < minEntry: + minEntry = entries[i] + + return minEntry,maxEntry + + +def crit_point_check(minEntry, maxEntry, observed): + if observed < minEntry or observed > maxEntry: + return True + else: + return False + +def minimum_bounding_rectangle(points): + """ + Given a set of points, compute the minimum bounding rectangle. + + Parameters + ---------- + points : list + A list of points in the form (x,y) + + Returns + ------- + : list + Corners of the MBR in the form [xmin, ymin, xmax, ymax] + """ + mbr = [0,0,0,0] + numOfPoints = len(points) + for i in range(numOfPoints): + #Check for min and max x + if points[i][0] < mbr[0]: + mbr[0] = points[i][0] + if points[i][0] > mbr[2]: + mbr[2] = points[i][0] + #Check for min and max y + if points[i][1] < mbr[1]: + mbr[1] = points[i][1] + if points[i][1] > mbr[3]: + mbr[3] = points[i][1] + + return mbr \ No newline at end of file diff --git a/view.py b/view.py new file mode 100644 index 0000000..a3b9574 --- /dev/null +++ b/view.py @@ -0,0 +1,36 @@ +import sys +from PyQt4 import QtGui + + +class Example(QtGui.QMainWindow): + + def __init__(self): + super(Example, self).__init__() + + self.initUI() + + + def initUI(self): + + exitAction = QtGui.QAction(QtGui.QIcon('exit.png'), 'Exit', self) + exitAction.setShortcut('Ctrl+Q') + exitAction.triggered.connect(QtGui.qApp.quit) + + self.toolbar = self.addToolBar('Exit') + self.toolbar.addAction(exitAction) + + self.setGeometry(300, 300, 300, 200) + self.setWindowTitle('Assignment_09') + self.setWindowIcon(QtGui.QIcon('globe.png')) + self.show() + + +def main(): + + app = QtGui.QApplication(sys.argv) + ex = Example() + sys.exit(app.exec_()) + + +if __name__ == '__main__': + main() \ No newline at end of file