geolib2
Mesh.cpp
Go to the documentation of this file.
1 #include "geolib/Mesh.h"
2 #include "geolib/math_types.h"
3 
4 #include <map>
5 
6 namespace geo {
7 
10 }
11 
13 }
14 
15 unsigned int Mesh::addPoint(double x, double y, double z) {
16  return addPoint(Vector3(x, y, z));
17 }
18 
19 unsigned int Mesh::addPoint(const geo::Vector3& p) {
20  std::size_t i = points_.size();
21  points_.push_back(p);
23  return i;
24 }
25 
26 void Mesh::addTriangle(unsigned int i1, unsigned int i2, unsigned int i3) {
27  triangles_i_.push_back(TriangleI(i1, i2, i3));
29 }
30 
31 void Mesh::add(const Mesh& mesh) {
32  unsigned int i_start = points_.size();
33  points_.insert(points_.end(), mesh.points_.begin(), mesh.points_.end());
34 
35  for(std::vector<TriangleI>::const_iterator it = mesh.triangles_i_.begin(); it != mesh.triangles_i_.end(); ++it) {
36  triangles_i_.push_back(TriangleI(it->i1_ + i_start, it->i2_ + i_start, it->i3_ + i_start));
37  }
38 
40 }
41 
43  return points_;
44 }
45 
47  return triangles_i_;
48 }
49 
51  if (triangles_cache_.empty()) {
52  for(std::vector<TriangleI>::const_iterator it = triangles_i_.begin(); it != triangles_i_.end(); ++it) {
53  triangles_cache_.push_back(Triangle(points_[it->i1_], points_[it->i2_], points_[it->i3_]));
54  }
55  }
56  return triangles_cache_;
57 }
58 
60  Mesh m;
61  m.triangles_i_ = this->triangles_i_;
62  m.points_.resize(this->points_.size());
63 
64  for(unsigned int i = 0; i < points_.size(); ++i) {
65  m.points_[i] = t * points_[i];
66  }
67  return m;
68 }
69 
75 struct CompareVec3i {
77  bool operator() (const Vec3i &a, const Vec3i &b) const {
78  if (a.x != b.x) return a.x < b.x;
79  if (a.y != b.y) return a.y < b.y;
80  return a.z < b.z;
81  }
82 };
83 
85  std::vector<Vector3> old_points = points_;
86  points_.clear();
87 
89  std::vector<int> i_map(old_points.size());
90 
91  for(unsigned int j = 0; j < old_points.size(); ++j) {
92  const Vector3 &v = old_points[j];
93 
94  int ix = 1000 * v.x;
95  int iy = 1000 * v.y;
96  int iz = 1000 * v.z;
97 
98  Vec3i v3int(ix, iy, iz);
99  std::map<Vec3i, int>::iterator iter = xyz_map.find(v3int);
100  if (iter != xyz_map.end()) {
101  i_map[j] = iter->second;
102  } else {
103  int ip = this->addPoint(v);
104  xyz_map[v3int] = ip;
105  i_map[j] = ip;
106  }
107  }
108 
109  for(std::vector<TriangleI>::iterator it = triangles_i_.begin(); it != triangles_i_.end(); ++it) {
110  it->i1_ = i_map[it->i1_];
111  it->i2_ = i_map[it->i2_];
112  it->i3_ = i_map[it->i3_];
113  }
114 }
115 
117  if (max_radius_squared_cache_ == 0) {
118  for(std::vector<Vector3>::const_iterator it = points_.begin(); it != points_.end(); ++it) {
120  }
121  }
123 }
124 
125 double Mesh::getMaxRadius() const {
126  if (max_radius_cache_ == 0) {
128  }
129  return max_radius_cache_;
130 }
131 
132 const geo::Vector3 Mesh::getTriangleNormal(unsigned int index) const {
133  const geo::TriangleI& t = getTriangleIs()[index];
134 
135  const geo::Vector3& p1 = points_[t.i1_];
136  const geo::Vector3& p2 = points_[t.i2_];
137  const geo::Vector3& p3 = points_[t.i3_];
138 
139  return ((p3 - p1).cross(p2 - p1)).normalized();
140 }
141 
142 }
geo::Vector3::y
const real & y() const
Definition: matrix.h:32
math_types.h
geo::Vector3
Vec3 Vector3
Definition: datatypes.h:32
geo::Mesh::max_radius_squared_cache_
double max_radius_squared_cache_
Cached squared maximum radius.
Definition: Mesh.h:134
std::vector::resize
T resize(T... args)
geo::Mesh::Mesh
Mesh()
Definition: Mesh.cpp:8
geo::Mesh::getTriangleNormal
const geo::Vector3 getTriangleNormal(unsigned int index) const
Calculates the nornaml of a triangle in the mesh.
Definition: Mesh.cpp:132
geo
Definition: Box.h:6
geo::Mesh::getTriangleIs
const std::vector< TriangleI > & getTriangleIs() const
Definition: Mesh.cpp:46
t
Timer t
a
void a()
std::vector
std::map::find
T find(T... args)
std::vector::size
T size(T... args)
geo::Vec3T
Definition: math_types.h:13
geo::Mesh::triangles_cache_
std::vector< Triangle > triangles_cache_
Cached output result.
Definition: Mesh.h:140
geo::CompareVec3i
Definition: Mesh.cpp:75
geo::Mesh::add
void add(const Mesh &mesh)
Definition: Mesh.cpp:31
geo::Mesh::getMaxRadius
double getMaxRadius() const
Definition: Mesh.cpp:125
geo::Mesh::getSquaredMaxRadius
double getSquaredMaxRadius() const
Definition: Mesh.cpp:116
std::vector::clear
T clear(T... args)
std::vector::push_back
T push_back(T... args)
geo::TriangleI
Definition: Mesh.h:11
geo::Mesh::getPoints
const std::vector< geo::Vector3 > & getPoints() const
Definition: Mesh.cpp:42
geo::Mesh::getTransformed
Mesh getTransformed(const geo::Transform t) const
Definition: Mesh.cpp:59
geo::Mesh::addPoint
unsigned int addPoint(double x, double y, double z)
Definition: Mesh.cpp:15
geo::Mesh::getTriangles
const std::vector< Triangle > & getTriangles() const
Definition: Mesh.cpp:50
geo::Triangle
Definition: Triangle.h:10
geo::Mesh::invalidateCache
void invalidateCache()
Definition: Mesh.h:143
geo::Transform
Definition: matrix.h:170
geo::Vector3
Definition: matrix.h:12
map
geo::Vector3::z
const real & z() const
Definition: matrix.h:33
geo::CompareVec3i::operator()
bool operator()(const Vec3i &a, const Vec3i &b) const
Definition: Mesh.cpp:77
geo::Mesh::triangles_i_
std::vector< TriangleI > triangles_i_
Triangles of the mesh.
Definition: Mesh.h:138
geo::Mesh::~Mesh
virtual ~Mesh()
Definition: Mesh.cpp:12
Mesh.h
b
void b()
geo::Mesh::max_radius_cache_
double max_radius_cache_
Cached maximum radius.
Definition: Mesh.h:133
geo::Mesh::filterOverlappingVertices
void filterOverlappingVertices()
Definition: Mesh.cpp:84
std::vector::begin
T begin(T... args)
std::vector::insert
T insert(T... args)
geo::Mesh::addTriangle
void addTriangle(unsigned int i1, unsigned int i2, unsigned int i3)
Definition: Mesh.cpp:26
geo::Vector3::x
const real & x() const
Definition: matrix.h:31
std::size_t
std::vector::end
T end(T... args)
geo::Mesh::points_
std::vector< geo::Vector3 > points_
Points of the mesh.
Definition: Mesh.h:136
std::max
T max(T... args)
geo::Mesh
Definition: Mesh.h:25