void TranslateSelection(Selector& sel, const typename TAAPosVRT::ValueType& offset, TAAPosVRT& aaPos) { if(!sel.grid()){ throw(UGError("No grid assigned to selector")); } Grid& grid = *sel.grid(); // collect all vertices that are adjacent to selected elements // we have to make sure that each vertex is only counted once. // we do this by using grid::mark. grid.begin_marking(); for(VertexIterator iter = sel.vertices_begin(); iter != sel.vertices_end(); ++iter) { VecAdd(aaPos[*iter], aaPos[*iter], offset); grid.mark(*iter); } for(EdgeIterator iter = sel.edges_begin(); iter != sel.edges_end(); ++iter) { Edge::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(aaPos[vrts[i]], aaPos[vrts[i]], offset); } } } for(FaceIterator iter = sel.faces_begin(); iter != sel.faces_end(); ++iter) { Face::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(aaPos[vrts[i]], aaPos[vrts[i]], offset); } } } for(VolumeIterator iter = sel.volumes_begin(); iter != sel.volumes_end(); ++iter) { Volume::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(aaPos[vrts[i]], aaPos[vrts[i]], offset); } } } grid.end_marking(); }
bool CalculateCenter(typename TAAPosVRT::ValueType& centerOut, Selector& sel, TAAPosVRT& aaPos) { if(!sel.grid()){ throw(UGError("No grid assigned to selector")); } Grid& grid = *sel.grid(); // collect all vertices that are adjacent to selected elements // we have to make sure that each vertex is only counted once. // we do this by using grid::mark. grid.begin_marking(); // std::vector<Vertex*> vrts; // vrts.assign(sel.vertices_begin(), sel.vertices_end()); // grid.mark(sel.vertices_begin(), sel.vertices_end()); VecSet(centerOut, 0); size_t n = 0; for(VertexIterator iter = sel.vertices_begin(); iter != sel.vertices_end(); ++iter) { VecAdd(centerOut, centerOut, aaPos[*iter]); grid.mark(*iter); ++n; } for(EdgeIterator iter = sel.edges_begin(); iter != sel.edges_end(); ++iter) { Edge::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(centerOut, centerOut, aaPos[vrts[i]]); ++n; } } } for(FaceIterator iter = sel.faces_begin(); iter != sel.faces_end(); ++iter) { Face::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(centerOut, centerOut, aaPos[vrts[i]]); ++n; } } } for(VolumeIterator iter = sel.volumes_begin(); iter != sel.volumes_end(); ++iter) { Volume::ConstVertexArray vrts = (*iter)->vertices(); for(size_t i = 0; i < (*iter)->num_vertices(); ++i){ if(!grid.is_marked(vrts[i])){ grid.mark(vrts[i]); VecAdd(centerOut, centerOut, aaPos[vrts[i]]); ++n; } } } grid.end_marking(); if(n > 0){ VecScale(centerOut, centerOut, 1. / (number)n); return true; } return false; }