aabbn.h 1.48 KB
#ifndef STIM_AABB3_H
#define STIM_AABB3_H

#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

	CUDA_CALLABLE void init(T* i) {
		for (size_t d = 0; d < D; d++)
			low[d] = high[d] = i[d];
	}

//public:

	//CUDA_CALLABLE aabbn(){					//initialize an axis aligned bounding box of size 0 at the given position
	//	for(size_t d = 0; d < D; d++)
	//		low[d] = high[d] = 0;
	//}
	CUDA_CALLABLE aabbn() {}
	CUDA_CALLABLE aabbn(T* i) {
		init(i);
	}
	

	//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];
	}

	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;
	}

};

}


#endif