Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
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]
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
def main_1_1():
    p = point.create_point()
    l = line.create_line()
    print(lab1.point_left(l, p))
    draw.draw_point_line(l, p)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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