Ejemplo n.º 1
0
std::vector<int> dfs(const int triangles[][3], int triangles_count, int start_tri, int end_tri)
{
	std::vector<int> triangles_list;
	bool *visited = new bool[triangles_count];
	int *parent = new int[triangles_count];
	memset(visited, false, triangles_count * sizeof(bool));
	memset(parent, -1, triangles_count * sizeof(int));

	std::stack<int> s;
	s.push(start_tri);
	while (!s.empty())
	{
		int v = s.top(); s.pop();
		if (!visited[v])
		{
			visited[v] = true;
			for (int u = 0; u < triangles_count; u++)
			if (neighbor_triangles(triangles, triangles_count, v, u) && !visited[u])
			{
				s.push(u);
				parent[u] = v;
			}
		}
		if (parent[end_tri] != -1)
			break;
	}
	int p = end_tri;
	while (parent[p] != -1)
	{
		triangles_list.push_back(p);
		p = parent[p];
	}
	triangles_list.push_back(start_tri);
	std::reverse(triangles_list.begin(), triangles_list.end());
	delete[] visited;
	delete[] parent;
	return triangles_list;
}
Ejemplo n.º 2
0
  void fill_triangle_contacts(MeshT const & mesh)
  {
    typedef typename viennagrid::result_of::element<MeshT>::type ElementType;

    typedef typename viennagrid::result_of::region<MeshT>::type RegionType;
    typedef typename viennagrid::result_of::id<RegionType>::type RegionIDType;

    typedef typename viennagrid::result_of::region_range<MeshT>::type RegionRangeType;
    typedef typename viennagrid::result_of::iterator<RegionRangeType>::type RegionRangeIterator;

    RegionRangeType regions(mesh);
    std::vector<RegionIDType> region_contacts;
    for (RegionRangeIterator rit = regions.begin(); rit != regions.end(); ++rit)
    {
      if ( (*rit).get_name().find("_contact") != std::string::npos )
        region_contacts.push_back( (*rit).id() );
    }

    typedef typename viennagrid::result_of::element_range<RegionType>::type ElementRangeType;
    typedef typename viennagrid::result_of::iterator<ElementRangeType>::type ElementRangeIterator;



    for (std::size_t i = 0; i != region_contacts.size(); ++i)
    {
      RegionType region = mesh.get_region( region_contacts[i] );
      ElementRangeType triangles(region, 2);

      std::set< std::vector<ElementType> > new_triangles;

      for (ElementRangeIterator tit = triangles.begin(); tit != triangles.end(); ++tit)
      {
        typedef typename viennagrid::result_of::neighbor_range<RegionType>::type NeighborElementRangeType;
        typedef typename viennagrid::result_of::iterator<NeighborElementRangeType>::type NeighborElementRangeIterator;

        NeighborElementRangeType neighbor_triangles(region, *tit, 0, 2);
        for (NeighborElementRangeIterator ntit = neighbor_triangles.begin(); ntit != neighbor_triangles.end(); ++ntit)
        {
          std::vector<ElementType> triangle(3);

          ElementType shared_vertex;
          for (int i = 0; i != 3; ++i)
            for (int j = 0; j != 3; ++j)
            {
              if ( viennagrid::vertices(*tit)[i] == viennagrid::vertices(*ntit)[j] )
                triangle[0] = viennagrid::vertices(*tit)[i];
            }

//           ElementType vertex_t;
          for (int i = 0; i != 3; ++i)
          {
            if (viennagrid::regions(viennagrid::vertices(*tit)[i]).size() == 1)
              triangle[1] = viennagrid::vertices(*tit)[i];
          }

//           ElementType vertex_nt;
          for (int i = 0; i != 3; ++i)
          {
            if (viennagrid::regions(viennagrid::vertices(*ntit)[i]).size() == 1)
              triangle[2] = viennagrid::vertices(*ntit)[i];
          }

          std::sort( triangle.begin(), triangle.end() );

          new_triangles.insert(triangle);

//           ElementType triangle = viennagrid::make_triangle( region, shared_vertex, vertex_t, vertex_nt );
        }
      }

      for (typename std::set< std::vector<ElementType> >::iterator it = new_triangles.begin(); it != new_triangles.end(); ++it)
        viennagrid::make_triangle( region, (*it)[0], (*it)[1], (*it)[2] );
    }
  }