Ejemplo n.º 1
0
	def subHull(self, puntoA, puntoB, listaVertices):
		""" Calcula el punto de listaVertices mas lejano a la recta 
		formada por A y B, y divide el conjunto de vertices dependiendo 
		de si los puntos estan por encima de la recta formada por A y C
		o por encima de la recta formada por B y C, introduce C
		en la envolvente y busca mas puntos de la envolvente en los 
		subconjuntos formados.

		Parametros:
			puntoA y puntoB: puntos mediante los cuales calcularemos el
				siguiente punto de la envolvente y los siguientes
				subconjuntos.
			listaVertices: lista con los vertices de los cuales queremos
				hayar la envolvente.
		"""
		if(len(listaVertices) != 0):
			puntoC = listaVertices.pop(
				self.puntoMasLejano(puntoA, puntoB, listaVertices))

			# Funcion para mostrar el segmento AB y puntoC en el programa
			lado = visualizarQuickHull.muestraLado(
						puntoA, puntoB, self.posicionInicial)
			time.sleep(TIEMPO)
			visualizarQuickHull.muestraPunto(puntoC, self.posicionInicial)
			time.sleep(TIEMPO)
			visualizarQuickHull.borraObjeto(lado)

			subListaA = self.dividePuntos(puntoA, puntoC, listaVertices)
			subListaB = self.dividePuntos(puntoC, puntoB, listaVertices)

			self.subHull(puntoA, puntoC, subListaA)
			self.envolvente.append(puntoC)
			self.subHull(puntoC, puntoB, subListaB)
Ejemplo n.º 2
0
    def subHull(self, puntoA, puntoB, listaVertices):
        """ Calcula el punto de listaVertices mas lejano a la recta 
		formada por A y B, y divide el conjunto de vertices dependiendo 
		de si los puntos estan por encima de la recta formada por A y C
		o por encima de la recta formada por B y C, introduce C
		en la envolvente y busca mas puntos de la envolvente en los 
		subconjuntos formados.

		Parametros:
			puntoA y puntoB: puntos mediante los cuales calcularemos el
				siguiente punto de la envolvente y los siguientes
				subconjuntos.
			listaVertices: lista con los vertices de los cuales queremos
				hayar la envolvente.
		"""
        if (len(listaVertices) != 0):
            puntoC = listaVertices.pop(
                self.puntoMasLejano(puntoA, puntoB, listaVertices))

            # Funcion para mostrar el segmento AB y puntoC en el programa
            lado = visualizarQuickHull.muestraLado(puntoA, puntoB,
                                                   self.posicionInicial)
            time.sleep(TIEMPO)
            visualizarQuickHull.muestraPunto(puntoC, self.posicionInicial)
            time.sleep(TIEMPO)
            visualizarQuickHull.borraObjeto(lado)

            subListaA = self.dividePuntos(puntoA, puntoC, listaVertices)
            subListaB = self.dividePuntos(puntoC, puntoB, listaVertices)

            self.subHull(puntoA, puntoC, subListaA)
            self.envolvente.append(puntoC)
            self.subHull(puntoC, puntoB, subListaB)
Ejemplo n.º 3
0
	def quickHull(self, listaVertices):
		""" Inicio del algoritmo QuickHull: divide el conjunto de puntos 
		en dos subconjuntos dependiendo de si estan por encima o por 
		debajo de la recta formada por el minimo y el maximo punto en 
		el eje X y los introduce en la envolvente, despues busca mas
		puntos de la envolvente en los subconjuntos formados mediante
		subHull. Finalmente retorna la envolvente.

		Solo se ejeuta el algoritmo, si listaVertices tiene mas de tres
		vertices, si tiene tres o menos, ya se sabe que esos puntos
		estan dentro de la envolvente.

		Parametros:
			listaVertices: lista con los vertices de los cuales queremos
				hayar la envolvente.
		"""
		if(len(listaVertices) > 3):
			puntoA = listaVertices.pop(self.minimo(listaVertices, EJE_X))
			puntoB = listaVertices.pop(self.maximo(listaVertices, EJE_X))

			# Funciones para mostrar puntoA y puntoB en el programa
			visualizarQuickHull.muestraPunto(puntoA, self.posicionInicial)
			time.sleep(TIEMPO)
			visualizarQuickHull.muestraPunto(puntoB, self.posicionInicial)
			time.sleep(TIEMPO)

			subListaA = self.dividePuntos(puntoA, puntoB, listaVertices)
			subListaB = self.dividePuntos(puntoB, puntoA, listaVertices)

			self.envolvente.append(puntoA)
			self.subHull(puntoA, puntoB, subListaA)
			self.envolvente.append(puntoB)
			self.subHull(puntoB, puntoA, subListaB)
		else:
			self.envolvente = listaVertices
		return self.envolvente
Ejemplo n.º 4
0
    def quickHull(self, listaVertices):
        """ Inicio del algoritmo QuickHull: divide el conjunto de puntos 
		en dos subconjuntos dependiendo de si estan por encima o por 
		debajo de la recta formada por el minimo y el maximo punto en 
		el eje X y los introduce en la envolvente, despues busca mas
		puntos de la envolvente en los subconjuntos formados mediante
		subHull. Finalmente retorna la envolvente.

		Solo se ejeuta el algoritmo, si listaVertices tiene mas de tres
		vertices, si tiene tres o menos, ya se sabe que esos puntos
		estan dentro de la envolvente.

		Parametros:
			listaVertices: lista con los vertices de los cuales queremos
				hayar la envolvente.
		"""
        if (len(listaVertices) > 3):
            puntoA = listaVertices.pop(self.minimo(listaVertices, EJE_X))
            puntoB = listaVertices.pop(self.maximo(listaVertices, EJE_X))

            # Funciones para mostrar puntoA y puntoB en el programa
            visualizarQuickHull.muestraPunto(puntoA, self.posicionInicial)
            time.sleep(TIEMPO)
            visualizarQuickHull.muestraPunto(puntoB, self.posicionInicial)
            time.sleep(TIEMPO)

            subListaA = self.dividePuntos(puntoA, puntoB, listaVertices)
            subListaB = self.dividePuntos(puntoB, puntoA, listaVertices)

            self.envolvente.append(puntoA)
            self.subHull(puntoA, puntoB, subListaA)
            self.envolvente.append(puntoB)
            self.subHull(puntoB, puntoA, subListaB)
        else:
            self.envolvente = listaVertices
        return self.envolvente