def Brute (l): "Algoritmo forca bruta para encontrar o par de pontos mais proximo" if len (l) < 2: return None closest = float("inf") a = b = None id = None for i in range (len(l)): for j in range (i + 1, len (l)): dist = dist2 (l[i], l[j]) if dist < closest: control.freeze_update () if a != None: a.unhilight (hia) if b != None: b.unhilight (hib) if id != None: control.plot_delete (id) closest = dist a = l[i] b = l[j] hia = a.hilight () hib = b.hilight () id = a.lineto (b) control.thaw_update() control.update () a.hilight('green') b.hilight('green') ret = Segment (a, b) ret.extra_info = 'distancia: %.2f'%math.sqrt (dist2 (a, b)) print(math.sqrt (dist2 (a, b))) return ret
def Brute (l): "Algoritmo forca bruta para encontrar o par de pontos mais distante" if len (l) < 2: return None farthest = 0 a = b = None id = None for i in range (len(l)): for j in range (i + 1, len (l)): dist = dist2 (l[i], l[j]) if dist > farthest: control.freeze_update () if a != None: a.unhilight (hia) if b != None: b.unhilight (hib) if id != None: control.plot_delete (id) farthest = dist a = l[i] b = l[j] hia = a.hilight () hib = b.hilight () id = a.lineto (b) control.thaw_update () control.update () ret = Segment (a, b) ret.extra_info = 'distancia: %.2f'%math.sqrt (dist2 (a, b)) return ret
def Diameter (l): """Algoritmo Diametro para encontrar o par de pontos mais distantes Ele consiste de: - determinar o fecho convexo dos pontos passados - determinar o conjunto de pares antipodas do fecho convexo - determinar o par antipoda cujos pontos estao a uma distancia maxima """ if len (l) < 2: return None if len (l) == 2: ret = Segment (l[0], l[1]) ret.extra_info = 'distancia: %.2f'%math.sqrt (dist2 (l[0], l[1])) return ret ch = Graham (l) ch.hide () ch.plot (config.COLOR_ALT4) control.sleep () pairs = antipodes (ch) cores = (config.COLOR_ALT1,) #print `pairs` i=0 for p,q in pairs: p.hilight (cores[i]) q.hilight (cores[i]) p.lineto (q, cores[i]) i = (i+1) % len (cores) control.sleep () farthest = dist2 (pairs[0][0], pairs[0][1]) a = pairs[0][0] b = pairs[0][1] hia = a.hilight () hib = b.hilight () id = a.lineto (b) for i in range (1, len (pairs)): dist = dist2 (pairs[i][0], pairs[i][1]) if dist > farthest: control.freeze_update () a.unhilight (hia) b.unhilight (hib) control.plot_delete (id) farthest = dist a = pairs[i][0] b = pairs[i][1] hia = a.hilight () hib = b.hilight () id = a.lineto (b) control.thaw_update () ret = Segment (a, b) ret.extra_info = 'distancia: %.2f'%math.sqrt (farthest) return ret
def Diameter(l): """Algoritmo Diametro para encontrar o par de pontos mais distantes Ele consiste de: - determinar o fecho convexo dos pontos passados - determinar o conjunto de pares antipodas do fecho convexo - determinar o par antipoda cujos pontos estao a uma distancia maxima """ if len(l) < 2: return None if len(l) == 2: ret = Segment(l[0], l[1]) ret.extra_info = 'distancia: %.2f' % math.sqrt(dist2(l[0], l[1])) return ret ch = Graham(l) ch.hide() ch.plot(config.COLOR_ALT4) control.sleep() pairs = antipodes(ch) cores = (config.COLOR_ALT1, ) #print `pairs` i = 0 for p, q in pairs: p.hilight(cores[i]) q.hilight(cores[i]) p.lineto(q, cores[i]) i = (i + 1) % len(cores) control.sleep() farthest = dist2(pairs[0][0], pairs[0][1]) a = pairs[0][0] b = pairs[0][1] hia = a.hilight() hib = b.hilight() id = a.lineto(b) for i in range(1, len(pairs)): dist = dist2(pairs[i][0], pairs[i][1]) if dist > farthest: control.freeze_update() a.unhilight(hia) b.unhilight(hib) control.plot_delete(id) farthest = dist a = pairs[i][0] b = pairs[i][1] hia = a.hilight() hib = b.hilight() id = a.lineto(b) control.thaw_update() ret = Segment(a, b) ret.extra_info = 'distancia: %.2f' % math.sqrt(farthest) return ret
def shamos_hoey(segmentos, estrutura): global cores if len(segmentos) == 0: return None # Abaixo, redefinimos as funcoes de comparacao de segmentos para nosso proposito Segment.__lt__ = lambda s1, s2: prim.compara_segmentos(x_linha_varredura, s1, s2) == -1 Segment.__ge__ = lambda s1, s2: prim.compara_segmentos(x_linha_varredura, s1, s2) >= 0 E = [] # inicializa fila de eventos for i, segmento in enumerate(segmentos): # se e_x > d_x, entao inverte os pontos que determinam o segmento # (pontos da esquerda nao podem ter x-coordenada maior que pontos da direita) if (segmento.init.x > segmento.to.x): segmento.reverse() # tambem inverte se for segmento vertical com inicio (init) com menor y-coordenada do que fim (to) elif (segmento.init.x == segmento.to.x and segmento.init.y < segmento.to.y): segmento.reverse() segmento.id = i segmento.intersected = False # coloca na fila de eventos E E.append(PontoEvento(segmento.init, 'esquerdo', i)) E.append(PontoEvento(segmento.to, 'direito', i)) E.sort() # ordena pontos eventos por x-coordenada global x_linha_varredura pred,suc = None, None for ponto_evento in E: x_linha_varredura = ponto_evento.ponto.x #Remove o destaque da iteracao passada destaca_segs( [pred, suc], 'presente') seg = segmentos[ponto_evento.id_segmento] pred = estrutura.predecessor(seg) suc = estrutura.sucessor(seg) #Destaca os segmentos que serao analisados destaca_segs( [pred, suc], 'vizinho') if ponto_evento.tipo == 'esquerdo': destaca_segs([seg], 'presente') estrutura.insere(seg) if pred != None: if prim.inter(seg,pred) == True: # Detectou interseccao do seg com o pred destaca_segs([seg,pred], 'intersectado') seg.intersected, pred.intersected = True, True break if suc != None: if prim.inter(seg,suc) == True: # Detectou interseccao do seg com o suc destaca_segs([seg,suc], 'intersectado') seg.intersected, suc.intersected = True, True break elif ponto_evento.tipo == 'direito': destaca_segs([seg], 'passado') estrutura.remove(seg) if (pred != None and suc != None): if prim.inter(pred,suc) == True: # Detectou interseccao do pred com o suc destaca_segs([pred,suc], 'intersectado') pred.intersected, suc.intersected = True, True break linha_varredura_plotada_id = control.gui.plot_vert_line (x_linha_varredura, config.COLOR_LINE_SPECIAL, 1) # plota a linha de varredura control.sleep() # dorme control.gui.plot_delete(linha_varredura_plotada_id) # desplota a linha de varredura if estrutura.__class__.__name__ == 'Skiplist': ret = Segment() # pequeno hack, porque resolvemos um problema de decisão, e não temos nada (nenhum polígono, por exemplo) para retornar # e para o algoritmo de Skip List queremos devolver essa informacao extra abaixo ret.extra_info = 'SL: p = ' + str(estrutura.p) + ' nivelmax = ' + str(estrutura.maxnivel) + ' (media de niveis = ' + str( (estrutura.somaniveis / (2*len(segmentos)))) + ')' return ret