IntrRay2Circle2.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. // David Eberly, Geometric Tools, Redmond WA 98052
  2. // Copyright (c) 1998-2020
  3. // Distributed under the Boost Software License, Version 1.0.
  4. // https://www.boost.org/LICENSE_1_0.txt
  5. // https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
  6. // Version: 4.0.2019.08.13
  7. #pragma once
  8. #include <Mathematics/IntrIntervals.h>
  9. #include <Mathematics/IntrLine2Circle2.h>
  10. #include <Mathematics/Ray.h>
  11. // The queries consider the circle to be a solid (disk).
  12. namespace WwiseGTE
  13. {
  14. template <typename Real>
  15. class TIQuery<Real, Ray2<Real>, Circle2<Real>>
  16. {
  17. public:
  18. struct Result
  19. {
  20. bool intersect;
  21. };
  22. Result operator()(Ray2<Real> const& ray, Circle2<Real> const& circle)
  23. {
  24. Result result;
  25. FIQuery<Real, Ray2<Real>, Circle2<Real>> rcQuery;
  26. result.intersect = rcQuery(ray, circle).intersect;
  27. return result;
  28. }
  29. };
  30. template <typename Real>
  31. class FIQuery<Real, Ray2<Real>, Circle2<Real>>
  32. :
  33. public FIQuery<Real, Line2<Real>, Circle2<Real>>
  34. {
  35. public:
  36. struct Result
  37. :
  38. public FIQuery<Real, Line2<Real>, Circle2<Real>>::Result
  39. {
  40. // No additional information to compute.
  41. };
  42. Result operator()(Ray2<Real> const& ray, Circle2<Real> const& circle)
  43. {
  44. Result result;
  45. DoQuery(ray.origin, ray.direction, circle, result);
  46. for (int i = 0; i < result.numIntersections; ++i)
  47. {
  48. result.point[i] = ray.origin + result.parameter[i] * ray.direction;
  49. }
  50. return result;
  51. }
  52. protected:
  53. void DoQuery(Vector2<Real> const& rayOrigin,
  54. Vector2<Real> const& rayDirection, Circle2<Real> const& circle,
  55. Result& result)
  56. {
  57. FIQuery<Real, Line2<Real>, Circle2<Real>>::DoQuery(rayOrigin,
  58. rayDirection, circle, result);
  59. if (result.intersect)
  60. {
  61. // The line containing the ray intersects the disk; the
  62. // t-interval is [t0,t1]. The ray intersects the disk as long
  63. // as [t0,t1] overlaps the ray t-interval [0,+infinity).
  64. std::array<Real, 2> rayInterval = { (Real)0, std::numeric_limits<Real>::max() };
  65. FIQuery<Real, std::array<Real, 2>, std::array<Real, 2>> iiQuery;
  66. auto iiResult = iiQuery(result.parameter, rayInterval);
  67. result.intersect = iiResult.intersect;
  68. result.numIntersections = iiResult.numIntersections;
  69. result.parameter = iiResult.overlap;
  70. }
  71. }
  72. };
  73. }