Blame view

stim/visualization/aabbn.h 1.76 KB
9b563709   David Mayerich   generalized aabb ...
1
2
  #ifndef STIM_AABBN_H
  #define STIM_AABBN_H
c17d9f44   Jiaming Guo   add aabbn for sti...
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  
  #include <vector>
  #include <stim/cuda/cudatools/callable.h>
  
  namespace stim{
  
  /// Structure for a 3D axis aligned bounding box
  template<typename T, size_t D>
  struct aabbn{
  
  //protected:
  
  	T low[D];					//top left corner position
  	T high[D]; 							//dimensions along x and y and z
  
fcd2eb7c   David Mayerich   added support for...
18
19
20
  	CUDA_CALLABLE void init(T* i) {
  		for (size_t d = 0; d < D; d++)
  			low[d] = high[d] = i[d];
c17d9f44   Jiaming Guo   add aabbn for sti...
21
22
  	}
  
fcd2eb7c   David Mayerich   added support for...
23
24
25
  	CUDA_CALLABLE aabbn() {}
  	CUDA_CALLABLE aabbn(T* i) {
  		init(i);
c17d9f44   Jiaming Guo   add aabbn for sti...
26
  	}
9b563709   David Mayerich   generalized aabb ...
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
  
  	CUDA_CALLABLE aabbn(T x0, T x1) {
  		low[0] = x0;
  		high[0] = x1;
  	}
  
  	CUDA_CALLABLE aabbn(T x0, T y0, T x1, T y1) : aabbn(x0, x1) {
  		low[1] = y0;
  		high[1] = y1;
  	}
  
  	CUDA_CALLABLE aabbn(T x0, T y0, T z0, T x1, T y1, T z1) : aabbn(x0, y0, x1, y1) {
  		low[2] = z0;
  		high[2] = z1;
  	}
fcd2eb7c   David Mayerich   added support for...
42
  	
c17d9f44   Jiaming Guo   add aabbn for sti...
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  
  	//insert a point into the bounding box, growing the box appropriately
  	CUDA_CALLABLE void insert(T* p){
  		for(size_t d = 0; d < D; d++){
  			if(p[d] < low[d]) low[d] = p[d];
  			if(p[d] > high[d]) high[d] = p[d];
  		}
  	}
  
  	//trim the bounding box so that the lower bounds are b(x, y, z, ...)
  	CUDA_CALLABLE void trim_low(T* b){
  		for(size_t d = 0; d < D; d++)
  			if(low[d] < b[d]) low[d] = b[d];
  	}
  
  	CUDA_CALLABLE void trim_high(T* b){
  		for(size_t d = 0; d < D; d++)
  			if(low[d] > b[d]) low[d] = b[d];
  	}
  
fcd2eb7c   David Mayerich   added support for...
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
  	CUDA_CALLABLE T length(size_t d) {
  		return high[d] - low[d];
  	}
  
  	CUDA_CALLABLE aabbn<T, D> operator*(T s) {
  		aabbn<T, D> newbox;
  		for (size_t d = 0; d < D; d++) {
  			T c = (low[d] + high[d]) / 2;
  			T l = high[d] - low[d];
  			newbox.low[d] = c - l * s / 2;
  			newbox.high[d] = c + l * s / 2;
  		}
  		return newbox;
  	}
  
9b563709   David Mayerich   generalized aabb ...
78
79
80
81
82
83
84
85
  	//translate the box along dimension d a distance of v
  	CUDA_CALLABLE void translate(size_t d, T v) {
  		for (size_t d = 0; d < D; d++) {
  			low[d] += v;
  			high[d] += v;
  		}
  	}
  
c17d9f44   Jiaming Guo   add aabbn for sti...
86
87
88
89
90
91
  };
  
  }
  
  
  #endif