Developer Documentation

- Main Page
- Related Pages
- Modules
- Namespaces
- Classes
- Files

- File List
- File Members

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
NormalAttrib.hh
1 /*===========================================================================*\
2 * *
3 * OpenVolumeMesh *
4 * Copyright (C) 2011 by Computer Graphics Group, RWTH Aachen *
5 * www.openvolumemesh.org *
6 * *
7 *---------------------------------------------------------------------------*
8 * This file is part of OpenVolumeMesh. *
9 * *
10 * OpenVolumeMesh is free software: you can redistribute it and/or modify *
11 * it under the terms of the GNU Lesser General Public License as *
12 * published by the Free Software Foundation, either version 3 of *
13 * the License, or (at your option) any later version with the *
14 * following exceptions: *
15 * *
16 * If other files instantiate templates or use macros *
17 * or inline functions from this file, or you compile this file and *
18 * link it with other files to produce an executable, this file does *
19 * not by itself cause the resulting executable to be covered by the *
20 * GNU Lesser General Public License. This exception does not however *
21 * invalidate any other reasons why the executable file might be *
22 * covered by the GNU Lesser General Public License. *
23 * *
24 * OpenVolumeMesh is distributed in the hope that it will be useful, *
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
27 * GNU Lesser General Public License for more details. *
28 * *
29 * You should have received a copy of the GNU LesserGeneral Public *
30 * License along with OpenVolumeMesh. If not, *
31 * see <http://www.gnu.org/licenses/>. *
32 * *
33 \*===========================================================================*/
34
35 /*===========================================================================*\
36 * *
37 * $Revision$ *
38 * $Date$ *
39 * $LastChangedBy$ *
40 * *
41 \*===========================================================================*/
42
43 #ifndef NORMALATTRIB_HH_
44 #define NORMALATTRIB_HH_
45
46 #include <cassert>
47
48 #include "../Core/OpenVolumeMeshHandle.hh"
49 #include "OpenVolumeMeshStatus.hh"
50 #include "../Core/PropertyDefines.hh"
51
52 namespace OpenVolumeMesh {
53
54 template <class GeomKernelT>
55 class NormalAttrib {
56 public:
57
58 NormalAttrib(GeomKernelT& _kernel);
59 virtual ~NormalAttrib();
60
67 void update_vertex_normals();
68
76 void update_face_normals();
77
78 const typename GeomKernelT::PointT& operator[](const VertexHandle& _h) const {
79 assert((unsigned int)_h.idx() < kernel_.n_vertices());
80 return v_normals_[_h.idx()];
81 }
82
83 const typename GeomKernelT::PointT& operator[](const FaceHandle& _h) const {
84 assert((unsigned int)_h.idx() < kernel_.n_faces());
85 return f_normals_[_h.idx()];
86 }
87
88 const typename GeomKernelT::PointT operator[](const HalfFaceHandle& _h) const {
89 assert((unsigned int)_h.idx() < kernel_.n_halffaces());
90 double mult = 1.0;
91 if(_h.idx() % 2 == 1) mult = -1.0;
92 return f_normals_[kernel_.face_handle(_h).idx()] * mult;
93 }
94
95 typename GeomKernelT::PointT& operator[](const VertexHandle& _h) {
96 assert((unsigned int)_h.idx() < kernel_.n_vertices());
97 return v_normals_[_h.idx()];
98 }
99
100 typename GeomKernelT::PointT& operator[](const FaceHandle& _h) {
101 assert((unsigned int)_h.idx() < kernel_.n_faces());
102 return f_normals_[_h.idx()];
103 }
104
105 typename GeomKernelT::PointT operator[](const HalfFaceHandle& _h) {
106 assert((unsigned int)_h.idx() < kernel_.n_halffaces());
107 double mult = 1.0;
108 if(_h.idx() % 2 == 1) mult = -1.0;
109 return f_normals_[kernel_.face_handle(_h).idx()] * mult;
110 }
111
112 private:
113
114 void compute_vertex_normal(const VertexHandle& _vh);
115
116 void compute_face_normal(const FaceHandle& _fh);
117
118 GeomKernelT& kernel_;
119
120 VertexPropertyT<typename GeomKernelT::PointT> v_normals_;
121 FacePropertyT<typename GeomKernelT::PointT> f_normals_;
122
123 };
124
125 } // Namespace OpenVolumeMesh
126
127 #if defined(INCLUDE_TEMPLATES) && !defined(NORMALATTRIBT_CC)
128 #include "NormalAttribT.cc"
129 #endif
130
131 #endif /* NORMALATTRIB_HH_ */
OpenVolumeMesh::FaceHandle
Definition: OpenVolumeMeshHandle.hh:100
OpenVolumeMesh::FacePropertyT< typename GeomKernelT::PointT >
OpenVolumeMesh::HalfFaceHandle
Definition: OpenVolumeMeshHandle.hh:103
OpenVolumeMesh::NormalAttrib::update_face_normals
void update_face_normals()
Compute face normals.
Definition: NormalAttribT.cc:84
OpenVolumeMesh::NormalAttrib::update_vertex_normals
void update_vertex_normals()
A simple heuristic to estimate the vertex normals.
Definition: NormalAttribT.cc:68
OpenVolumeMesh::VertexPropertyT< typename GeomKernelT::PointT >
OpenVolumeMesh::VertexHandle
Definition: OpenVolumeMeshHandle.hh:98
OpenVolumeMesh
Definition: ColorAttrib.hh:53
OpenVolumeMesh::NormalAttrib
Definition: NormalAttrib.hh:55