python 凸包算法

2,456 阅读1分钟

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

png                                                                png

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

这两种都是比较常见的凸包算法,但是也都存在弊端,比如图形如果为不规则图形的话,他不会自动变为凹包,只是以最少点数为凸包点