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)
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)
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
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