Guest User

Untitled

a guest
Nov 16th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #ifndef HEADER_RAY_H__
  2. #define HEADER_RAY_H__
  3.  
  4. #include "v.h"
  5.  
  6. template<class T> class Ray
  7. {
  8. private:
  9.         bool f_intersected;
  10. public:
  11.         V<T> r;
  12.         V<T> d;
  13.  
  14.         Ray(const T& x1, const T& y1, const T& z1, const T& x2, const T& y2, const T& z2) : r(x1, y1, z1), d(x2, y2, z2)
  15.         {
  16.                 f_intersected = true;
  17.         }
  18.  
  19.         bool isIntersected()
  20.         {
  21.                 return f_intersected;
  22.         }
  23.  
  24.         V<T> xyPlaneIntersection(const T& th)
  25.         {
  26.                 V<T> v;
  27.                 T dist = th - r.z;
  28.                 v.x = r.x + dist * d.x / d.z;
  29.                 v.y = r.y + dist * d.y / d.z;
  30.                 v.z = th;
  31.                 return v;
  32.         }
  33.        
  34.         bool intersectsRectangle(const T& th, const T& a, const T& b)
  35.         {
  36.                 V<T> v = xyPlaneIntersection(th);
  37.                 bool intrsct = (v.x >= -a / 2.0) && (v.x <= a / 2.0) && (v.y >= -b / 2.0) && (v.y <= b / 2.0);
  38.                 f_intersected = f_intersected && intrsct;
  39.                 return intrsct;
  40.         }
  41.  
  42.         bool intersectsCircle(const T& th, const T&  r)
  43.         {
  44.                 V<T> v = xyPlaneIntersection(th);
  45.                 auto tr = v.x * v.x + v.y * v.y;
  46.                 bool intrsct = tr <= r * r;
  47.                 f_intersected = f_intersected && intrsct;
  48.                 return intrsct;
  49.         }
  50.  
  51.         template<class Ang> bool intersectsSphere(const T& tH, const T& tR, const Ang& salf, const Ang& sbet)
  52.         {
  53.                 T l = tH + tR;
  54.                 T fx = l * sin(salf) / sqrt(1.0 + tan(sbet)*tan(sbet) * cos(salf)*cos(salf));
  55.                 T fy = l * sin(sbet) / sqrt(1.0 + tan(salf)*tan(salf) * cos(sbet)*cos(sbet));
  56.                 double sgn = 1;
  57.                 if (cos(salf) < 0.0 || cos(sbet) < 0.0)
  58.                 {
  59.                         sgn = -1.0;
  60.                 }
  61.                 T fz = sgn * l / sqrt(1.0 + tan(salf) * tan(salf) + tan(sbet) * tan(sbet));
  62.  
  63.                 auto as = d.x * d.x + d.y * d.y + d.z * d.z;
  64.                 auto bs = 2.0 * (d.x * (r.x - fx) + d.y * (r.y - fy) + d.z * (r.z - fz));
  65.                 auto cs = (r.x - fx) * (r.x - fx) +
  66.                               (r.y - fy) * (r.y - fy) +
  67.                                   (r.z - fz) * (r.z - fz)- tR * tR;
  68.  
  69.                 bool intrsct = false;
  70.                 auto Ds = (bs * bs - 4.0 * as * cs);
  71.                 decltype(Ds) zero(0);
  72.                 if (Ds >= zero)
  73.                 {
  74.                         auto tau = (-bs + sqrt(Ds)) / 2.0 / as;
  75.                         T x = r.x + tau * d.x;
  76.                         T y = r.y + tau * d.y;
  77.                         T z = r.z + tau * d.z;
  78.                         intrsct = z >= T(0);
  79.                 }
  80.                 f_intersected = f_intersected && intrsct;
  81.                 return intrsct;
  82.         }
  83. };
Add Comment
Please, Sign In to add comment