void Clipping::clippingPoligonoFechado(Poligono* poligono) { list<Coordenada*> *poligonoVertices = getPoligonoLista(poligono); if(poligonoVertices->size() > poligono->getCPPCoordenadas()->size()){ list<Coordenada*> *windowVertices = getWindowLista(poligonoVertices); list<Coordenada*> *novosVertices = new list<Coordenada*>(); list<Coordenada*>::iterator it = poligonoVertices->begin(); Coordenada* first = NULL; while (true) { Coordenada *atual = (*it); if(atual == first) return; it = ListUtils::incrementIteratorCircular(poligonoVertices, it); if (!atual->isVisitado() && atual->isInterseccao() && CoordenadaUtils::isDentroWindow(*it, window)) { if(!first) first = atual; atual->setVisitado(true); novosVertices->push_back(atual); percorrerLista(poligonoVertices, windowVertices, novosVertices, ListUtils::getIteratorInObject(poligonoVertices, atual)); Poligono *poligonoNovo = poligono->clone(); poligonoNovo->setCPPCoordenadas(novosVertices); window->addWindowObjeto(poligonoNovo); novosVertices = new list<Coordenada* >(); } } delete novosVertices; ListUtils::destroyListByCondition(windowVertices, CoordenadaUtils::notVisitado); }else window->addWindowObjeto(poligono->clone()); ListUtils::destroyListByCondition(poligonoVertices, CoordenadaUtils::notVisitado); }
void percorrerTabelaHash(Hash *hash_, int m) { int i; printf("Tabela HASH:\n"); for(i = 0; i < m; i++) { printf("[%d] ", i); if(hash_[i].lista != NULL) { percorrerLista(hash_[i].lista); } else { printf("NULL\n"); } } }
void Clipping::percorrerLista(list<Coordenada* >* followList, list<Coordenada*>* goList, list<Coordenada*>* novaLista, _List_iterator<Coordenada*> it){ while(true){ it = ListUtils::incrementIteratorCircular(followList, it); if(!(*it)->isVisitado()){ (*it)->setVisitado(true); novaLista->push_back(*it); if((*it)->isInterseccao()){ percorrerLista(goList, followList, novaLista, ListUtils::getIteratorInObject(goList, *it)); return; } }else return; } }