Face* Interface::getFaceNear(QPointF p) { HalfEdge *min = getArestaNear(p); if(isExterna(min->getFace())) min = min->getTwin(); if(dentroFace(min,p)) return min->getFace(); if(isExterna(min->getTwin()->getFace()) || dentroFace(min->getTwin(),p)) return min->getTwin()->getFace(); return NULL; }
void Render::renderizaFaces() { HalfEdge *partida; HalfEdge::iterator it; bool renderizaExterna = false; if(vsel != NULL) partida = vsel->getEdge(); if(hsel != NULL) partida = hsel; if(fsel != NULL) partida = fsel->getHalfEdge(); if(vsel != NULL) { if(interface.isExterna(partida->getFace())) renderizaExterna = true; else renderizaFace(partida, frontBuffer,vizinhoScreen); for(it = partida->v_begin(); it != partida->v_end(); ++it) { if(interface.isExterna(it->getFace())) renderizaExterna = true; else renderizaFace(&it, frontBuffer,vizinhoScreen); } } if(hsel != NULL) { if(interface.isExterna(partida->getFace())) renderizaExterna = true; else renderizaFace(partida, frontBuffer,vizinhoScreen); if(interface.isExterna(partida->getTwin()->getFace())) renderizaExterna = true; else renderizaFace(partida->getTwin(), frontBuffer,vizinhoScreen); } QVector<HalfEdge *> *v; QSet<Face*> f; if(fsel != NULL) { if(interface.isExterna(fsel)) v = &(interface.componentesFaceExterna); else { v = new QVector<HalfEdge *>(); v->push_back(partida->getTwin()); } for(int i = 0; i < v->size(); ++i) { partida = v->at(i)->getTwin(); if(interface.isExterna(partida->getTwin()->getFace())) renderizaExterna = true; else renderizaFace(partida->getTwin(), frontBuffer,vizinhoScreen); for(it = partida->f_begin(); it != partida->f_end(); ++it) { if(interface.isExterna(it->getTwin()->getFace())) renderizaExterna = true; else f.insert(it->getTwin()->getFace()); } } if(!interface.isExterna(fsel)) delete v; QSet<Face*>::iterator jt; for(jt = f.begin(); jt != f.end(); ++jt) renderizaFace((*jt)->getHalfEdge(), frontBuffer,vizinhoScreen); } if(renderizaExterna) renderizaFaceExterna(&vizinhoScreen); }