Example #1
0
void CRichModel::ComputeMaxEdgeLength()
{
	maxEdgeLength = 0;
	for(int i = 0; i < GetNumOfEdges();++i){
		maxEdgeLength = max(maxEdgeLength,Edge(i).length );
	}
    meanEdgeLength = 0;
	for(int i = 0; i < GetNumOfEdges();++i){
		meanEdgeLength += Edge(i).length;
	}
    meanEdgeLength /= GetNumOfEdges();
}
Example #2
0
bool CPlanarGraph::CheckDuplicatedEdge(const CGraphEdge& edge)
{
	int idx10 = edge.GetIdx0();
	int idx11 = edge.GetIdx1();
	for ( int i=0; i<GetNumOfEdges(); i++ )
	{
		CGraphEdge& edge0 = GetEdge(i);
		int idx00 = edge0.GetIdx0();
		int idx01 = edge0.GetIdx1();
		if ( (idx00 == idx10 && idx01 == idx11) || (idx00 == idx11 && idx01 == idx10) )
		{
			return true;
		}
	}
	return false;
}
Example #3
0
void CRichModel::ComputePlanarCoordsOfIncidentVertForEdges()
{
	for (int i = 0; i < GetNumOfEdges(); ++i)
	{
		if (IsExtremeEdge(i))
			continue;
		double bottom = Edge(i).length;
		double leftLen = Edge(Edge(i).indexOfLeftEdge).length;
		double squareOfLeftLen = leftLen * leftLen;
		double rightLen = Edge(Edge(i).indexOfRightEdge).length;
		double x = (squareOfLeftLen - rightLen * rightLen) / bottom + bottom;
		x /= 2.0;
		m_Edges[i].xOfPlanarCoordOfOppositeVert = x;		
		m_Edges[i].yOfPlanarCoordOfOppositeVert = sqrt(max(0.0, squareOfLeftLen - x * x));
	}
}
Example #4
0
void CPlanarGraph::RemoveIndividualNodes()
{
	int numOfNodes = GetNumOfNodes();
	std::vector<bool> vecKeepFlags(numOfNodes, false);
	std::vector<int> vecNewIndices(numOfNodes, -1);
	std::vector<CGraphNode> nodesToKeep;
	int keepCount = 0;
	for ( int i=0; i<numOfNodes; i++ )
	{
		CGraphNode& node = GetNode(i);
		if ( node.GetNeighbors().empty() == false )
		{
			nodesToKeep.push_back(node);
			vecKeepFlags[i] = true;
			vecNewIndices[i] = keepCount;
			keepCount ++;
		}
	}
	if ( keepCount == numOfNodes )
	{
		return;
	}
	m_nodes = nodesToKeep;
	for ( int i=0; i<GetNumOfEdges(); i++ )
	{
		CGraphEdge& edge = GetEdge(i);
		int idx0 = edge.GetIdx0();
		int idx1 = edge.GetIdx1();
		idx0 = vecNewIndices[idx0];
		idx1 = vecNewIndices[idx1];
		edge.SetIdx0(idx0);
		edge.SetIdx1(idx1);
	}

	SetNodeNeighbors();
}
Example #5
0
void CPlanarGraph::DetectFaces()
{
	// Based on the example in (http://www.boost.org/doc/libs/1_47_0/libs/graph/example/planar_face_traversal.cpp)
	int numOfNodes = GetNumOfNodes();
	Graph g(numOfNodes);

	int numOfEdges = GetNumOfEdges();
	for ( int i=0; i<numOfEdges; i++ )
	{
		int idx0 = GetEdge(i).GetIdx0();
		int idx1 = GetEdge(i).GetIdx1();
		add_edge(idx0, idx1, g);
	}

	// Initialize the interior edge index
	property_map<Graph, edge_index_t>::type e_index = get(edge_index, g);
	graph_traits<Graph>::edges_size_type edge_count = 0;
	graph_traits<Graph>::edge_iterator ei, ei_end;
	for ( boost::tuples::tie(ei, ei_end) = edges(g); ei != ei_end; ++ei )
	{
		put(e_index, *ei, edge_count++);
	}

	typedef std::vector< graph_traits<Graph>::edge_descriptor > vec_t;
	std::vector<vec_t> embedding(num_vertices(g));
#if 0
	// Test for planarity - we know it is planar, we just want to 
	// compute the planar embedding as a side-effect
	if ( boyer_myrvold_planarity_test(boyer_myrvold_params::graph = g,
		boyer_myrvold_params::embedding = &embedding[0]	) )
	{
		std::cout << "Input graph is planar" << std::endl;
	}
	else
	{
		std::cout << "Input graph is not planar" << std::endl;
	}
#else
	// Compute the planar embedding based on node positions...
	VertexIterator vi, vi_end;
	for ( boost::tie(vi, vi_end) = boost::vertices(g); vi != vi_end; ++vi )
	{
		OutEdgeIterator ei, ei_end;
		std::vector<EdgeDescriptor> adjacentEdges;
		for ( boost::tie(ei, ei_end) = boost::out_edges(*vi, g); ei != ei_end; ++ei )
		{
			VertexDescriptor v1 = boost::source(*ei, g);
			VertexDescriptor v2 = boost::target(*ei, g);
			adjacentEdges.push_back(*ei);
		}
		SortAdjacentVertices(g, *vi, adjacentEdges);
		for(int i = 0; i < adjacentEdges.size(); ++i)
		{
			std::cout << *vi << " -> " << adjacentEdges[i] << std::endl;
		}
		if(adjacentEdges.size()>0)
			std::cout << std::endl;
		embedding[*vi] = adjacentEdges;
	}
#endif

	std::cout << std::endl << "Vertices on the faces: " << std::endl;
	vertex_output_visitor v_vis;
	planar_face_traversal(g, &embedding[0], v_vis);

	std::cout << std::endl << "Edges on the faces: " << std::endl;
	edge_output_visitor e_vis;
	planar_face_traversal(g, &embedding[0], e_vis);

	RemoveTheOutsideFace();
}
Example #6
0
void CRichModel::CollectAndArrangeNeighs()
{
	m_nIsolatedVerts = 0;
	vector<int> sequenceOfDegrees(GetNumOfVerts(), 0);	
	m_NeighsAndAngles.resize(GetNumOfVerts());
	for (int i = 0; i < (int)m_NeighsAndAngles.size(); ++i)
	{
		m_NeighsAndAngles[i].resize(1, make_pair(-1, 0));
	}
	for (int i = 0; i < (int)GetNumOfEdges(); ++i)
	{
		const CEdge& edge = Edge(i);
		++sequenceOfDegrees[edge.indexOfLeftVert];
		int &indexOfStartEdge = m_NeighsAndAngles[edge.indexOfLeftVert][0].first;
		if (indexOfStartEdge == -1 || !IsStartEdge(indexOfStartEdge))
		{
			indexOfStartEdge = i;
		}
		else if (IsStartEdge(i))
		{
			m_NeighsAndAngles[edge.indexOfLeftVert].push_back(make_pair(i, 0));
		}
	}
	for (int i = 0; i < GetNumOfVerts(); ++i)
	{
		if (m_NeighsAndAngles[i][0].first == -1)
		{
			m_NeighsAndAngles[i].clear();
			m_nIsolatedVerts++;	
			continue;
		}
		vector<int> startEdges;
		for (int j = 0; j < (int)Neigh(i).size(); ++j)
		{
			startEdges.push_back(Neigh(i)[j].first);
		}	
		m_NeighsAndAngles[i].resize(sequenceOfDegrees[i], make_pair(0, 0));
		int num(0);
		for (int j = 0; j < (int)startEdges.size(); ++j)
		{
			int curEdge = startEdges[j];			
			while (1)
			{
				m_NeighsAndAngles[i][num].first = curEdge;
				++num;
				if (num >= sequenceOfDegrees[i])
					break;
				if (IsExtremeEdge(curEdge))
					break;
				curEdge = Edge(curEdge).indexOfLeftEdge;
				if (curEdge == startEdges[j])
				{
					break;
				}
			}
		}
		if (num != sequenceOfDegrees[i])
		{
			printf("vertex id %d\n" , i );
			//throw "Complex vertices";
			printf("COmplex vertices\n");
		}
	}
}