intersect.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:3k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // intersect.h
  2. //
  3. // Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
  4. //
  5. // Intersection calculation for various geometric objects.
  6. //
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the GNU General Public License
  9. // as published by the Free Software Foundation; either version 2
  10. // of the License, or (at your option) any later version.
  11. #ifndef _CELMATH_INTERSECT_H_
  12. #define _CELMATH_INTERSECT_H_
  13. #include "ray.h"
  14. #include "sphere.h"
  15. #include "ellipsoid.h"
  16. template<class T> bool testIntersection(const Ray3<T>& ray,
  17.                                         const Sphere<T>& sphere,
  18.                                         T& distance)
  19. {
  20.     Vector3<T> diff = ray.origin - sphere.center;
  21.     T s = (T) 1.0 / square(sphere.radius);
  22.     T a = ray.direction * ray.direction * s;
  23.     T b = ray.direction * diff * s;
  24.     T c = diff * diff * s - (T) 1.0;
  25.     T disc = b * b - a * c;
  26.     if (disc < 0.0)
  27.         return false;
  28.     disc = (T) sqrt(disc);
  29.     T sol0 = (-b + disc) / a;
  30.     T sol1 = (-b - disc) / a;
  31.     if (sol0 > 0)
  32.     {
  33.         if (sol0 < sol1 || sol1 < 0)
  34.             distance = sol0;
  35.         else
  36.             distance = sol1;
  37.         return true;
  38.     }
  39.     else if (sol1 > 0)
  40.     {
  41.         distance = sol1;
  42.         return true;
  43.     }
  44.     else
  45.     {
  46.         return false;
  47.     }
  48. }
  49. template<class T> bool testIntersection(const Ray3<T>& ray,
  50.                                         const Sphere<T>& sphere,
  51.                                         T& distanceToTester,
  52.                                         T& cosAngleToCenter)
  53. {
  54.     if (testIntersection(ray, sphere, distanceToTester))
  55.     {
  56.         cosAngleToCenter    = (sphere.center - ray.origin)*ray.direction/(sphere.center - ray.origin).length();
  57.         return true;
  58.     }
  59.     return false;
  60. }
  61. template<class T> bool testIntersection(const Ray3<T>& ray,
  62.                                         const Ellipsoid<T>& e,
  63.                                         T& distance)
  64. {
  65.     Vector3<T> diff = ray.origin - e.center;
  66.     Vector3<T> s((T) 1.0 / square(e.axes.x),
  67.                  (T) 1.0 / square(e.axes.y),
  68.                  (T) 1.0 / square(e.axes.z));
  69.     Vector3<T> sdir(ray.direction.x * s.x,
  70.                     ray.direction.y * s.y,
  71.                     ray.direction.z * s.z);
  72.     Vector3<T> sdiff(diff.x * s.x, diff.y * s.y, diff.z * s.z);
  73.     T a = ray.direction * sdir;
  74.     T b = ray.direction * sdiff;
  75.     T c = diff * sdiff - (T) 1.0;
  76.     T disc = b * b - a * c;
  77.     if (disc < 0.0)
  78.         return false;
  79.     disc = (T) sqrt(disc);
  80.     T sol0 = (-b + disc) / a;
  81.     T sol1 = (-b - disc) / a;
  82.     if (sol0 > 0)
  83.     {
  84.         if (sol0 < sol1 || sol1 < 0)
  85.             distance = sol0;
  86.         else
  87.             distance = sol1;
  88.         return true;
  89.     }
  90.     else if (sol1 > 0)
  91.     {
  92.         distance = sol1;
  93.         return true;
  94.     }
  95.     else
  96.     {
  97.         return false;
  98.     }
  99. }
  100. template<class T> bool testIntersection(const Ray3<T>& ray,
  101.                                         const Ellipsoid<T>& ellipsoid,
  102.                                         T& distanceToTester,
  103.                                         T& cosAngleToCenter)
  104. {
  105.     if (testIntersection(ray, ellipsoid, distanceToTester))
  106.     {
  107.         cosAngleToCenter  = (ellipsoid.center - ray.origin)*ray.direction/(ellipsoid.center - ray.origin).length();
  108.         return true;
  109.     }
  110.     return false;
  111. }
  112. #endif // _CELMATH_INTERSECT_H_