コード例 #1
0
ファイル: EulerOperator.cpp プロジェクト: feiqian/BrepProject
/*
 *删除环中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;
}
コード例 #2
0
ファイル: cgflow.cpp プロジェクト: STLVNUB/blitzmax
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 );
	}
}
コード例 #3
0
ファイル: cgflow.cpp プロジェクト: STLVNUB/blitzmax
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;
		}
	}
}
コード例 #4
0
ファイル: EulerOperator.cpp プロジェクト: feiqian/BrepProject
/*
 *构造一个体,面,外环,顶点
 *@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;
}
コード例 #5
0
ファイル: EulerOperator.cpp プロジェクト: feiqian/BrepProject
/*
 *构造顶点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;
}
コード例 #6
0
ファイル: EulerOperator.cpp プロジェクト: feiqian/BrepProject
/*
 *删除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);
}