1.alphashape算法
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: SS
import alphashape
from shapely.geometry import mapping
def get_alpha(points):
alldata = []
alpha_shape = alphashape.alphashape(points, 2.0)
data = mapping(alpha_shape)
for i in data['coordinates']:
for j in i:
alldata.append(list(j))
return alldata
if __name__ == '__main__':
points = [(0., 0.), (0., 1.), (1., 1.), (1., 0.), (0.5, 0.25), (0.5, 0.75), (0.25, 0.5), (0.75, 0.5)]
data = get_alpha(points)
print data
2.andrew
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: SS
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __lt__(self, other):
return self.x < other.x or (self.x == other.x and self.y < other.y)
def cross(x, y, z):
x1 = x.x-y.x
y1 = x.y-y.y
x2 = z.x-y.x
y2 = z.y-y.y
if (x1*y2-x2*y1 <= 0):
return True
return False
def convex_hull(p):
p.sort()
m = 0
n = len(p)
out = [None]*(n+1)
for i in range(n):
while m > 1 and cross(out[m-1], out[m-2], p[i]):
m -= 1
out[m] = p[i]
m += 1
k = m
for i in range(n-2, -1, -1):
while m > k and cross(out[m-1], out[m-2], p[i]):
m -= 1
out[m] = p[i]
m += 1
if n > 1:
m -= 1
return out[0:m]
def main(example):
data = []
points = list(map(lambda x: Point(x[0], x[1]), example))
# points = [Point(22,93),Point(64,44),Point(33,6),Point(22,3),Point(2,43)]
out = convex_hull(points)
for o in out:
data.append([o.x, o.y])
return data
if __name__ == '__main__':
points = [(0., 0.), (0., 1.), (1., 1.), (1., 0.), (0.5, 0.25), (0.5, 0.75), (0.25, 0.5), (0.75, 0.5)]
data = main(points)
print data这两种都是比较常见的凸包算法,但是也都存在弊端,比如图形如果为不规则图形的话,他不会自动变为凹包,只是以最少点数为凸包点