123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // David Eberly, Geometric Tools, Redmond WA 98052
- // Copyright (c) 1998-2020
- // Distributed under the Boost Software License, Version 1.0.
- // https://www.boost.org/LICENSE_1_0.txt
- // https://www.geometrictools.com/License/Boost/LICENSE_1_0.txt
- // Version: 4.0.2019.08.13
- #pragma once
- #include <Mathematics/Delaunay2Mesh.h>
- #include <Mathematics/IntpQuadraticNonuniform2.h>
- #include <memory>
- // Given points (x0[i],y0[i]) which are mapped to (x1[i],y1[i]) for
- // 0 <= i < N, interpolate positions (xIn,yIn) to (xOut,yOut).
- namespace WwiseGTE
- {
- template <typename InputType, typename ComputeType, typename RationalType>
- class IntpVectorField2
- {
- public:
- // Construction and destruction.
- ~IntpVectorField2() = default;
- IntpVectorField2(int numPoints, Vector2<InputType> const* domain,
- Vector2<InputType> const* range)
- :
- mMesh(mDelaunay)
- {
- // Repackage the output vectors into individual components. This
- // is required because of the format that the quadratic
- // interpolator expects for its input data.
- mXRange.resize(numPoints);
- mYRange.resize(numPoints);
- for (int i = 0; i < numPoints; ++i)
- {
- mXRange[i] = range[i][0];
- mYRange[i] = range[i][1];
- }
- // Common triangulator for the interpolators.
- mDelaunay(numPoints, &domain[0], (ComputeType)0);
- // Create interpolator for x-coordinate of vector field.
- mXInterp = std::make_unique<IntpQuadraticNonuniform2<InputType, TriangleMesh>>(
- mMesh, &mXRange[0], (InputType)1);
- // Create interpolator for y-coordinate of vector field, but share the
- // already created triangulation for the x-interpolator.
- mYInterp = std::make_unique<IntpQuadraticNonuniform2<InputType, TriangleMesh>>(
- mMesh, &mYRange[0], (InputType)1);
- }
- // The return value is 'true' if and only if (xIn,yIn) is in the
- // convex hull of the input domain points, in which case the
- // interpolation is valid.
- bool operator()(Vector2<InputType> const& input, Vector2<InputType>& output) const
- {
- InputType xDeriv, yDeriv;
- return (*mXInterp)(input, output[0], xDeriv, yDeriv)
- && (*mYInterp)(input, output[1], xDeriv, yDeriv);
- }
- protected:
- typedef Delaunay2Mesh<InputType, ComputeType, RationalType> TriangleMesh;
- Delaunay2<InputType, ComputeType> mDelaunay;
- TriangleMesh mMesh;
- std::vector<InputType> mXRange;
- std::vector<InputType> mYRange;
- std::unique_ptr<IntpQuadraticNonuniform2<InputType, TriangleMesh>> mXInterp;
- std::unique_ptr<IntpQuadraticNonuniform2<InputType, TriangleMesh>> mYInterp;
- };
- }
|