def particione (P, l, r): # P[l + 1] recebe ponto extremo for i in range(l + 1, r): P[i].lineto(P[l], "gray") P[i].lineto(P[r], "gray") sleep() P[i].remove_lineto(P[l]) P[i].remove_lineto(P[r]) if abs(area2(P[i], P[l], P[r])) > abs(area2(P[l + 1], P[l], P[r])): P[i], P[l + 1] = P[l + 1], P[i] # Desenha o triangulo if hasattr(P[l + 1], 'hi'): P[l + 1].unhilight() P[l + 1].hilight("firebrick") linha_esq = P[l].lineto(P[l + 1], "green") linha_dir = P[r].lineto(P[l + 1], "red") sleep() p = q = r for k in range(r - 1, l + 1, -1): if hasattr(P[k], 'hi'): P[k].unhilight() P[k].hilight("yellow") sleep() P[k].unhilight() if left (P[l], P[l + 1], P[k]): # ponto da partição esquerda (verde) p -= 1 P[p], P[k] = P[k], P[p] P[p].hilight("green") sleep() elif right (P[r], P[l + 1], P[k]): # ponto da partição direita (vermelho) p -= 1 q -= 1 P[q], P[k] = P[k], P[q] if p != q: P[p], P[k] = P[k], P[p] P[q].hilight("red") sleep() # Ajustes finais no vetor p -= 1 q -= 1 P[q], P[l + 1] = P[l + 1], P[q] if p != q: P[p], P[l + 1] = P[l + 1], P[p] p -= 1 P[l], P[p] = P[p], P[l] return p, q, linha_esq, linha_dir
def extreme_point(points, start, end): area = -1.0 ind = -1 for i in range(start + 1, end): n_area = prim.area2(points[start], points[end], points[i]) if area < n_area: ind = i area = n_area return ind
def __gt__ (self, other): ref = other.ref # Se o ponto de referencia é uma interseção, if abs(area2 (self.seg.init, self.seg.to, ref)) < eps: # O ponto de referência vai ser o ponto da direita ref = other.seg.to # Self > other <=> other está a esquerda do self return left (self.seg.init, self.seg.to, ref)
def area2 (a, b, c): "retorna duas vezes a area do triangulo abc" ret = prim.area2 (a, b, c) triang (a, b, c) return ret
def area2(a, b, c): "retorna duas vezes a area do triangulo abc" ret = prim.area2(a, b, c) triang(a, b, c) return ret
def area(a, b, c): '''Devolve a área do triângulo cujos extremos são os pontos a, b, c.''' return abs(area2(a, b, c) / 2.0)