/** @file data.cu.h implementation of complex device methods for structures from data.h */ #include "data.h" #include "util.h" #include "vec.h" template inline hostdevice__ fvec3 Tube_flex::skewed_pos() const { if(pos.z > 36 || pos.z < 34) return pos; float k = (35.0f - pos.z) / dir.z; return pos + k * dir; } // Tube::skewed_pos template inline hostdevice__ bool Tube_flex::has_neighbor(const Tube &tube2) const { float dist = tube_dist3d(*this, tube2); if(is_skewed() != tube2.is_skewed()) return false; //if(!is_skewed() && tube2.is_skewed()) // return false; //float max_dist = is_skewed() ? 1.1f : 1.5f; float max_dist = is_skewed() ? 1.1f : 1.5f; //float max_dist = 1.5f; const float max_ddir = 0.005f; // also check differentce between x/y direction float ddirx = fabsf(dir.x - tube2.dir.x), ddiry = fabsf(dir.y - tube2.dir.y); return dist < max_dist && ddirx <= max_ddir && ddiry <= max_ddir; } // has_neighbor inline hostdevice__ float tube_dist3d(const Tube &t1, const Tube &t2) { fvec3 lp = t1.skewed_pos(), rp = t2.skewed_pos(); float dx = lp.x - rp.x, dy = lp.y - rp.y; return sqrtf(dx * dx + dy * dy); //return dist(lp, rp); } // tube_dist3d