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

OpenGL

开发平台:

Visual C++

  1. // distance.h
  2. //
  3. // Copyright (C) 2002, Chris Laurel <claurel@shatters.net>
  4. //
  5. // Distance 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_DISTANCE_H_
  12. #define _CELMATH_DISTANCE_H_
  13. #include "mathlib.h"
  14. #include "ray.h"
  15. #include "sphere.h"
  16. #include "ellipsoid.h"
  17. template<class T> T distance(const Point3<T>& p, const Sphere<T>& s)
  18. {
  19.     return abs(s.center.distanceTo(p) - s.radius);
  20. }
  21. template<class T> T distance(const Point3<T>& p, const Ellipsoid<T>& e)
  22. {
  23.     return 0.0f;
  24. }
  25. template<class T> T distance(const Point3<T>& p, const Ray3<T>& r)
  26. {
  27.     T t = ((p - r.origin) * r.direction) / (r.direction * r.direction);
  28.     if (t <= 0)
  29.         return p.distanceTo(r.origin);
  30.     else
  31.         return p.distanceTo(r.point(t));
  32. }
  33. // Distance between a point and a segment defined by orig+dir*t, 0 <= t <= 1
  34. template<class T> T distanceToSegment(const Point3<T>& p,
  35.       const Point3<T>& origin,
  36.       const Vector3<T>& direction)
  37. {
  38.     T t = ((p - origin) * direction) / (direction * direction);
  39.     if (t <= 0)
  40.         return p.distanceTo(origin);
  41.     else if (t >= 1)
  42.         return p.distanceTo(origin + direction);
  43.     else
  44.         return p.distanceTo(origin + direction * t);
  45. }
  46. #endif // _CELMATH_DISTANCE_H_