geolib2
Octree.cpp
Go to the documentation of this file.
1 #include "geolib/Octree.h"
2 #include "geolib/Box.h"
3 
4 namespace geo {
5 
6 Octree::Octree(double size, double resolution) : offset_(-size / 2, -size / 2, -size / 2),
7  max_(size / 2, size / 2, size / 2), size_(size), root_(new OctreeNode(size, this)) {
8  setResolution(resolution);
9 }
10 
11 Octree::Octree(const Octree& orig) : resolution_(orig.resolution_), offset_(orig.offset_),
12  max_(orig.max_), size_(orig.size_), root_(new OctreeNode(*orig.root_, this)) {
13 }
14 
16  delete root_;
17 }
18 
20  return new Octree(*this);
21 }
22 
23 void Octree::clear() {
24  delete root_;
25  root_ = new OctreeNode(size_, this);
26  mesh_.clear();
27 }
28 
29 void Octree::add(const Vector3& p) {
30  root_->add(p - offset_);
31  mesh_.clear();
32 }
33 
34 void Octree::getCubes(std::vector<Box>& cubes) const {
35  root_->getCubes(cubes, offset_);
36 }
37 
38 double Octree::setResolution(double resolution) {
40  while(resolution_ > resolution) {
41  resolution_ /= 2;
42  }
43  return resolution_;
44 }
45 
46 double Octree::getResolution() const {
47  return resolution_;
48 }
49 
50 bool Octree::intersect(const Ray& r, float t0, float t1, double& distance) const {
51  double dist;
52  if (!Box(offset_, max_).intersect(r, t0, t1, dist)) {
53  return false;
54  }
55 
56  if (dist < 0) {
57  // origin of the ray is within the root cube, so set dist to 0
58  dist = 0;
59  }
60 
61  return root_->intersect(Ray(r.getOrigin() - offset_, r.getDirection()), t0 + dist + resolution_ * 0.1, t1, distance, offset_);
62 }
63 
64 double Octree::getMaxRadius() const {
65  return size_;
66 }
67 
68 void Octree::raytrace(const Ray& r, float t0, float t1) {
69  double dist;
70  if (!Box(offset_, max_).intersect(r, t0, t1, dist)) {
71  return;
72  }
73 
74  if (dist < 0) {
75  // origin of the ray is within the root cube, so set dist to 0
76  dist = 0;
77  }
78 
79  root_->raytrace(r.getOrigin() - offset_, r.getDirection(), t0 + dist + resolution_ * 0.1, t1, offset_);
80  this->add(r.getOrigin() + r.getDirection() * t1);
81 
82  mesh_.clear();
83 }
84 
85 bool Octree::contains(const Vector3& p) const {
86  if (p.x < offset_.x || p.y < offset_.y || p.z < offset_.z
87  || p.x > max_.x || p.y > max_.y || p.z > max_.z) {
88  return false;
89  }
90 
91  return root_->contains(p - offset_);
92 }
93 
94 bool Octree::intersect(const Box& b) const {
95  const Vector3& min = b.getMin();
96  const Vector3& max = b.getMax();
97  if (max.x < offset_.x || max.y < offset_.y || max.z < offset_.z
98  || min.x > max_.x || min.y > max_.y || min.z > max_.z) {
99  return false;
100  }
101 
102  return root_->intersect(Box(Vector3(std::max(min.x, offset_.x),
103  std::max(min.y, offset_.y),
104  std::max(min.z, offset_.z)) - offset_,
105  Vector3(std::min(max.x, max_.x),
106  std::min(max.y, max_.y),
107  std::min(max.z, max_.z)) - offset_));
108 }
109 
110 const Mesh& Octree::getMesh() const {
111  if (mesh_.empty()) {
112  std::vector<Box> cubes;
113  getCubes(cubes);
114 
115  for(std::vector<Box>::iterator it = cubes.begin(); it != cubes.end(); ++it) {
116  Box& b = *it;
117  mesh_.add(b.getMesh());
118  }
119 
121  }
122 
123  return mesh_;
124 }
125 
126 }
geo::Vector3::y
const real & y() const
Definition: matrix.h:32
geo::Vector3
Vec3 Vector3
Definition: datatypes.h:32
geo::OctreeNode
Definition: OctreeNode.h:12
geo::Octree::offset_
Vector3 offset_
Definition: Octree.h:52
geo::Mesh::empty
bool empty() const
Definition: Mesh.h:67
geo::Octree::Octree
Octree(double size, double resolution=0.1)
Definition: Octree.cpp:6
geo::Octree::setResolution
double setResolution(double resolution)
Definition: Octree.cpp:38
geo::Ray::getOrigin
const Vector3 & getOrigin() const
Definition: Ray.h:16
geo
Definition: Box.h:6
geo::OctreeNode::add
void add(const Vector3 &p)
Definition: OctreeNode.cpp:31
std::vector
geo::Box
Definition: Box.h:15
geo::Octree::add
void add(const Vector3 &p)
Definition: Octree.cpp:29
geo::Mesh::add
void add(const Mesh &mesh)
Definition: Mesh.cpp:31
geo::Octree::getMesh
const Mesh & getMesh() const
return the mesh defining the shape
Definition: Octree.cpp:110
geo::Octree::OctreeNode
friend class OctreeNode
Definition: Octree.h:14
geo::Octree::getResolution
double getResolution() const
Definition: Octree.cpp:46
geo::Octree::raytrace
void raytrace(const Ray &r, float t0, float t1)
Definition: Octree.cpp:68
geo::Octree::getCubes
void getCubes(std::vector< Box > &cubes) const
Definition: Octree.cpp:34
geo::Octree::max_
Vector3 max_
Definition: Octree.h:54
geo::OctreeNode::raytrace
void raytrace(const Vector3 &o, const Vector3 &dir, float t0, float t1, const Vector3 &offset)
Definition: OctreeNode.cpp:116
geo::Mesh::clear
void clear()
Definition: Mesh.h:76
geo::Ray
Definition: Ray.h:10
geo::Octree::intersect
bool intersect(const Ray &r, float t0, float t1, double &distance) const
intersect: currently always throws a logic error
Definition: Octree.cpp:50
geo::Vector3
Definition: matrix.h:12
geo::Octree::size_
double size_
Definition: Octree.h:56
geo::Octree::contains
bool contains(const Vector3 &p) const
Determines whether a point p lies within the shape.
Definition: Octree.cpp:85
geo::Octree
Definition: Octree.h:12
geo::OctreeNode::getCubes
void getCubes(std::vector< Box > &cubes, const Vector3 &offset) const
Definition: OctreeNode.cpp:55
geo::Vector3::z
const real & z() const
Definition: matrix.h:33
geo::Octree::clear
void clear()
Definition: Octree.cpp:23
std::min
T min(T... args)
geo::Octree::clone
virtual Octree * clone() const
Definition: Octree.cpp:19
b
void b()
geo::Mesh::filterOverlappingVertices
void filterOverlappingVertices()
Definition: Mesh.cpp:84
std::vector::begin
T begin(T... args)
geo::Octree::~Octree
virtual ~Octree()
Definition: Octree.cpp:15
geo::Octree::getMaxRadius
double getMaxRadius() const
Calculate the maximum distance from the origin of the shape to any point of the shape.
Definition: Octree.cpp:64
geo::Vector3::x
const real & x() const
Definition: matrix.h:31
geo::Ray::getDirection
const Vector3 & getDirection() const
Definition: Ray.h:18
geo::OctreeNode::intersect
bool intersect(const Ray &r, float t0, float t1, double &distance, const Vector3 &offset) const
Definition: OctreeNode.cpp:74
geo::Octree::resolution_
double resolution_
Definition: Octree.h:50
Box.h
std::vector::end
T end(T... args)
Octree.h
std::max
T max(T... args)
geo::Mesh
Definition: Mesh.h:25
geo::Octree::root_
OctreeNode * root_
Definition: Octree.h:58
geo::OctreeNode::contains
bool contains(const Vector3 &p) const
Definition: OctreeNode.cpp:150
geo::Octree::mesh_
Mesh mesh_
Definition: Octree.h:60