35 #ifndef GEOMETRYKERNEL_HH_ 36 #define GEOMETRYKERNEL_HH_ 40 #include <type_traits> 42 #include "../Geometry/VectorT.hh" 43 #include "TopologyKernel.hh" 47 template <
class VecT,
class TopologyKernelT = TopologyKernel>
52 typedef TopologyKernelT KernelT;
60 template<
class OtherTopoKernel>
62 TopologyKernelT::assign(other);
63 other->clone_vertices(vertices_);
73 vertices_.push_back(_p);
76 return KernelT::add_vertex();
82 assert(_vh.idx() < (int)vertices_.size());
84 vertices_[_vh.
uidx()] = _p;
89 return vertices_[_vh.
uidx()];
93 assert(_h.idx() < (int)TopologyKernelT::n_vertices());
95 VertexIter nV = TopologyKernelT::delete_vertex(_h);
97 if (TopologyKernelT::deferred_deletion_enabled())
102 vertices_.erase(vertices_.begin() + _h.idx());
107 void collect_garbage()
override 109 if (!TopologyKernelT::needs_garbage_collection())
112 if (TopologyKernelT::fast_deletion_enabled()) {
113 TopologyKernelT::collect_garbage();
116 for (
int i = (
int)vertices_.size(); i > 0; --i)
119 vertices_.erase(vertices_.begin() + (i-1));
121 TopologyKernelT::collect_garbage();
128 assert(_h1.idx() >= 0 && _h1.idx() < (int)vertices_.size());
129 assert(_h2.idx() >= 0 && _h2.idx() < (int)vertices_.size());
134 std::swap(vertices_[_h1.
uidx()], vertices_[_h2.
uidx()]);
136 TopologyKernelT::swap_vertex_indices(_h1, _h2);
141 void delete_multiple_vertices(
const std::vector<bool>& _tag)
override{
143 assert(_tag.size() == TopologyKernelT::n_vertices());
145 std::vector<VecT> newVertices;
147 typename std::vector<VecT>::const_iterator v_it = vertices_.begin();
149 for(std::vector<bool>::const_iterator t_it = _tag.begin(),
150 t_end = _tag.end(); t_it != t_end; ++t_it, ++v_it) {
155 newVertices.push_back(*v_it);
160 vertices_.swap(newVertices);
162 TopologyKernelT::delete_multiple_vertices(_tag);
167 void clear(
bool _clearProps =
true)
override {
170 TopologyKernelT::clear(_clearProps);
173 typename PointT::value_type length(
const HalfEdgeHandle& _heh)
const {
174 return vector(_heh).length();
177 typename PointT::value_type length(
const EdgeHandle& _eh)
const {
178 return vector(_eh).length();
183 const typename TopologyKernelT::Edge& e = TopologyKernelT::halfedge(_heh);
184 return (
vertex(e.to_vertex()) -
vertex(e.from_vertex()));
189 const typename TopologyKernelT::Edge& e = TopologyKernelT::edge(_eh);
190 return (
vertex(e.to_vertex()) -
vertex(e.from_vertex()));
193 PointT barycenter(
const EdgeHandle& _eh)
const {
194 return PointT(0.5 *
vertex(TopologyKernelT::edge(_eh).from_vertex()) +
195 0.5 *
vertex(TopologyKernelT::edge(_eh).to_vertex()));
198 PointT barycenter(
const FaceHandle& _fh)
const {
199 PointT p(
typename PointT::value_type(0));
200 typename PointT::value_type valence = 0;
202 TopologyKernelT::hfv_iter(TopologyKernelT::halfface_handle(_fh, 0));
203 for(; hfv_it.valid(); ++hfv_it, valence += 1) {
210 PointT barycenter(
const CellHandle& _ch)
const {
211 PointT p(
typename PointT::value_type(0));
212 typename PointT::value_type valence = 0;
214 for(; cv_it.valid(); ++cv_it, valence += 1) {
225 if(TopologyKernelT::halfface(_hfh).halfedges().size() < 3) {
226 std::cerr <<
"Warning: Degenerate face: " 227 << TopologyKernelT::face_handle(_hfh) << std::endl;
228 return PointT {0.0, 0.0, 0.0};
231 const std::vector<HalfEdgeHandle>& halfedges = TopologyKernelT::halfface(_hfh).halfedges();
232 std::vector<HalfEdgeHandle>::const_iterator he_it = halfedges.begin();
234 const PointT &p1 =
vertex(TopologyKernelT::halfedge(*he_it).from_vertex());
235 const PointT &p2 =
vertex(TopologyKernelT::halfedge(*he_it).to_vertex());
237 const PointT &p3 =
vertex(TopologyKernelT::halfedge(*he_it).to_vertex());
239 const PointT n = (p2 - p1).cross(p3 - p2);
240 return n.normalized();
243 void clone_vertices(std::vector<VecT>& _copy)
const {
245 _copy.reserve(vertices_.size());
246 std::copy(vertices_.begin(), vertices_.end(), std::back_inserter(_copy));
249 void swap_vertices(std::vector<VecT>& _copy) {
250 if(_copy.size() != vertices_.size()) {
251 std::cerr <<
"Vertex vectors differ in size! The size of the copy " <<
252 "is artificially set to the correct one. Some values may not be correctly initialized." << std::endl;
253 _copy.resize(vertices_.size());
255 std::swap(vertices_, _copy);
260 std::vector<VecT> vertices_;
PointT normal(const HalfFaceHandle &_hfh) const
VertexHandle add_vertex(const VecT &_p)
Add a geometric point to the mesh.
GeometryKernel()=default
Constructor.
size_t uidx() const
return unsigned idx - handle must be valid
~GeometryKernel() override=default
Destructor.
size_t n_vertices() const override
Get number of vertices in mesh.
void set_vertex(const VertexHandle &_vh, const VecT &_p)
Set the coordinates of point _vh.
const VecT & vertex(const VertexHandle &_vh) const
Get point _vh's coordinates.
VertexHandle add_vertex() override
Override of empty add_vertex function.