/* *删除环中ve1->ve2的一条边,构造一个新环 *@param[in] ve1 顶点1 *@param[in] ve2 顶点2 *@param[in] loop 当前环 *@return 新生成的环 */ Loop* EulerOperator::kemr(Vertex *ve1, Vertex *ve2, Loop *loop) { Half_Edge *he1,*he2; Half_Edge *head = loop->he; while(head->ve1!=ve1 || head->ve2!=ve2) head = head->next; he1 = head; he2 = he1->getAdjacent(); he2->prev->next = he1->next; he1->next->prev = he2->prev; he1->prev->next = he2->next; he2->next->prev = he1->prev; //创建新环 Loop* loop2 = new Loop; loop2->he = he2->prev; he2->prev->loop = loop2; insertLoop(loop->face,loop2); loop->he = he1->prev; he1->prev->loop = loop; delEdge(loop->face->solid,he1->edge); return loop2; }
static void insertLoop( CGBlock *blk,CGBlock *head ){ if( !head->loops.insert( blk ).second ) return; CGBlockIter it; for( it=blk->pred.begin();it!=blk->pred.end();++it ){ insertLoop( *it,head ); } }
void CGFlow::findLoops(){ #ifdef _DEBUG_FLOW cout<<"CGFlow::findLoops() - blocks="<<blocks.size()<<endl; #endif // cout<<"findLoops blocks="<<blocks.size()<<endl; int k; for( k=0;k<blocks.size();++k ){ blocks[k]->dom.clear(); blocks[k]->loops.clear(); blocks[k]->loop_level=0; } if( blocks.size()>1000 ) return; // cout<<"EraseDom"<<endl; for( k=0;k<blocks.size();++k ){ eraseDom( blocks[0],blocks[k] ); } // cout<<"Find back edges"<<endl; //find back edges for( k=0;k<blocks.size();++k ){ CGBlock *blk=blocks[k]; CGBlockIter it; for( it=blk->succ.begin();it!=blk->succ.end();++it ){ CGBlock *head=*it; if( blk->dom.count(head) ) continue; head->loops.insert( head ); insertLoop( blk,head ); } } // cout<<"Creating loop_level"<<endl; //create loop_level for( k=0;k<blocks.size();++k ){ CGBlock *blk=blocks[k]; set<CGBlock*>::iterator it; for( it=blk->loops.begin();it!=blk->loops.end();++it ){ ++(*it)->loop_level; } } }
/* *构造一个体,面,外环,顶点 *@param[in] point 新顶点的位置 *@param[out] solid 新生成的体 *@return 新生成的顶点 */ Vertex* EulerOperator::mvfs(Point point,Solid*& solid) { Solid* solid2 = new Solid; Face* face = new Face; Loop* loop = new Loop; Vertex* vertex = new Vertex; vertex->point = point; loop->he = NULL; insertFace(solid2,face); insertLoop(face,loop); insertSolid(solid,solid2); return vertex; }
/* *构造顶点ve1到ve2的一条边,同时构造一个新面 *注意当前loop的走向变为ve1->ve2,新面loop的走向为ve2->ve1 *@param[in] ve1 顶点1 *@param[in] ve2 顶点2 *@param[in] loop 当前环 *@return 新生成的面 */ Face* EulerOperator::mef(Vertex* ve1,Vertex* ve2,Loop* loop) { Edge* edge = makeEdge(ve1,ve2); Half_Edge* he1 = edge->he1; Half_Edge* he2 = edge->he2; //创建新环 Loop* loop2 = new Loop; Half_Edge *tmpHe1,*tmpHe2; Half_Edge* he = loop->he; while(he->ve1!=ve1) he=he->next; tmpHe1 = he; while(he->ve1!=ve2) he=he->next; tmpHe2 = he; tmpHe1->prev->next = he1; he1->prev = tmpHe1->prev; he2->next = tmpHe1; tmpHe1->prev = he2; tmpHe2->prev->next = he2; he2->prev = tmpHe2->prev; he1->next = tmpHe2; tmpHe2->prev = he1; loop->he = he1; he1->loop = loop; loop2->he = he2; he2->loop = loop2; //创建新面 Face* face = new Face; Solid* solid = loop->face->solid; insertEdge(solid,edge); insertFace(solid,face); insertLoop(face,loop2); return face; }
/* *删除innerLoop指向的面,将其变成outerLoop指向面的内环 *@param[in] outerLoop 接收删除面的外环 *@param[in] innerLoop 要删除面所在的外环 */ void EulerOperator::kfmrh(Loop* outerLoop,Loop* innerLoop) { delFace(innerLoop->face->solid,innerLoop->face); insertLoop(outerLoop->face,innerLoop); }