void Interface::adicionaface(HalfEdge* e, Face* f) { HalfEdge *ori = e; HalfEdge *ant = NULL; HalfEdge *nova = NULL; HalfEdge *first; bool sai = false; nova = new HalfEdge(); nova->setFace(f); nova->setTwin(ori); ori->setTwin(nova); nova->setOrigem(ori->getDestino()); f->setOuterComp(nova); ant = nova; first = nova; ori = ori->getProx(); while(true) { while(ori->getTwin() != NULL) { if(ori == e) { sai = true; break; } ori = ori->getTwin()->getProx(); } if(sai) break; nova = new HalfEdge(); nova->setFace(f); nova->setTwin(ori); ori->setTwin(nova); nova->setProx(ant); ant->setAnt(nova); nova->setOrigem(ori->getDestino()); ori = ori->getProx(); ant = nova; } ori->getTwin()->setProx(ant); ant->setAnt(ori->getTwin()); }
void Interface::addFace(QVector<QPointF> in) { Face *f = new Face(); HalfEdge *ant = NULL; HalfEdge *first, *twin, *temp; for(int i = 0; i < in.size(); i++) { HalfEdge *e = new HalfEdge(); if (i == 0) first = e; temp = findTwin(in[i],in[(i+1)%in.size()]); if (temp != NULL) e = temp; else map[qMakePair(in[i], in[(i+1)%in.size()])] = e; twin = e->getTwin(); if (twin == NULL) twin = findTwin(in[(i+1)%in.size()],in[i]); minX = MIN(minX, in[i].x()); maxX = MAX(maxX, in[i].x()); minY = MIN(minY, in[i].y()); maxY = MAX(maxY, in[i].y()); Vertex *v = addVertex(in[i]); v->setEdge(e); e->setOrigem(v); e->setFace(f); e->setAnt(ant); if (ant!= NULL) { ant->setProx(e); } e->setTwin(twin); if (twin!= NULL) { twin->setTwin(e); } ant = e; } first->setAnt(ant); ant->setProx(first); f->setOuterComp(first); faces.push_back(f); }
Face <T> :: Face ( const Container <Node3DCartesian <T> *, destructable> &nl, Container <HalfEdge <T> *> &hl ) { //Create Face from the list of nodes this->vertices_count = nl.size(); this->edge = NULL; //Nodes list contains some points if ( this->vertices_count > 2 ) { //Create first half edge HalfEdge <T> *h = new HalfEdge <T> ( nl [0], NULL, NULL, NULL ); //Create first edge HalfEdge <T> *h_start = h; hl.push_back ( h ); //Create other half edges HalfEdge <T> *h_old = h; //Process all vertices for ( unsigned int i = 1; i < this->vertices_count; i++, h_old = h ) { //Create new edge and set previous edge h = new HalfEdge <T> ( nl [i], h_old, NULL, NULL ); //Set next edge h_old->setNextEdge ( h ); //Set face for each edge h->setFace ( this ); //Add half edge to the list hl.push_back ( h ); } //Set previous edge of the first edge h_start->setPreviousEdge ( h ); //Set next edge for the last edge h->setNextEdge ( h_start ); //Set face for h start h_start->setFace ( this ); //Set start edge of the Face this->edge = h_start; } }