Exemple #1
0
inline Bvert_list
reorder(CBedge_list& edges)
{
   Bvert_list ret;

   Bvert_list verts = edges.get_verts();
   for (Bvert_list::size_type i = 0; i < verts.size(); i++)
      if (Bpoint::find_controller(verts[i]) || Bcurve::find_controller(verts[i])) {
         ret.push_back(verts[i]);
         break;
      }
   if (ret.empty())
         return ret;

   for (Bvert_list::size_type i = 1; i < verts.size(); i++) {
      for (Bedge_list::size_type j = 0; j < edges.size(); j++) {
         Bvert* v = edges[j]->other_vertex(ret.back());
         if (v && std::find(ret.begin(), ret.end(), v) == ret.end()) {
            ret.push_back(v);
            break;
         }
      }
   }

   err_adv(debug, "   reorder: num of verts: %d", ret.size());
   return ret;
}
Exemple #2
0
void
EdgeStrip::build_with_tips(CBedge_list& edges, CSimplexFilter& filter)
{
   // Build the strip from the given pool of edges, with the
   // given filter.  Try to start the edge strip at the "tips" of
   // chains of edges of the desired type. The given filter
   // should just screen for edges of the desired kind;
   // internally this method also screens for edges that have not
   // yet been reached (added to the strip).

   // Clear edge flags to screen for unreached edges:
   set_adjacent_edges(edges.get_verts(), 1);
   edges.clear_flags();

   // Pull out the edge tips:
   Bedge_list tips = edges.filter(ChainTipEdgeFilter(filter));

   // Construct the filter that screens out previously reached
   // edges:
   UnreachedSimplexFilter unreached;
   AndFilter       wanted = unreached + filter;

   int k;

   // Start from all the tips first:
   for (k=0; k<tips.num(); k++) {
      Bedge* e = tips[k];
      Bvert* v = (e->v2()->degree(filter) != 2) ? e->v2() : e->v1();
      build(v, e, wanted);
   }

   // Now check the rest:
   for (k=0; k<edges.num(); k++)
      build(0, edges[k], wanted);
}
Exemple #3
0
void
Bbase::add_edge_memes(CBedge_list& edges)
{
   if (!(_mesh && _mesh == edges.mesh())) {
      err_msg("Bbase::add_edge_memes: Error: bad mesh");
      return;
   }

   for (int i=0; i<edges.num(); i++)
      add_edge_meme((Ledge*)edges[i]);
}
Exemple #4
0
void
EdgeStrip::build_ccw_boundaries(
   CBedge_list& edges,
   CSimplexFilter& face_filter
   )
{
   // Similar to previous...
   //
   // XXX - needs comments

   // Clear edge flags to screen for unreached edges:
   // set edge flags to 1 in 1-ring of verts,
   // then clear edge flags of internal edges
   set_adjacent_edges(edges.get_verts(), 1);
   edges.clear_flags();

   // get an edge filter that accepts "boundary" edges WRT the
   // given face filter
   BoundaryEdgeFilter boundary(face_filter);

   // Pull out the edge tips:
   Bedge_list tips = edges.filter(ChainTipEdgeFilter(boundary));

   // Construct the filter that screens out previously reached
   // edges:
   UnreachedSimplexFilter unreached;
   AndFilter       wanted = unreached + boundary;

   int k;

   // Start from all the tips first:
   for (k=0; k<tips.num(); k++) {
      Bedge* e = tips[k];
      Bvert* v = (e->v2()->degree(boundary) != 2) ? e->v2() : e->v1();
      Bface* f = e->screen_face(face_filter);
      assert(f); // e must have 1 face satisfying the filter

      // If this will start out running ccw, take it.
      // otherwise skip:
      if (f->next_vert_ccw(v) == e->other_vertex(v))
         build(v, e, wanted);
   }

   // Now check the rest:
   for (k=0; k<edges.num(); k++) {
      Bedge* e = edges[k];
      Bface* f = e->screen_face(face_filter);
      assert(f); // e must have 1 face satisfying the filter

      // Go CCW around faces
      build(f->leading_vert_ccw(e), e, wanted);
   }
}
Exemple #5
0
inline Bface_list
ctrl_faces(CBedge_list& edges)
{
   if (!dynamic_pointer_cast<LMESH>(edges.mesh()))
      return Bface_list();
   Bface_list ret(edges.size());
   for (Bedge_list::size_type i=0; i<edges.size(); i++) {
      Bface* f = ((Ledge*)edges[i])->ctrl_face();
      if (f)
         ret.push_back(f);
   }
   return ret.unique_elements().quad_complete_faces();
}
Exemple #6
0
EdgeMemeList 
Bbase::find_boss_ememes(CBedge_list& edges) 
{
   // Convenience: lookup boss memes for a whole list of edges

   EdgeMemeList ret(edges.num());
   for (int i=0; i<edges.num(); i++) {
      EdgeMeme* vm = find_boss_ememe(edges[i]);
      if (vm)
         ret += vm;
   }
   return ret;
}
Exemple #7
0
Bbase_list 
Bbase::find_owners(CBedge_list& edges)
{
   Bbase_list ret = find_owners(edges.get_verts());
   _find_owners(edges, ret);
   return ret;
}
Exemple #8
0
inline void
update_edges(CBedge_list& edges)
{
   // helper for LMESH::update_subdivision(CBface_list& faces)
   for (Bedge_list::size_type i=0; i<edges.size(); i++)
      ((Ledge*)edges[i])->update_subdivision();
}
Exemple #9
0
inline void
update_edges(CBedge_list& edges)
{
   // helper for LMESH::update_subdivision(CBface_list& faces)
   for (int i=0; i<edges.num(); i++)
      ((Ledge*)edges[i])->update_subdivision();
}
Exemple #10
0
inline bool 
copy_edges(CBedge_list& edges, CVertMapper& vmap)
{
   bool ret = true;
   for (Bedge_list::size_type i=0; i<edges.size(); i++)
      if (!copy_edge(edges[i], vmap))
         ret = false;
   return ret;
}
Exemple #11
0
bool 
Skin::copy_edges(CBedge_list& edges) const
{
   bool ret = true;
   for (int i=0; i<edges.num(); i++)
      if (!copy_edge(edges[i]))
         ret = false;
   return ret;
}
Exemple #12
0
inline double
compute_yardstick(CBedge_list& edges, bool debug=false)
{
   double ret = 0.6 * edges.strong_edges().avg_len();

   BMESHptr mk = edges.mesh();
   BMESHptr m0 = get_top_level(edges.get_faces()).mesh();

   int    lk = 0;       // mesh level of edges
   int    l0 = 0;       // mesh level of edges' control region
   double  s = 1;       // scaling factor
   if (mk && m0) {
      lk = mk->subdiv_level();
      l0 = m0->subdiv_level();
      s = (1 << (lk - l0));
   }
   err_adv(debug, "lk: %d, l0: %d, scaling: %f", lk, l0, s);
   return s * ret;
}
Exemple #13
0
void
EdgeStrip::build(CBedge_list& edges, CSimplexFilter& filter)
{
   // Given a list of edges to search, build the strip from edges
   // that satisfy a given property.

   reset();

   for (int k=0; k<edges.num(); k++)
      build(0, edges[k], filter);
}