''' Adapted from http://stackoverflow.com/a/1881201/1956065 and http://stackoverflow.com/a/25304159/1956065 12 January 2017 John J Czaplewski john@czaplewski.org ''' def xProduct(v0, v1, v2): dx1 = v1[0] - v0[0] dy1 = v1[1] - v0[1] dx2 = v2[0] - v1[0] dy2 = v2[1] - v1[1] return (dx1 * dy2) - (dy1 * dx2) # polygon - [ [x, y], [x, y], ... ] def isConvex(polygon): sign = False for idx, vertex0 in enumerate(polygon): if idx + 2 > (len(polygon) - 1): break vertex1 = polygon[idx + 1] vertex2 = polygon[idx + 2] xproduct = xProduct(vertex0, vertex1, vertex2) if idx == 0: sign = xproduct > 0 elif sign != (xproduct > 0): return False # Use the ends xproduct = xProduct(polygon[len(polygon) - 3], polygon[len(polygon) - 2],polygon[0]) if sign != (xproduct > 0): return False xproduct = xProduct(polygon[len(polygon) - 2], polygon[0],polygon[1]) if sign != (xproduct > 0): return False return True