123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #pragma once
- #include <Mathematics/DCPQuery.h>
- #include <Mathematics/Circle3.h>
- namespace WwiseGTE
- {
- template <typename Real>
- class DCPQuery<Real, Vector3<Real>, Circle3<Real>>
- {
- public:
-
-
-
-
-
-
- struct Result
- {
- Real distance, sqrDistance;
- Vector3<Real> circleClosest;
- bool equidistant;
- };
- Result operator()(Vector3<Real> const& point, Circle3<Real> const& circle)
- {
- Result result;
-
- Vector3<Real> PmC = point - circle.center;
- Vector3<Real> QmC = PmC - Dot(circle.normal, PmC) * circle.normal;
- Real lengthQmC = Length(QmC);
- if (lengthQmC > (Real)0)
- {
- result.circleClosest = circle.center + (circle.radius / lengthQmC) * QmC;
- result.equidistant = false;
- }
- else
- {
-
-
- Vector3<Real> basis[3];
- basis[0] = circle.normal;
- ComputeOrthogonalComplement(1, basis);
- result.circleClosest = circle.center + circle.radius * basis[1];
- result.equidistant = true;
- }
- Vector3<Real> diff = point - result.circleClosest;
- result.sqrDistance = Dot(diff, diff);
- result.distance = std::sqrt(result.sqrDistance);
- return result;
- }
- };
- }
|