def create_convex_polygon_by_grekhem(r): p = sort_points_polar(r) c_p = [] for p0 in p: while len(c_p) > 1 and lab1.point_left([c_p[-2], c_p[-1]], p0): c_p.pop() c_p.append(p0) return c_p
def quick_hull(p): r = [] for i in range(len(p) - 1): r.append([]) r[i].append(PointClass.Point.get_x(p[i])) r[i].append(PointClass.Point.get_y(p[i])) xmin = gabarite_polygon.x_min(r) xmax = gabarite_polygon.x_max(r) Sl = [] Sr = [] for i in range(len(r)): # xmin -> xmax left if lab1.point_left([xmin, xmax], r[i]): Sl.append(r[i]) else: if not lab1.point_left([xmin, xmax], r[i]): Sr.append(r[i]) qh_left(Sl, xmin, xmax) qh_right(Sr, xmin, xmax) del hull[-1]
def grekhem(r): p = sort_points_polar(r) c_p = [] res = [] c_pc = c_p.copy() for p0 in p: while len(c_p) > 1 and lab1.point_left([c_p[-2], c_p[-1]], p0): c_p.pop() c_pc = c_p.copy() res.append(c_pc) c_p.append(p0) c_pc = c_p.copy() res.append(c_pc) res[len(res) - 1].append(p[0]) return res
def delone(p): p.sort(key=lambda x: x[0]) t1 = Triangle.Triangle([p[0], p[1], p[2]]) tr.append(t1) tr_arr.append(p[0]) tr_arr.append(p[1]) tr_arr.append(p[2]) is_first = False i_min = 0 i_max = 0 for i in range(len(p) - 1): if not lab1.point_left([p[i], p[i + 1]], p): if is_first: i_max = i + 1 else: is_first = True i_min = i print(i_max, i_min)
def main_1_1(): p = point.create_point() l = line.create_line() print(lab1.point_left(l, p)) draw.draw_point_line(l, p)
def point_in_convex_polygon(p, p0): for i in range(len(p) - 1): if lab1.point_left([p[i], p[i + 1]], p0): return False return True
def dinamic_hull(r, ch): p = ch p.append(r) if len(p) == 0: return [] if len(p) == 1: return p if len(p) == 2: if p[0] == p[1]: return p[0] else: return p if len(p) == 3: if (p[2] == p[0] or p[2] == p[1]) and p[0] != p[1]: return [p[0], p[1]] if p[0] == p[1] == p[2]: return p[0] if (p[0] != p[1] != p[2]) and lab1.point_position([p[0], p[1]], p[2]) == 0: if lab1.vector_mult(p[0], p[1]) * lab1.vector_mult(p[0], p[2]) < 0: return [p[1], p[2]] if lab1.vector_mult(p[2], p[1]) * lab1.vector_mult(p[2], p[0]) < 0: return [p[0], p[1]] if lab1.vector_mult(p[1], p[0]) * lab1.vector_mult(p[1], p[2]) < 0: return [p[0], p[2]] else: if lab1.point_left([p[0], p[1]], p[2]): return [p[0], p[1], p[2]] else: return [p[0], p[2], p[1]] temp = [] is_first = False i_min = 0 i_max = 0 del p[-1] p.append(p[0]) if point_in_pol.point_in_pol(p, r): del p[-1] return p for i in range(len(p)-1): if not lab1.point_left([p[i], p[i+1]], r): if is_first: i_max = i +1 else: is_first = True i_min = i p_c = p.copy() if i_max - i_min>1: for i in range(i_min + 1, i_max): del p[i_min + 1] p.insert(i_min + 1, r) del p[-1] if len(p)==2: del p_c[0] del p_c[-1] pygame.draw.polygon(sc1, colors.BLACK, p_c, 1) p_c = dinamic_hull(r,p_c) return p_c else: return p return p