Exemple #1
0
/**
 * 使用分离轴法检查矩形是否相交
 */
bool Range::collideRange(const Range& range) const
{
    CCPoint one[4]={CCPointZero};
    
    one[0].x=tr.x-tl.x;
    one[0].y=tr.y-tl.y;
    one[1].x=br.x-tr.x;
    one[1].y=br.y-tr.y;
    one[2].x=bl.x-br.x;
    one[2].y=bl.y-br.y;
    one[3].x=tl.x-bl.x;
    one[3].y=tl.y-bl.y;
    
    CCPoint other[4]={CCPointZero};
    other[0].x=range.tr.x-range.tl.x;
    other[0].y=range.tr.y-range.tl.y;
    other[1].x=range.br.x-range.tr.x;
    other[1].y=range.br.y-range.tr.y;
    other[2].x=range.bl.x-range.br.x;
    other[2].y=range.bl.y-range.br.y;
    other[3].x=range.tl.x-range.bl.x;
    other[3].y=range.tl.y-range.bl.y;
    
    //检查以自己的边的轴的投影是否重合
    
    if (!checkEdge(tl,tr,*this,range)) {
        return false;
    }
    
    if (!checkEdge(tr,br,*this,range)) {
        return false;
    }
    
    if (!checkEdge(br,bl,*this,range)) {
        return false;
    }
    if (!checkEdge(bl,tl,*this,range)) {
        return false;
    }
    
    //检查以对方的边的轴的投影是否重合
    
    if (!checkEdge(range.tl,range.tr,*this,range)) {
        return false;
    }
    
    if (!checkEdge(range.tr,range.br,*this,range)) {
        return false;
    }
    
    if (!checkEdge(range.br,range.bl,*this,range)) {
        return false;
    }
    if (!checkEdge(range.bl,range.tl,*this,range)) {
        return false;
    }
    
    return true;
}
SplitResult BaseUkkonen::testAndSplit(Node* node, int begin, int end, string symbol)
{
    if (end <= begin)
    {
        if ( ( node->edges.find(symbol) == node->edges.end() ) && (node != dummy) )
            return make_pair(false, node);
        else
            return make_pair(true, node);
    }
    else
    {
        Node* current = checkEdge(node, parser->getWord(begin));

        string temp = parser->getWord(current->begin + end - begin);
        if (symbol == temp)
        {
            return make_pair(true, node);
        }

        Node* newNode = new Node(node);
        current->parent = newNode;

        link(node, current->begin, current->begin + end - begin, newNode);
        link(newNode, current->begin + end - begin, current->end, current);

        return make_pair(false, newNode);
    }
}
    bool Model::checkEdge(Vertex base, Vertex start, Vertex begin, Vertex last,
	    std::map<unsigned int, bool> checked)
    {
	// Get a vertex that is both a neighbor of base and start and different than last
	for (auto it = start.neighbors.begin(); it != start.neighbors.end(); ++it)
	{
	    // If the neighbors neighbor is the beginning but not the one we just came from
	    // then there is a way of circling base through their neighbors
	    if(*it == begin.id && *it != last.id)
		return false;
	    // If the neighbor has already been used don't use it again
	    if(checked[*it])
		continue;
	    for (auto it2 = base.neighbors.begin(); it2 != base.neighbors.end(); ++it2)
	    {
		if (*it == *it2)
		{
		    // Found a match
		    checked[*it] = true;
		    // Check the next vertex
		    bool isEdge = checkEdge(base, m_vertices[*it], begin, start, checked);
		    // If checkEdge returns true there might still be a different "path" to prove
		    // that it's no edge, thus we continue iterating
		    if (!isEdge)
			return false;
		}
	    }
	}
	// If we get here the algorithm has not found a proper way
	return true;
    }
    bool Model::checkEdge(Vertex base, Vertex start)
    {
	std::map<unsigned int, bool> checked;
	for(auto neighbor : base.neighbors)
	    checked[neighbor] = false;
	checked[start.id] = true;
	return checkEdge(base, start, start, start, checked);
    }
Exemple #5
0
 std::string operator ()(const std::string &s)
 {
     std::size_t curr = start;
     for(std::string::size_type i = 0; i < s.size(); ++i)
     {
         if(!checkEdge(curr, s[i]))
             return MakeString() << "0" << "\n" << i << "\n" << GET_STR(curr);
         curr = M[curr][s[i]];
     }
     return MakeString() << (S.count(curr) ? "1" : "0") << "\n" << s.size() << "\n" << GET_STR(curr);
 }
ActivePoint BaseUkkonen::canonize(Node* node, int begin, int end)
{
    if (end <= begin)
    {
        return make_pair(node, begin);
    }
    else
    {
        Node* current = checkEdge(node, parser->getWord(begin));

        while (end - begin >= current->end - current->begin)
        {
            begin += current->end - current->begin;
            
            node = current;

            if ( end > begin)
            {
                current = checkEdge(node, parser->getWord(begin));
            }
        }
        return make_pair(node, begin);
    }
}
Exemple #7
0
void Ball::update(sf::Time& dt){
	checkEdge();
	
	if(_atTop){
		_atTop = false;
		_yVel = -_yVel;
	}
	
	if(_atSide){
		_atSide = false;
		_xVel = -_xVel;
	}
	
	float deltaX = dt.asSeconds() * _xVel;
	float deltaY = dt.asSeconds() * _yVel;
	
	_ball.move(deltaX, deltaY);	
	
	//Accelerate the ball
	
	if(abs(_xVel) < 500){
		if(_xVel >= 0){
			_xVel += dt.asSeconds() * _accel;	
		}
	
		if(_xVel < 0){
			_xVel -= dt.asSeconds() * _accel;	
		}

		if(_yVel >= 0){
			_yVel += dt.asSeconds() * _accel;	
		}

		if(_yVel < 0){
			_yVel -= dt.asSeconds() * _accel;	
		}
	}
}
void VoronoiShatter::getVDFormDT(){

	//VD's vertex:  DT's tetra, center of the sphere
	//VD's edge:  2 VD's vertex with the same DT's face
	//VD's face:  tetra which share DT's edge
	//VD's poly:  share DT's vertex
	std::cerr<<"START!!!!!!!!!!!!!!11: "<< std::endl;	
	int counter = 0;
	int currentKey = 0;
	int flag = 0;
	int first_vertex_flag = 0;
			int previousTetraKey = 0;
			int nextTetraKey = 0;
			int firstTetraKey = 0;
			int nowVertexId = 0;
			bool still_has_edge=true;
	Tetrahedron t;
	//VoronoiShatter voronoiShatter;
	//TetraMap pool = voronoiShatter.getPool();
	TetraMap pool = tetraPool;
	TetraMapItr itr = pool.begin();

	for( ; itr!=pool.end(); itr++){
		// get tetrahedront
		t = itr->second;
	
		// put all verteces to set, not include big tetra's vertecies
		if( t.v1 != bigTetra .v1 && t.v1 != bigTetra .v2 && t.v1 !=bigTetra .v3 && t.v1 != bigTetra .v4)
			vertexSet.insert(t.v1);
		if( t.v2 != bigTetra .v1 && t.v2 != bigTetra .v2 && t.v2 !=bigTetra .v3 && t.v2 != bigTetra .v4)
			vertexSet.insert(t.v2);
		if( t.v3 != bigTetra .v1 && t.v3 != bigTetra .v2 && t.v3 !=bigTetra .v3 && t.v3 != bigTetra .v4)
			vertexSet.insert(t.v3);
		if( t.v4 != bigTetra .v1 && t.v4 != bigTetra .v2 && t.v4 !=bigTetra .v3 && t.v4 != bigTetra .v4)
			vertexSet.insert(t.v4);
	}


	Tetrahedron originalTetra;

	
	while( !vertexSet.empty() )
	{
		first_vertex_flag = 0;
		// not sure
		// choose one vertex p
		checkVertex = vertexSet.begin();	

		// if no tetra contains p
		if( getTetra(checkVertex->incidentTetra, originalTetra)  ==false){
			vertexSet.erase(checkVertex);
			continue;
		}
			
		// tetra contains p
		inSetEdge e1;
		inSetEdge e2;
		inSetEdge e3;

		// push the edge to stack
		if(*checkVertex == originalTetra.v1){
			std::cerr<<"AAA: "<< std::endl;	
			e1.startVertex = originalTetra.v1;
			e1.endVertex = originalTetra.v2;
			e1.key = originalTetra.key;

			e2.startVertex = originalTetra.v1;
			e2.endVertex = originalTetra.v3;
			e2.key = originalTetra.key;

			e3.startVertex = originalTetra.v1;
			e3.endVertex = originalTetra.v4;
			e3.key = originalTetra.key;

			edgeSet.insert(e1);
			edgeSet.insert(e2);
			edgeSet.insert(e3);
		}
		else if(*checkVertex == originalTetra.v2){
			std::cerr<<"BBB: "<< std::endl;	
			e1.startVertex = originalTetra.v2;
			e1.endVertex = originalTetra.v1;
			e1.key = originalTetra.key;

			e2.startVertex = originalTetra.v2;
			e2.endVertex = originalTetra.v3;
			e2.key = originalTetra.key;

			e3.startVertex = originalTetra.v2;
			e3.endVertex = originalTetra.v4;
			e3.key = originalTetra.key;

			edgeSet.insert(e1);
			edgeSet.insert(e2);
			edgeSet.insert(e3);
		}
		else if(*checkVertex == originalTetra.v3){
			std::cerr<<"CCC: "<< std::endl;	
			e1.startVertex = originalTetra.v3;
			e1.endVertex = originalTetra.v1;
			e1.key = originalTetra.key;

			e2.startVertex = originalTetra.v3;
			e2.endVertex = originalTetra.v2;
			e2.key = originalTetra.key;

			e3.startVertex = originalTetra.v3;
			e3.endVertex = originalTetra.v4;
			e3.key = originalTetra.key;

			edgeSet.insert(e1);
			edgeSet.insert(e2);
			edgeSet.insert(e3);
		}
		else if(*checkVertex == originalTetra.v4){
			std::cerr<<"DDD: "<< std::endl;	
			e1.startVertex = originalTetra.v4;
			e1.endVertex = originalTetra.v1;
			e1.key = originalTetra.key;
			std::cerr<<"DDD - e1.key: "<<e1.key<< std::endl;	

			e2.startVertex = originalTetra.v4;
			e2.endVertex = originalTetra.v2;
			e2.key = originalTetra.key;
			std::cerr<<"DDD - e2.key: "<<e2.key<< std::endl;	

			e3.startVertex = originalTetra.v4;
			e3.endVertex = originalTetra.v3;
			e3.key = originalTetra.key;
			std::cerr<<"DDD - e3.key: "<<e3.key<< std::endl;	

			edgeSet.insert(e1);
			edgeSet.insert(e2);
			edgeSet.insert(e3);
		}


		int vdEdgeTag = 0;
		int vdFaceTag = 0;
		VDfaceIndex.push_back(0);
		VDpolyIndex.push_back(0);

		// choose first edge
	//	currentEdgeItr = edgeSet.begin();
		bool hasNeighbor =true;


		still_has_edge = true;
		flag=0;
		inSetEdge usedEdge;
		int cou=0;
		while( still_has_edge==true  )
	//	for( currentEdgeItr; currentEdgeItr!=edgeSet.end(); currentEdgeItr++ )  //while haven't choosen the last edge
	//	for( ; currentEdgeItr!=edgeSet.end(); currentEdgeItr++ )  //while haven't choosen the last edge
		{


	//		if(still_has_edge==false)
	//			break;
			//choose one edge, from first to compare used set
	if(flag==0 || flag==3 ){
			currentEdgeItr = edgeSet.begin();			
			usedEdge.startVertex = currentEdgeItr->startVertex;
			usedEdge.endVertex = currentEdgeItr->endVertex;
			usedEdge.key = currentEdgeItr->key;
	
	}
	
	if(flag!=1 && flag!=4)
	{
		if(usedEdgeSet.size()!=edgeSet.size()-1)
		{

			while( usedEdgeSet.count(usedEdge)!=0   )
			{		
					currentEdgeItr++;
					usedEdge.startVertex = currentEdgeItr->startVertex;
					usedEdge.endVertex = currentEdgeItr->endVertex;
					usedEdge.key = currentEdgeItr->key;
			}
		}
		else
		{
					usedEdge.startVertex = currentEdgeItr->startVertex;
					usedEdge.endVertex = currentEdgeItr->endVertex;
					usedEdge.key = currentEdgeItr->key;
					flag=4;
					cou=0;
								previousTetraKey = 0;
			nextTetraKey = 0;
			firstTetraKey = 0;
			
			
			// find the edge from which tetra
			currentKey = currentEdgeItr->key; 
		first_vertex_flag = 0;
			firstTetraKey = currentEdgeItr->key;
		}
				
	}
		

			usedEdgeSet.insert(usedEdge);

			std::cerr<<"setEdgeSize: "<< edgeSet.size()<<std::endl;

			// choose one edge E
	//		inSetEdge currentEdge;
	//		currentEdge = edgeSet.top();
			hasNeighbor = true;
			
	
	

			if(flag!=1 && flag!=4){
			previousTetraKey = 0;
			nextTetraKey = 0;
			firstTetraKey = 0;
			
			
			// find the edge from which tetra
			currentKey = currentEdgeItr->key; 
	//		first_vertex_flag = 0;
			firstTetraKey = currentEdgeItr->key;
			}

			Tetrahedron currentTetra;
						
			while( hasNeighbor )
			{

						counter++;
				std::cerr<<"counter: "<< counter<<std::endl;	
				std::cerr<<"currentKey - StartAAA: "<< currentKey<<std::endl;	
				// get current tetra
				if( !getTetra( currentKey, currentTetra) ){
					//continue;
					break;
				}
				std::cerr<<"currentKey - StartBBB: "<< currentKey<<std::endl;	


						// tetra contains p
						inSetEdge ed1;
						inSetEdge ed2;
						inSetEdge ed3;
					// push the edge to stack
				if(*checkVertex == currentTetra.v1)
				{
					std::cerr<<"EEE: "<< std::endl;	
					ed1.startVertex = currentTetra.v1;
					ed1.endVertex = currentTetra.v2;
			//		findEdge  = edgeSet.find(ed1);
					
					if( edgeSet.count(ed1) == 0 )
					{
						ed1.key =currentTetra.key;
						edgeSet.insert(ed1);
					}

					ed2.startVertex = currentTetra.v1;
					ed2.endVertex = currentTetra.v3;
			//		findEdge  = edgeSet.find(ed2);
					
					if( edgeSet.count(ed2) == 0 )
					{
						ed2.key = currentTetra.key;
						edgeSet.insert(ed2);
					}

					ed3.startVertex = currentTetra.v1;
					ed3.endVertex = currentTetra.v4;
				//	findEdge  = edgeSet.find(ed3);
					
					if( edgeSet.count(ed3) == 0 )
					{
						ed3.key = currentTetra.key;
						edgeSet.insert(ed3);
					}
					
				}
				
				if(*checkVertex == currentTetra.v2)
				{
					std::cerr<<"FFF: "<< std::endl;	
					ed1.startVertex = currentTetra.v2;
					ed1.endVertex = currentTetra.v1;
	//				findEdge  = edgeSet.find(ed1);
					
					if( edgeSet.count(ed1) == 0 )
					{
						ed1.key =currentTetra.key;
						edgeSet.insert(ed1);
					}

					ed2.startVertex = currentTetra.v2;
					ed2.endVertex = currentTetra.v3;
		//			findEdge  = edgeSet.find(ed2);
					
					if( edgeSet.count(ed2) == 0 )
					{
						ed2.key = currentTetra.key;
						edgeSet.insert(ed2);
					}

					ed3.startVertex = currentTetra.v2;
					ed3.endVertex = currentTetra.v4;
				//	findEdge  = edgeSet.find(ed3);
					
					if( edgeSet.count(ed3) == 0 )
					{
						ed3.key = currentTetra.key;
						edgeSet.insert(ed3);
					}

	
				}
				
				if(*checkVertex == currentTetra.v3)
				{
					std::cerr<<"GGG: "<< std::endl;	
					ed1.startVertex = currentTetra.v3;
					ed1.endVertex = currentTetra.v1;
			//		findEdge  = edgeSet.find(ed1);
					
					if( edgeSet.count(ed1) == 0 )
					{
						ed1.key =currentTetra.key;
						edgeSet.insert(ed1);
					}

					ed2.startVertex = currentTetra.v3;
					ed2.endVertex = currentTetra.v2;
	//				findEdge  = edgeSet.find(ed2);
					
					if( edgeSet.count(ed2) == 0 )
					{
						ed2.key = currentTetra.key;
						edgeSet.insert(ed2);
					}

					ed3.startVertex = currentTetra.v3;
					ed3.endVertex = currentTetra.v4;
			//		findEdge  = edgeSet.find(ed3);
					
					if( edgeSet.count(ed3) == 0 )
					{
						ed3.key = currentTetra.key;
						edgeSet.insert(ed3);
					}

				}
				
				if(*checkVertex == currentTetra.v4)
				{
					std::cerr<<"HHH: "<< std::endl;	
					ed1.startVertex = currentTetra.v4;
					ed1.endVertex = currentTetra.v1;
		//			findEdge  = edgeSet.find(ed1);
					
					if( edgeSet.count(ed1) == 0 )
					{
						ed1.key =currentTetra.key;
						edgeSet.insert(ed1);
						std::cerr<<"HHH - ED1: "<<ed1.key<< std::endl;	
					}

					ed2.startVertex = currentTetra.v4;
					ed2.endVertex = currentTetra.v2;
	//				findEdge  = edgeSet.find(ed2);
					
					if( edgeSet.count(ed2) == 0 )
					{
						ed2.key = currentTetra.key;
						edgeSet.insert(ed2);
						std::cerr<<"HHH - ED2: "<<ed2.key<< std::endl;	
					}

					ed3.startVertex = currentTetra.v4;
					ed3.endVertex = currentTetra.v3;
			//		findEdge  = edgeSet.find(ed3);
					
					if( edgeSet.count(ed3) == 0 )
					{
						ed3.key = currentTetra.key;
						edgeSet.insert(ed3);
						std::cerr<<"HHH - ED3: "<<ed3.key<< std::endl;	
					}
	
				}

				


				// find VD's vertex vp of currentTetra
				Vertex vp;
				vp = findSphereCenter( currentTetra );
		
				// end of finding VD's vertex vp of currentTetra
				std::cerr<<"Vertex: "<<std::endl;	
				// put vp into VDvertex
				VDvertex.push_back(vp);
				// end of putting vp into VDvertex

				if(first_vertex_flag==0)
				{
					nowVertexId = VDvertex.size()-1;
					
				}
			

				if(flag==1 || (flag==4&&cou!=0)){
				// recode the VDedge
				if(VDvertex.size()>1)
				{
					Edge vdEdge;
					vdEdge.startVertexId = VDvertex.size() - 2;
					vdEdge.endVertexId = VDvertex.size() - 1;
					VDedge.push_back( vdEdge );
					std::cerr<<"Edge "<<std::endl;	
		
				// end record the VDedge
				}
				}
				// save now's tetra for preious
			

				// choose neighbor tetra which contain edge e
				Tetrahedron t1, t2, t3, t4;
				if( getTetra(currentTetra.neighbour1, t1) == false )
				{
			//		std::cerr<<"no neighborRRR"<<std::endl;
					
				}
				if( getTetra(currentTetra.neighbour2, t2) == false )
				{
	//				std::cerr<<"no neighbor2"<<std::endl;
					
				}
				if( getTetra(currentTetra.neighbour3, t3) == false )
				{
		//			std::cerr<<"no neighbor3"<<std::endl;
					
				}
				if( getTetra(currentTetra.neighbour4, t4) == false )
				{
		//			std::cerr<<"no neighbor4"<<std::endl;
					
				}

				
					// if tetra contains edge, and it is not the first tetra
					if ( checkEdge(t1, currentEdgeItr->startVertex, currentEdgeItr->endVertex)==true
						&& t1.key != previousTetraKey 
						&& t1.key != firstTetraKey
						){
								previousTetraKey = currentTetra.key;
						currentKey = t1.key;
						std::cerr<<"t1: "<<t1.key<<std::endl;
						std::cerr<<"currentKey - End - t1: "<< currentKey<<std::endl;	
								first_vertex_flag = 1;
						if(flag==4)
						{
							flag=4;
							cou=1;
						}
						else
							flag=1;
						break;
					}
					else if (checkEdge(t2, currentEdgeItr->startVertex, currentEdgeItr->endVertex) ==true
						&& t2.key != previousTetraKey
						&& t2.key != firstTetraKey
						){
								previousTetraKey = currentTetra.key;
						currentKey = t2.key;
						std::cerr<<"t2: "<<t2.key<<std::endl;	
						std::cerr<<"currentKey - End - t2: "<< currentKey<<std::endl;	
								first_vertex_flag = 1;
						if(flag==4)
						{
							flag=4;
							cou=1;
						}
						else
							flag=1;
						break;
					}
					else if (checkEdge(t3, currentEdgeItr->startVertex, currentEdgeItr->endVertex) ==true
						&& t3.key != previousTetraKey 
						&& t3.key != firstTetraKey
						){
								previousTetraKey = currentTetra.key;
						currentKey = t3.key;
						std::cerr<<"t3: "<<t3.key<<std::endl;	
						std::cerr<<"currentKey - End - t3: "<< currentKey<<std::endl;	
						std::cerr<<"previoueKey - End "<< previousTetraKey<<std::endl;	
								first_vertex_flag = 1;
						if(flag==4)
						{
							flag=4;
							cou=1;
						}
						else
							flag=1;
						break;
					}
					else if ( checkEdge(t4, currentEdgeItr->startVertex, currentEdgeItr->endVertex)  ==true
						&& t4.key != previousTetraKey 
						&& t4.key != firstTetraKey
						){
								previousTetraKey = currentTetra.key;
						currentKey = t4.key;
						std::cerr<<"t4: "<<t4.key<<std::endl;	
						std::cerr<<"currentKey - End - t4: "<< currentKey<<std::endl;	
								first_vertex_flag = 1;
						if(flag==4)
						{
							flag=4;
							cou=1;
						}
						else
							flag=1;
						break;
					}
					else{
						hasNeighbor = false;
						std::cerr<<"hereherehere"<<std::endl;
						if(flag==4)
							still_has_edge=false;

						flag = 2;
						//break;
					}
		
			}// end while of find neighbor
		if(flag==2  )
		{
	
				// first vertex and last vertex
				Edge vdEdge;
				vdEdge.startVertexId = VDvertex.size() - 1;
				vdEdge.endVertexId = nowVertexId;
				VDedge.push_back( vdEdge );
				first_vertex_flag = 0;
				std::cerr<<"First and Last Vertex"<<std::endl;	
		}
		if(flag==2 )
		{
				// this is a VDface
				for(int i=vdEdgeTag; i<VDedge.size(); i++)
				{
					VDface.push_back( i );
					std::cerr<<"Face: "<<VDedge.size()<<std::endl;	
				}

				vdEdgeTag = VDedge.size();
		//		if(vdEdgeTag!=0)
					VDfaceIndex.push_back( vdEdgeTag);
				// end of VDface
					flag = 3;
					
			}

		std::cerr<<"still_has_edge: "<<still_has_edge<<std::endl;	
		}//end while edge set
	


		//this is a VDpoly
	/*	for(int i=vdFaceTag; i<VDface.size(); i++)
		{
			VDpoly.push_back( i );
			std::cerr<<"Poly"<<std::endl;	
		}
		*/
		vdFaceTag = VDfaceIndex.size();
	//	if(vdFaceTag!=0)
			VDpolyIndex.push_back( vdFaceTag-1 );
		//end if VDpoly

		// erase the vertex
		vertexSet.erase( checkVertex );

		usedEdgeSet.clear();
		edgeSet.clear();
		flag=0;

	}//end while of vertex stk
		
	std::cerr<<"v1x: "<<VDvertex.at(0).point.x<<std::endl;
	std::cerr<<"v1x: "<<VDvertex.at(0).point.y<<std::endl;
	std::cerr<<"v1x: "<<VDvertex.at(0).point.z<<std::endl;

	std::cerr<<"v2x: "<<VDvertex.at(1).point.x<<std::endl;
	std::cerr<<"v2x: "<<VDvertex.at(1).point.y<<std::endl;
	std::cerr<<"v2x: "<<VDvertex.at(1).point.z<<std::endl;


	std::cerr<<"v3x: "<<VDvertex.at(2).point.x<<std::endl;
	std::cerr<<"v3x: "<<VDvertex.at(2).point.y<<std::endl;
	std::cerr<<"v3x: "<<VDvertex.at(2).point.z<<std::endl;


	std::cerr<<"v4x: "<<VDvertex.at(3).point.x<<std::endl;
	std::cerr<<"v4x: "<<VDvertex.at(3).point.y<<std::endl;
	std::cerr<<"v4x: "<<VDvertex.at(3).point.z<<std::endl;

	std::cerr<<"v5x: "<<VDvertex.at(4).point.x<<std::endl;
	std::cerr<<"v5x: "<<VDvertex.at(4).point.y<<std::endl;
	std::cerr<<"v5x: "<<VDvertex.at(4).point.z<<std::endl;

	std::cerr<<"v6x: "<<VDvertex.at(5).point.x<<std::endl;
	std::cerr<<"v6x: "<<VDvertex.at(5).point.y<<std::endl;
	std::cerr<<"v6x: "<<VDvertex.at(5).point.z<<std::endl;

	std::cerr<<"v7x: "<<VDvertex.at(6).point.x<<std::endl;
	std::cerr<<"v7x: "<<VDvertex.at(6).point.y<<std::endl;
	std::cerr<<"v7x: "<<VDvertex.at(6).point.z<<std::endl;

	std::cerr<<"v8x: "<<VDvertex.at(7).point.x<<std::endl;
	std::cerr<<"v8x: "<<VDvertex.at(7).point.y<<std::endl;
	std::cerr<<"v8x: "<<VDvertex.at(7).point.z<<std::endl;

	std::cerr<<"v9x: "<<VDvertex.at(8).point.x<<std::endl;
	std::cerr<<"v9x: "<<VDvertex.at(8).point.y<<std::endl;
	std::cerr<<"v9x: "<<VDvertex.at(8).point.z<<std::endl;

	std::cerr<<"v10x: "<<VDvertex.at(9).point.x<<std::endl;
	std::cerr<<"v10x: "<<VDvertex.at(9).point.y<<std::endl;
	std::cerr<<"v10x: "<<VDvertex.at(9).point.z<<std::endl;

	std::cerr<<"v11x: "<<VDvertex.at(10).point.x<<std::endl;
	std::cerr<<"v11x: "<<VDvertex.at(10).point.y<<std::endl;
	std::cerr<<"v11x: "<<VDvertex.at(10).point.z<<std::endl;

	std::cerr<<"v12x: "<<VDvertex.at(11).point.x<<std::endl;
	std::cerr<<"v12x: "<<VDvertex.at(11).point.y<<std::endl;
	std::cerr<<"v12x: "<<VDvertex.at(11).point.z<<std::endl;

	std::cerr<<"e1: "<<VDedge.at(0).startVertexId<<std::endl;
	std::cerr<<"e1: "<<VDedge.at(0).endVertexId<<std::endl;


		std::cerr<<"e2: "<<VDedge.at(1).startVertexId<<std::endl;
	std::cerr<<"e2: "<<VDedge.at(1).endVertexId<<std::endl;

		std::cerr<<"e3: "<<VDedge.at(2).startVertexId<<std::endl;
	std::cerr<<"e3: "<<VDedge.at(2).endVertexId<<std::endl;

		std::cerr<<"e4: "<<VDedge.at(3).startVertexId<<std::endl;
	std::cerr<<"e4: "<<VDedge.at(3).endVertexId<<std::endl;

		std::cerr<<"e5: "<<VDedge.at(4).startVertexId<<std::endl;
	std::cerr<<"e5: "<<VDedge.at(4).endVertexId<<std::endl;

		std::cerr<<"e6: "<<VDedge.at(5).startVertexId<<std::endl;
	std::cerr<<"e6: "<<VDedge.at(5).endVertexId<<std::endl;

	std::cerr<<"face1 "<<VDfaceIndex.at(0)<<std::endl;
	std::cerr<<"face2: "<<VDfaceIndex.at(1)<<std::endl;
	std::cerr<<"face3: "<<VDfaceIndex.at(2)<<std::endl;
	std::cerr<<"face4: "<<VDfaceIndex.at(3)<<std::endl;
		std::cerr<<"face5: "<<VDfaceIndex.at(4)<<std::endl;

	
			std::cerr<<"poly1 "<<VDpolyIndex.at(0)<<std::endl;
	std::cerr<<"poly2: "<<VDpolyIndex.at(1)<<std::endl;

	return;
}
Exemple #9
0
/*trySwapPieces
* compute the score the puzzle WOULD have, if swap occured
* p:puzzle
* i, j: pieces to be swap
* returns: new total score with the swap
*
*/
int trySwapPieces(puzzle p,int **cur_sol,int score, int i, int j, int *wrongs, int *wsize_ptr){
	//newscores=oldscores-computeLocalScore(....,cur_sol, i)-computeLocalScore(.....,cur_sol, j)
	//.... +computeLocalScore(...., swapped_sol, i)+computeLocalScore(....,swapped_sol, j);


	int rot, tmp, old_i, old_j, old_rot_i, old_rot_j, k, maxi=0, maxj=0, max_rot_i, max_rot_j, found, w, skip=0;
	int scoreold=score;

	//store actual pieces and rotations:
	old_i=cur_sol[i][0];
	old_j=cur_sol[j][0];
	old_rot_i=cur_sol[i][1];
	old_rot_j=cur_sol[j][1];

	score-=computeLocalScore(p, cur_sol, cur_sol[i][0], i, cur_sol[i][1]);
	score-=computeLocalScore(p, cur_sol, cur_sol[j][0], j, cur_sol[j][1]);
	if(isNeighbor(p, i, j)){


        /* try rotating the two pieces in place */

        score+=checkEdge(p, cur_sol, i, j); // score for common edge was removed twice, so re-add once
        for(cur_sol[i][1]=0;cur_sol[i][1]<4;cur_sol[i][1]++){ //rotate i

			for(cur_sol[j][1]=0;cur_sol[j][1]<4;cur_sol[j][1]++){ //rotate j
			    k=computeLocalScore(p, cur_sol, old_i, i, cur_sol[i][1]); //score from i
				tmp=computeLocalScore(p, cur_sol, old_j, j, cur_sol[j][1]); //score from j
                if(tmp+k>maxi+maxj){
					maxi=k;
					maxj=tmp;
					max_rot_i=cur_sol[i][1];
					max_rot_j=cur_sol[j][1];
                }
			}
        }
        score+=maxi+maxj; // this adds one point for each "good" edge, so the common edge has double score
        //update solution
        cur_sol[i][1]=max_rot_i;
        cur_sol[j][1]=max_rot_j;
        score-=checkEdge(p, cur_sol, i, j); //score for common edge has been added twice, then subtract once
        if (score>scoreold){

            skip=1; //-> don't try swapping; maybe next time...
        } else {
            //restore
            cur_sol[i][1]=old_rot_i;
            cur_sol[j][1]=old_rot_j;
            score-=maxi+maxj;
        }


        if(!skip){
            /* swap the pieces (if leads to better score) */

            cur_sol[i][0]=old_j; //move j-->i
            cur_sol[j][0]=old_i; //move i-->j
            for(cur_sol[i][1]=0;cur_sol[i][1]<4;cur_sol[i][1]++){ //rotate i

                for(cur_sol[j][1]=0;cur_sol[j][1]<4;cur_sol[j][1]++){ //rotate j
                    k=computeLocalScore(p, cur_sol, old_j, i, cur_sol[i][1]); //score from i
                    tmp=computeLocalScore(p, cur_sol, old_i, j, cur_sol[j][1]); //score from j
                    if(tmp+k>maxi+maxj){
                        maxi=k;
                        maxj=tmp;
                        max_rot_i=cur_sol[i][1];
                        max_rot_j=cur_sol[j][1];
                    }
                }
            }
        score+=maxi+maxj; // this adds one point for each "good" edge, so the common edge has double score
        score-=checkEdge(p, cur_sol, i, j); //score for common edge has been added twice, then subtract once
            if (score>scoreold){
                //update solution
                cur_sol[i][1]=max_rot_i;
                cur_sol[j][1]=max_rot_j;
            } else {
                //restore old values:
                cur_sol[i][0]=old_i;
                cur_sol[i][1]=old_rot_i;
                cur_sol[j][0]=old_j;
                cur_sol[j][1]=old_rot_j;
                score=scoreold;
            }
        }


	} else {
		for(rot=0;rot<4;rot++){
			tmp=computeLocalScore(p, cur_sol, old_i, j, rot);
			if(tmp>maxi){
				maxi=tmp;
				max_rot_i=rot;
			}
		}
        score+=maxi;


		maxj=0;
		for(rot=0;rot<4;rot++){
			tmp=computeLocalScore(p, cur_sol, old_j, i, rot);
			if(tmp>maxj){
				maxj=tmp;
				max_rot_j=rot;
			}
		}
		score+=maxj;
		if(score>scoreold){
            cur_sol[j][0]=old_i;
            cur_sol[j][1]=max_rot_i;
            cur_sol[i][0]=old_j;
            cur_sol[i][1]=max_rot_j;
		}else{
            return(scoreold);
		}
	}

	/* update wrongs vector */
	#ifdef WRONGS
	if(maxi==MAX_LOCAL_SCORE){
		removeWrong(p, cur_sol, wrongs, wsize_ptr, i);
	}
	// update neighbors of i
	updateWrongs(p, cur_sol, wrongs, wsize_ptr, i);

	if(maxj==MAX_LOCAL_SCORE){
		removeWrong(p, cur_sol, wrongs, wsize_ptr, i);
	}
	// update neighbors of j
	updateWrongs(p, cur_sol, wrongs, wsize_ptr, i);
    #endif

	return(score);
}
    void Model::analyzeMesh()
    {
	// Clear any previous results
	m_vertices.clear();
	m_vertexTree.clear();
	m_baseIndex2ModelIndex.clear();

	// Add all vertices
	for (unsigned int i = 0; i < m_pMesh->getVertices().size(); i++)
	{
	    auto vertex = m_pMesh->getVertices()[i];
	    auto normal = m_pMesh->getNormals()[i];

	    // Check if there already is a vertex with the same coordinates
	    auto dbglCoords = dbgl::Vec3d(vertex.x(), vertex.y(), vertex.z());
	    auto pVertId = m_vertexTree.getSimilar(dbglCoords, 0.0001);
	    if(pVertId != nullptr)
	    {
		// Average normals
		m_vertices[*pVertId].normal += Eigen::Vector3d(normal.x(), normal.y(), normal.z());
		// Add base vertex id
		m_vertices[*pVertId].baseVertices.insert(i);
		// Create a list base index -> this index
		m_baseIndex2ModelIndex.push_back(*pVertId);
	    }
	    else
	    {
		Vertex vert;
		vert.id = m_vertices.size();
		vert.coords = Eigen::Vector3d(vertex.x(), vertex.y(), vertex.z());
		vert.normal = Eigen::Vector3d(normal.x(), normal.y(), normal.z());
		vert.baseVertices.insert(i);
		m_vertices.push_back(vert);
		m_vertexTree.insert(dbglCoords, vert.id);
		// Create a list base index -> this index
		m_baseIndex2ModelIndex.push_back(vert.id);
	    }
	}
	// Normalize all normals
	for(auto& vert : m_vertices)
	    vert.normal.normalize();

	// Balance the tree for maximum performance
	m_vertexTree.balance();

	// Compute neighbors
	for (unsigned int i = 0; i < m_pMesh->getIndices().size(); i += 3)
	{
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 0]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 1]]);
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 0]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 2]]);
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 1]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 0]]);
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 1]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 2]]);
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 2]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 0]]);
	    m_vertices[m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 2]]].neighbors.insert(
		    m_baseIndex2ModelIndex[m_pMesh->getIndices()[i + 1]]);
	}

	// Compute edge vertices
	for (unsigned int i = 0; i < m_vertices.size(); i++)
	{
	    if (m_vertices[i].neighbors.empty())
		continue;
	    bool isEdge = false;
	    for(auto it = m_vertices[i].neighbors.begin(); it != m_vertices[i].neighbors.end(); ++it)
	    {
		// Usually this should finish on first iteration. Only due to bad luck it might need more.
		auto start = m_vertices[*it];
		isEdge = checkEdge(m_vertices[i], start);
		if(!isEdge)
		    break;
	    }

	    m_vertices[i].isEdge = isEdge;
	}
    }