From 33a9ece479098cb7ce0c1c2149a53258262f2a31 Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 10:17:00 +0800 Subject: [PATCH 1/7] add geometry support --- cyaron/__init__.py | 1 + cyaron/geometry.py | 120 ++++++++++++++++++++++++++++++++++++++ examples/test_geometry.py | 6 ++ 3 files changed, 127 insertions(+) create mode 100644 cyaron/geometry.py create mode 100644 examples/test_geometry.py diff --git a/cyaron/__init__.py b/cyaron/__init__.py index 123369e..c3c0dab 100644 --- a/cyaron/__init__.py +++ b/cyaron/__init__.py @@ -5,4 +5,5 @@ from .utils import * from .consts import * from .vector import Vector +from .geometry import Geometry from random import randint, randrange, uniform, choice, random diff --git a/cyaron/geometry.py b/cyaron/geometry.py new file mode 100644 index 0000000..7996929 --- /dev/null +++ b/cyaron/geometry.py @@ -0,0 +1,120 @@ +from .utils import * +from .consts import * +import random + +class Geometry: + @staticmethod + def convex_hull(n,**kwargs): + #fx, fy are functions which map [0,1] to int or float + fx = kwargs.get("fx", lambda x:x) + fy = kwargs.get("fy", lambda x:x) + sz=n*2 + result=[] + while len(result)=2: + a=st[len(st)-1] + b=points[i] + o=st[len(st)-2] + if (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0])>=0: + break + st.pop() + st.append(points[i]) + g=len(st)+1 + for i in range(0,len(points)-1)[::-1]: + while len(st)>=g: + a=st[len(st)-1] + b=points[i] + o=st[len(st)-2] + if (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0])>=0: + break + st.pop() + st.append(points[i]) + result=st + sz=int(sz*1.7)+3 #if failed, increase size and try again + random.shuffle(result) + result=result[0:n] + return result + #find a path from points[0] to points[1] and cross all points in [points] + @staticmethod + def __conquer(points): + if len(points)<=2: + return points + divide_id=random.randint(2,len(points)-1) + divide_point1=points[divide_id] + divide_k=random.uniform(0.01,0.99) + divide_point2=[divide_k*(points[1][0]-points[0][0])+points[0][0], + divide_k*(points[1][1]-points[0][1])+points[0][1]] + #path: points[0]->points[divide]->points[1] + #dividing line in the form Ax+By+C=0 + divide_line=[divide_point2[1]-divide_point1[1], + divide_point1[0]-divide_point2[0], + -divide_point1[0]*divide_point2[1] + +divide_point1[1]*divide_point2[0]] + p0=(divide_line[0]*points[0][0]+divide_line[1]*points[0][1]+divide_line[2]>=0) + p1=(divide_line[0]*points[1][0]+divide_line[1]*points[1][1]+divide_line[2]>=0) + if p0==p1: #the divide point isn't good enough... + return __conquer(points) + s=[[],[]] + s[p0].append(points[0]) + s[p0].append(divide_point1) + s[not p0].append(divide_point1) + s[not p0].append(points[1]) + for i in range(2,len(points)): + if i==divide_id: + continue + pt=(divide_line[0]*points[i][0]+divide_line[1]*points[i][1]+divide_line[2]>=0) + s[pt].append(points[i]) + pa=Geometry.__conquer(s[p0]) + pb=Geometry.__conquer(s[not p0]) + pb.pop(0) + return pa+pb + #generate simple polygon from given points (int[2] or float[2]) + #O(nlogn)~O(n^2) + @staticmethod + def simple_polygon(points): + if not list_like(points): + raise Exception("source point is not a list") + random.shuffle(points) + if len(points)<3: + return points + #divide by points[0], points[1] + divide_line=[points[1][1]-points[0][1], + points[0][0]-points[1][0], + -points[0][0]*points[1][1] + +points[0][1]*points[1][0]] + s=[[],[]] + s[0].append(points[0]) + s[0].append(points[1]) + s[1].append(points[1]) + s[1].append(points[0]) + for i in range(2,len(points)): + pt=(divide_line[0]*points[i][0]+divide_line[1]*points[i][1]+divide_line[2]>=0) + s[pt].append(points[i]) + pa=Geometry.__conquer(s[0]) + pb=Geometry.__conquer(s[1]) + pa.pop(0) + pb.pop(0) + return pa+pb diff --git a/examples/test_geometry.py b/examples/test_geometry.py new file mode 100644 index 0000000..9de7aea --- /dev/null +++ b/examples/test_geometry.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python + +from cyaron import * +print Geometry.convex_hull(300,fx=lambda x:int(x*1000),fy=lambda x:int(x*1000)) +points=Vector.random(300,[1000,1000]) +print Geometry.simple_polygon(points) \ No newline at end of file From 60b806fecdf1fada7d45a20b00ece3f603b49e1c Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 10:25:30 +0800 Subject: [PATCH 2/7] standarize code format --- cyaron/geometry.py | 166 +++++++++++++++++++++++---------------------- 1 file changed, 85 insertions(+), 81 deletions(-) diff --git a/cyaron/geometry.py b/cyaron/geometry.py index 7996929..1a80643 100644 --- a/cyaron/geometry.py +++ b/cyaron/geometry.py @@ -4,117 +4,121 @@ class Geometry: @staticmethod - def convex_hull(n,**kwargs): - #fx, fy are functions which map [0,1] to int or float - fx = kwargs.get("fx", lambda x:x) - fy = kwargs.get("fy", lambda x:x) - sz=n*2 - result=[] - while len(result)=2: - a=st[len(st)-1] - b=points[i] - o=st[len(st)-2] - if (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0])>=0: + points = tmp + st = [] # stack + for i in range(0, len(points)): + while len(st) >= 2: + a = st[len(st) - 1] + b = points[i] + o = st[len(st) - 2] + if (a[0] - o[0]) * (b[1] - o[1]) - \ + (a[1] - o[1]) * (b[0] - o[0]) >= 0: break st.pop() st.append(points[i]) - g=len(st)+1 - for i in range(0,len(points)-1)[::-1]: - while len(st)>=g: - a=st[len(st)-1] - b=points[i] - o=st[len(st)-2] - if (a[0]-o[0])*(b[1]-o[1])-(a[1]-o[1])*(b[0]-o[0])>=0: + g = len(st) + 1 + for i in range(0, len(points) - 1)[::-1]: + while len(st) >= g: + a = st[len(st) - 1] + b = points[i] + o = st[len(st) - 2] + if (a[0] - o[0]) * (b[1] - o[1]) - \ + (a[1] - o[1]) * (b[0] - o[0]) >= 0: break st.pop() st.append(points[i]) - result=st - sz=int(sz*1.7)+3 #if failed, increase size and try again + result = st + sz = int(sz * 1.7) + 3 # if failed, increase size and try again random.shuffle(result) - result=result[0:n] + result = result[0:n] return result - #find a path from points[0] to points[1] and cross all points in [points] + + # find a path from points[0] to points[1] and cross all points in [points] @staticmethod def __conquer(points): - if len(points)<=2: + if len(points) <= 2: return points - divide_id=random.randint(2,len(points)-1) - divide_point1=points[divide_id] - divide_k=random.uniform(0.01,0.99) - divide_point2=[divide_k*(points[1][0]-points[0][0])+points[0][0], - divide_k*(points[1][1]-points[0][1])+points[0][1]] - #path: points[0]->points[divide]->points[1] - #dividing line in the form Ax+By+C=0 - divide_line=[divide_point2[1]-divide_point1[1], - divide_point1[0]-divide_point2[0], - -divide_point1[0]*divide_point2[1] - +divide_point1[1]*divide_point2[0]] - p0=(divide_line[0]*points[0][0]+divide_line[1]*points[0][1]+divide_line[2]>=0) - p1=(divide_line[0]*points[1][0]+divide_line[1]*points[1][1]+divide_line[2]>=0) - if p0==p1: #the divide point isn't good enough... + divide_id = random.randint(2, len(points) - 1) + divide_point1 = points[divide_id] + divide_k = random.uniform(0.01, 0.99) + divide_point2 = [divide_k * (points[1][0] - points[0][0]) + points[0][0], + divide_k * (points[1][1] - points[0][1]) + points[0][1]] + # path: points[0]->points[divide]->points[1] + # dividing line in the form Ax+By+C=0 + divide_line = [divide_point2[1] - divide_point1[1], + divide_point1[0] - divide_point2[0], + -divide_point1[0] * divide_point2[1] + + divide_point1[1] * divide_point2[0]] + p0 = (divide_line[0] * points[0][0] + divide_line[1] * points[0][1] + divide_line[2] >= 0) + p1 = (divide_line[0] * points[1][0] + divide_line[1] * points[1][1] + divide_line[2] >= 0) + if p0 == p1: # the divide point isn't good enough... return __conquer(points) - s=[[],[]] + s = [[], []] s[p0].append(points[0]) s[p0].append(divide_point1) s[not p0].append(divide_point1) s[not p0].append(points[1]) - for i in range(2,len(points)): - if i==divide_id: + for i in range(2, len(points)): + if i == divide_id: continue - pt=(divide_line[0]*points[i][0]+divide_line[1]*points[i][1]+divide_line[2]>=0) + pt = (divide_line[0] * points[i][0] + divide_line[1] * points[i][1] + divide_line[2] >= 0) s[pt].append(points[i]) - pa=Geometry.__conquer(s[p0]) - pb=Geometry.__conquer(s[not p0]) + pa = Geometry.__conquer(s[p0]) + pb = Geometry.__conquer(s[not p0]) pb.pop(0) - return pa+pb - #generate simple polygon from given points (int[2] or float[2]) - #O(nlogn)~O(n^2) + return pa + pb + + # generate simple polygon from given points (int[2] or float[2]) + # O(nlogn)~O(n^2) @staticmethod def simple_polygon(points): if not list_like(points): raise Exception("source point is not a list") random.shuffle(points) - if len(points)<3: + if len(points) < 3: return points - #divide by points[0], points[1] - divide_line=[points[1][1]-points[0][1], - points[0][0]-points[1][0], - -points[0][0]*points[1][1] - +points[0][1]*points[1][0]] - s=[[],[]] + # divide by points[0], points[1] + divide_line = [points[1][1] - points[0][1], + points[0][0] - points[1][0], + -points[0][0] * points[1][1] + + points[0][1] * points[1][0]] + s = [[], []] s[0].append(points[0]) s[0].append(points[1]) s[1].append(points[1]) s[1].append(points[0]) - for i in range(2,len(points)): - pt=(divide_line[0]*points[i][0]+divide_line[1]*points[i][1]+divide_line[2]>=0) + for i in range(2, len(points)): + pt = (divide_line[0] * points[i][0] + divide_line[1] * points[i][1] + divide_line[2] >= 0) s[pt].append(points[i]) - pa=Geometry.__conquer(s[0]) - pb=Geometry.__conquer(s[1]) + pa = Geometry.__conquer(s[0]) + pb = Geometry.__conquer(s[1]) pa.pop(0) pb.pop(0) - return pa+pb + return pa + pb From bcf23f84d1fdd860ba7a18f0b176342389d6773e Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 10:43:33 +0800 Subject: [PATCH 3/7] changed geometry to polygon --- cyaron/__init__.py | 2 +- cyaron/{geometry.py => polygon.py} | 34 ++++++++++++++++++++++-------- examples/test_geometry.py | 9 ++++---- 3 files changed, 31 insertions(+), 14 deletions(-) rename cyaron/{geometry.py => polygon.py} (85%) diff --git a/cyaron/__init__.py b/cyaron/__init__.py index c3c0dab..0771d92 100644 --- a/cyaron/__init__.py +++ b/cyaron/__init__.py @@ -5,5 +5,5 @@ from .utils import * from .consts import * from .vector import Vector -from .geometry import Geometry +from .polygon import Polygon from random import randint, randrange, uniform, choice, random diff --git a/cyaron/geometry.py b/cyaron/polygon.py similarity index 85% rename from cyaron/geometry.py rename to cyaron/polygon.py index 1a80643..bdd0c5f 100644 --- a/cyaron/geometry.py +++ b/cyaron/polygon.py @@ -2,7 +2,18 @@ from .consts import * import random -class Geometry: +class Polygon: + def __init__(self,points=[]): + if not list_like(points): + raise Exception("polygon must be constructed by a list of points") + self.points = points + + def __str__(self): + buf = [] + for point in self.points: + buf.append(str(point[0]) + " " + str(point[1])) + return '\n'.join(buf) + @staticmethod def convex_hull(n, **kwargs): # fx, fy are functions which map [0,1] to int or float @@ -56,9 +67,13 @@ def convex_hull(n, **kwargs): st.append(points[i]) result = st sz = int(sz * 1.7) + 3 # if failed, increase size and try again - random.shuffle(result) - result = result[0:n] - return result + ids = [i for i in range(0, len(result))] + random.shuffle(ids) + ids = ids[0:n] + ids = sorted(ids) + output = [result[ids[i]] for i in range(0, n)] + poly = Polygon(output) + return poly # find a path from points[0] to points[1] and cross all points in [points] @staticmethod @@ -90,8 +105,8 @@ def __conquer(points): continue pt = (divide_line[0] * points[i][0] + divide_line[1] * points[i][1] + divide_line[2] >= 0) s[pt].append(points[i]) - pa = Geometry.__conquer(s[p0]) - pb = Geometry.__conquer(s[not p0]) + pa = Polygon.__conquer(s[p0]) + pb = Polygon.__conquer(s[not p0]) pb.pop(0) return pa + pb @@ -117,8 +132,9 @@ def simple_polygon(points): for i in range(2, len(points)): pt = (divide_line[0] * points[i][0] + divide_line[1] * points[i][1] + divide_line[2] >= 0) s[pt].append(points[i]) - pa = Geometry.__conquer(s[0]) - pb = Geometry.__conquer(s[1]) + pa = Polygon.__conquer(s[0]) + pb = Polygon.__conquer(s[1]) pa.pop(0) pb.pop(0) - return pa + pb + poly = Polygon(pa + pb) + return poly diff --git a/examples/test_geometry.py b/examples/test_geometry.py index 9de7aea..cf4830f 100644 --- a/examples/test_geometry.py +++ b/examples/test_geometry.py @@ -1,6 +1,7 @@ #!/usr/bin/env python - from cyaron import * -print Geometry.convex_hull(300,fx=lambda x:int(x*1000),fy=lambda x:int(x*1000)) -points=Vector.random(300,[1000,1000]) -print Geometry.simple_polygon(points) \ No newline at end of file +print "random convex hull of size 300:" +print Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) +points = Vector.random(300, [1000, 1000]) +print "random simple polygon of size 300:" +print Polygon.simple_polygon(points) \ No newline at end of file From ac4d1596ec05d2f0dd3c8e2192f13992ee87c8cc Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 10:54:33 +0800 Subject: [PATCH 4/7] added perimeter and area calculation, fixed a bug --- cyaron/polygon.py | 23 ++++++++++++++++++++++- examples/test_geometry.py | 14 ++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/cyaron/polygon.py b/cyaron/polygon.py index bdd0c5f..26a2665 100644 --- a/cyaron/polygon.py +++ b/cyaron/polygon.py @@ -1,6 +1,7 @@ from .utils import * from .consts import * import random +import math class Polygon: def __init__(self,points=[]): @@ -14,6 +15,26 @@ def __str__(self): buf.append(str(point[0]) + " " + str(point[1])) return '\n'.join(buf) + def perimeter(self): + ans = 0 + for i in range(0, len(self.points)): + a = self.points[i] + b = self.points[(i + 1) % len(self.points)] + ans = ans + math.sqrt((a[0] - b[0]) * (a[0] - b[0]) + + (a[1] - b[1]) * (a[1] - b[1])) + return ans + + def area(self): + ans = 0 + for i in range(0, len(self.points)): + a = self.points[i] + b = self.points[(i + 1) % len(self.points)] + ans = ans + a[0] * b[1] - a[1] * b[0] + if ans < 0: + ans = -ans + ans = ans / 2 + return ans + @staticmethod def convex_hull(n, **kwargs): # fx, fy are functions which map [0,1] to int or float @@ -94,7 +115,7 @@ def __conquer(points): p0 = (divide_line[0] * points[0][0] + divide_line[1] * points[0][1] + divide_line[2] >= 0) p1 = (divide_line[0] * points[1][0] + divide_line[1] * points[1][1] + divide_line[2] >= 0) if p0 == p1: # the divide point isn't good enough... - return __conquer(points) + return Polygon.__conquer(points) s = [[], []] s[p0].append(points[0]) s[p0].append(divide_point1) diff --git a/examples/test_geometry.py b/examples/test_geometry.py index cf4830f..95399e0 100644 --- a/examples/test_geometry.py +++ b/examples/test_geometry.py @@ -1,7 +1,17 @@ #!/usr/bin/env python from cyaron import * print "random convex hull of size 300:" -print Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) +hull=Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) +print hull +print "perimeter:" +print hull.perimeter() +print "area:" +print hull.area() points = Vector.random(300, [1000, 1000]) print "random simple polygon of size 300:" -print Polygon.simple_polygon(points) \ No newline at end of file +poly = Polygon.simple_polygon(points) +print poly +print "perimeter:" +print poly.perimeter() +print "area:" +print poly.area() \ No newline at end of file From df1fc61f1e95e3ea1fcd90bd302f45ad599019d9 Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 11:17:46 +0800 Subject: [PATCH 5/7] add unit test --- cyaron/tests/__init__.py | 3 +- cyaron/tests/polygon_test.py | 57 ++++++++++++++++++++++++++++++++++++ examples/test_polygon.py | 17 +++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 cyaron/tests/polygon_test.py create mode 100644 examples/test_polygon.py diff --git a/cyaron/tests/__init__.py b/cyaron/tests/__init__.py index 57d987e..45ac28f 100644 --- a/cyaron/tests/__init__.py +++ b/cyaron/tests/__init__.py @@ -1 +1,2 @@ -from sequence_test import TestSequence \ No newline at end of file +from sequence_test import TestSequence +from polygon_test import TestPolygon \ No newline at end of file diff --git a/cyaron/tests/polygon_test.py b/cyaron/tests/polygon_test.py new file mode 100644 index 0000000..d8d9aae --- /dev/null +++ b/cyaron/tests/polygon_test.py @@ -0,0 +1,57 @@ +import unittest +from cyaron import Polygon,Vector +class TestPolygon(unittest.TestCase): + def test_convex_hull(self): + hull = Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) + points = hull.points + points = sorted(points) + # unique + tmp = [] + for i in range(0, len(points)): + if i == 0 or points[i - 1] != points[i]: + tmp.append(points[i]) + points = tmp + st = [] # stack + for i in range(0, len(points)): + while len(st) >= 2: + a = st[len(st) - 1] + b = points[i] + o = st[len(st) - 2] + if (a[0] - o[0]) * (b[1] - o[1]) - \ + (a[1] - o[1]) * (b[0] - o[0]) >= 0: + break + st.pop() + st.append(points[i]) + g = len(st) + 1 + for i in range(0, len(points) - 1)[::-1]: + while len(st) >= g: + a = st[len(st) - 1] + b = points[i] + o = st[len(st) - 2] + if (a[0] - o[0]) * (b[1] - o[1]) - \ + (a[1] - o[1]) * (b[0] - o[0]) >= 0: + break + st.pop() + st.append(points[i]) + self.assertEqual(len(st), len(hull.points)) + def test_perimeter_area(self): + poly = Polygon([[0,0],[0,1],[1,1],[1,0]]) + self.assertEqual(poly.perimeter(),4) + self.assertEqual(poly.area(),1) + def test_simple_polygon(self): + poly = Polygon.simple_polygon(Vector.random(300, [1000, 1000])) + points = poly.points + for i in range(0,len(points)): + for j in range(i+2,len(points)): + if j==len(points)-1 and i==0: + continue + a=points[i] + b=points[(i+1)%len(points)] + c=points[j] + d=points[(j+1)%len(points)] + prod=lambda x,y: x[0]*y[1]-x[1]*y[0] + t1=prod([c[0]-a[0],c[1]-a[1]],[d[0]-a[0],d[1]-a[1]])\ + *prod([c[0]-b[0],c[1]-b[1]],[d[0]-b[0],d[1]-b[1]]) + t2=prod([a[0]-c[0],a[1]-c[1]],[b[0]-c[0],b[1]-c[1]])\ + *prod([a[0]-d[0],a[1]-d[1]],[b[0]-d[0],b[1]-d[1]]) + self.assertFalse(t1<=1e-9 and t2<=1e-9) diff --git a/examples/test_polygon.py b/examples/test_polygon.py new file mode 100644 index 0000000..9355788 --- /dev/null +++ b/examples/test_polygon.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python +from cyaron import * +print "random convex hull of size 300:" +hull=Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) +print hull +print "perimeter:" +print hull.perimeter() +print "area:" +print hull.area() +points = Vector.random(300, [1000, 1000]) +print "random simple polygon of size 300:" +poly = Polygon.simple_polygon(points) +print poly +print "perimeter:" +print poly.perimeter() +print "area:" +print poly.area() From 6ea6baa7f57f77cb24e0f125ca83024e86b2880e Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 11:36:33 +0800 Subject: [PATCH 6/7] fixed some bugs --- cyaron/polygon.py | 8 +++++++- cyaron/tests/polygon_test.py | 3 ++- examples/test_geometry.py | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/cyaron/polygon.py b/cyaron/polygon.py index 26a2665..cedff9b 100644 --- a/cyaron/polygon.py +++ b/cyaron/polygon.py @@ -35,6 +35,8 @@ def area(self): ans = ans / 2 return ans + #generate a convex hull with n points + #it's possible to have even edges @staticmethod def convex_hull(n, **kwargs): # fx, fy are functions which map [0,1] to int or float @@ -45,7 +47,7 @@ def convex_hull(n, **kwargs): while len(result) < n: points = [] # about 10 points will be randomized - randomize_prob = sz / 10 + 1 + randomize_prob = int(sz / 10) + 1 if randomize_prob < 10: randomize_prob = 10 for i in range(0, sz): @@ -86,6 +88,7 @@ def convex_hull(n, **kwargs): break st.pop() st.append(points[i]) + st.pop() result = st sz = int(sz * 1.7) + 3 # if failed, increase size and try again ids = [i for i in range(0, len(result))] @@ -101,6 +104,9 @@ def convex_hull(n, **kwargs): def __conquer(points): if len(points) <= 2: return points + if len(points) == 3: + (points[1],points[2])=(points[2],points[1]) + return points divide_id = random.randint(2, len(points) - 1) divide_point1 = points[divide_id] divide_k = random.uniform(0.01, 0.99) diff --git a/cyaron/tests/polygon_test.py b/cyaron/tests/polygon_test.py index d8d9aae..ff621f4 100644 --- a/cyaron/tests/polygon_test.py +++ b/cyaron/tests/polygon_test.py @@ -2,7 +2,7 @@ from cyaron import Polygon,Vector class TestPolygon(unittest.TestCase): def test_convex_hull(self): - hull = Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) + hull = Polygon.convex_hull(300, fx=lambda x:int(x*100000), fy=lambda x:int(x*100000)) points = hull.points points = sorted(points) # unique @@ -33,6 +33,7 @@ def test_convex_hull(self): break st.pop() st.append(points[i]) + st.pop() self.assertEqual(len(st), len(hull.points)) def test_perimeter_area(self): poly = Polygon([[0,0],[0,1],[1,1],[1,0]]) diff --git a/examples/test_geometry.py b/examples/test_geometry.py index 95399e0..f3e4722 100644 --- a/examples/test_geometry.py +++ b/examples/test_geometry.py @@ -1,7 +1,7 @@ #!/usr/bin/env python from cyaron import * print "random convex hull of size 300:" -hull=Polygon.convex_hull(300, fx=lambda x:int(x*1000), fy=lambda x:int(x*1000)) +hull=Polygon.convex_hull(300, fx=lambda x:int(x*100000), fy=lambda x:int(x*100000)) print hull print "perimeter:" print hull.perimeter() From d56b66e8db21d9c0db7e6f5bcbed384a44792846 Mon Sep 17 00:00:00 2001 From: fjzzq2002 Date: Wed, 3 May 2017 11:39:49 +0800 Subject: [PATCH 7/7] delete a file --- examples/test_geometry.py | 17 ----------------- 1 file changed, 17 deletions(-) delete mode 100644 examples/test_geometry.py diff --git a/examples/test_geometry.py b/examples/test_geometry.py deleted file mode 100644 index f3e4722..0000000 --- a/examples/test_geometry.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python -from cyaron import * -print "random convex hull of size 300:" -hull=Polygon.convex_hull(300, fx=lambda x:int(x*100000), fy=lambda x:int(x*100000)) -print hull -print "perimeter:" -print hull.perimeter() -print "area:" -print hull.area() -points = Vector.random(300, [1000, 1000]) -print "random simple polygon of size 300:" -poly = Polygon.simple_polygon(points) -print poly -print "perimeter:" -print poly.perimeter() -print "area:" -print poly.area() \ No newline at end of file