#ifndef HYPER_RECTANGLE_IMPL_H_ #define HYPER_RECTANGLE_IMPL_H_ #define __TEMPLATE__ template #define __HyperRectangle__ HyperRectangle __TEMPLATE__ __HyperRectangle__::HyperRectangle(PivotData &pivot_data) { min_ = pivot_data.min_; max_ = pivot_data.max_; pivot_dimension_ = pivot_data.pivot_dimension_; pivot_value_=pivot_data.pivot_value_; } __TEMPLATE__ HyperRectangle &__HyperRectangle__::operator= (HyperRectangle &hr) { this->min_ = hr.min_; this->max_ = hr.max_; pivot_dimension_ = hr.pivot_dimension_; pivot_value_ = hr.pivot_value_; return *this; } __TEMPLATE__ void *__HyperRectangle__::operator new(size_t size) { return ALLOCATOR::allocator->AllignedAlloc(size); } __TEMPLATE__ void __HyperRectangle__::operator delete(void *p) { } __TEMPLATE__ template inline bool __HyperRectangle__::IsWithin( POINTTYPE point, int32 dimension, PRECISION range, ComputationsCounter &comp) { // non overlaping at all for(int32 i=0; i max_[i] || point[i] < min_[i]) { return false; } } PRECISION closest_projection = max_[0]-min_[0]; for(int32 i=0; i projection1 ) { closest_projection = projection1; } comp.UpdateComparisons(); if (closest_projection > projection2 ) { closest_projection = projection2; } comp.UpdateComparisons(); if (range >= closest_projection * closest_projection) { // Overlapping return false ; } } // Completelly inside return true; } __TEMPLATE__ inline PRECISION __HyperRectangle__::IsWithin( HyperRectangle &hr, int32 dimension, PRECISION range, ComputationsCounter &comp) { PRECISION closest_projection = numeric_limits::max(); for(int32 i=0; i range) { return 0; } return (sqrt(range) - closest_projection) * (sqrt(range) - closest_projection); } __TEMPLATE__ template inline bool __HyperRectangle__::CrossesBoundaries( POINTTYPE point, int32 dimension, PRECISION range, ComputationsCounter &comp) { PRECISION closest_point_coordinate; PRECISION dist = 0; for(int32 i=0; i min_[i]) { closest_point_coordinate = point[i]; } else { closest_point_coordinate = max_[i]; } } dist +=(closest_point_coordinate - point[i]) * (closest_point_coordinate - point[i]); comp.UpdateComparisons(); if (dist > range ) { return false; } } return dist <= range; } __TEMPLATE__ template inline PRECISION __HyperRectangle__::Distance(POINTTYPE1 point1, POINTTYPE2 point2, int32 dimension) { PRECISION distance = 0; for(int32 i=0; i< dimension; i++) { distance+=(point1[i]-point2[i]) * (point1[i]-point2[i]); } return distance; } __TEMPLATE__ inline PRECISION __HyperRectangle__::Distance( HyperRectangle &hr1, HyperRectangle &hr2, int32 dimension, ComputationsCounter &comp) { PRECISION dist=0; comp.UpdateDistances(); for(int32 i=0; i0) { dist += d2*d2 ; continue; } if (d4<0) { dist += d4*d4; } } return dist; } __TEMPLATE__ inline PRECISION __HyperRectangle__::Distance( HyperRectangle &hr1, HyperRectangle &hr2, PRECISION threshold_distance, int32 dimension, ComputationsCounter &comp) { PRECISION dist=0; comp.UpdateDistances(); for(int32 i=0; i0) { dist += d2*d2; if (dist > threshold_distance) { return numeric_limits::max(); } else { continue; } } if (d4<0) { dist += d4*d4; if (dist > threshold_distance) { return numeric_limits::max(); } } } return dist; } __TEMPLATE__ template inline pair, typename ALLOCATOR:: template Ptr > __HyperRectangle__:: ClosestChild(typename ALLOCATOR::template Ptr left, typename ALLOCATOR::template Ptr right, POINTTYPE point, int32 dimension, ComputationsCounter &comp) { comp.UpdateComparisons(); if (point[pivot_dimension_] < pivot_value_) { return make_pair(left, right); } else { return make_pair(right, left); } } __TEMPLATE__ string __HyperRectangle__::Print(int32 dimension) { char buf[8192]; sprintf(buf, "max: "); string str; str.append(buf); for(int32 i=0; i