Пример #1
0
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
Пример #2
0
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
Пример #4
0
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