25 const auto numCol = layerMat.cols();
26 const auto numRow = layerMat.rows();
29 return layerMat(iBoundToRange, jBoundToRange);
42 namespace bicubic_conv {
46 double *interpolatedValue)
58 const double tx = normalizedCoordinate.x();
59 const double ty = normalizedCoordinate.y();
63 const double bm1 =
convolve1D(tx, functionValues.row(0));
64 const double b0 =
convolve1D(tx, functionValues.row(1));
65 const double b1 =
convolve1D(tx, functionValues.row(2));
66 const double b2 =
convolve1D(tx, functionValues.row(3));
67 const Eigen::Vector4d vectorBs(bm1, b0, b1, b2);
72 double convolve1D(
double t,
const Eigen::Vector4d &functionValues)
74 const Eigen::Vector4d tVector(1.0, t, t * t, t * t * t);
77 const double retVal = 0.5 * tVector.transpose() * temp;
85 Index middleKnotIndex;
90 const Matrix &layerMatrix = gridMap.
get(layer);
91 auto f = [&layerMatrix](
unsigned int rowReq,
unsigned int colReq) {
96 const unsigned int i = middleKnotIndex.x();
97 const unsigned int j = middleKnotIndex.y();
106 *data << f(i + 1, j + 1), f(i, j + 1), f(i - 1, j + 1), f(i - 2, j + 1), f(i + 1, j), f(i, j), f(
107 i - 1, j), f(i - 2, j), f(i + 1, j - 1), f(i, j - 1), f(i - 1, j - 1), f(i - 2, j - 1), f(
108 i + 1, j - 2), f(i, j - 2), f(i - 1, j - 2), f(i - 2, j - 2);
126 position->x() = (queriedPosition.x() - middleKnot.x()) / gridMap.
getResolution();
127 position->y() = (queriedPosition.y() - middleKnot.y()) / gridMap.
getResolution();
134 return gridMap.
getIndex(queriedPosition, *index);
151 const Position &queriedPosition,
double *interpolatedValue)
154 const Matrix& layerMat = gridMap.
get(layer);
193 &normalizedCoordinates)) {
199 normalizedCoordinates.y());
208 Index closestPointId;
214 if (!gridMap.
getPosition(closestPointId, closestPoint)) {
218 const int idx0 = closestPointId.x();
219 const int idy0 = closestPointId.y();
220 const double x0 = closestPoint.x();
221 const double y0 = closestPoint.y();
222 const double x = queriedPosition.x();
223 const double y = queriedPosition.y();
259 return gridMap.
getIndex(queriedPosition, *index);
271 normalizedCoordinates->x() = (queriedPosition.x() - origin.x()) / gridMap.
getResolution();
272 normalizedCoordinates->y() = (queriedPosition.y() - origin.y()) / gridMap.
getResolution();
289 const unsigned int numCol = gridMap.
getSize().y();
290 const unsigned int numRow = gridMap.
getSize().x();
337 const auto numCol{
static_cast<unsigned int>(layerData.cols())};
338 const auto numRow{
static_cast<unsigned int>(layerData.rows())};
354 throw std::runtime_error(
"Unknown derivative direction");
358 const double perturbation = resolution;
362 return (right - left) / (2.0 * perturbation) * resolution;
372 const auto numCol{
static_cast<unsigned int>(layerData.cols())};
373 const auto numRow{
static_cast<unsigned int>(layerData.rows())};
384 const double perturbation = resolution;
389 return (f11 - f1m1 - fm11 + fm1m1) / (4.0 * perturbation * perturbation) * resolution * resolution;
407 const Eigen::Vector4d xVector(1, tx, tx * tx, tx * tx * tx);
408 const Eigen::Vector4d yVector(1, ty, ty * ty, ty * ty * ty);
409 const Eigen::Matrix4d tempMat = functionValues
412 const Eigen::Vector4d tempVec = polynomialCoeffMatrix * yVector;
413 return xVector.transpose() * tempVec;
419 auto toEigenMatrix = [](
const DataMatrix &d)-> Eigen::Matrix2d {
421 e(0,0) = d.bottomLeft_;
422 e(1,0) = d.bottomRight_;
424 e(1,1) = d.topRight_;
428 functionValues->block<2, 2>(0, 0) = toEigenMatrix(f);
429 functionValues->block<2, 2>(2, 2) = toEigenMatrix(ddfxy);
430 functionValues->block<2, 2>(0, 2) = toEigenMatrix(dfy);
431 functionValues->block<2, 2>(2, 0) = toEigenMatrix(dfx);
bool getFirstOrderDerivatives(const Matrix &layerData, const IndicesMatrix &indices, Dim2D dim, double resolution, DataMatrix *derivatives)
Eigen::Matrix4d FunctionValueMatrix
void bindIndicesToRange(const GridMap &gridMap, IndicesMatrix *indices)
unsigned int bindIndexToRange(unsigned int idReq, unsigned int nElem)
bool getIndicesOfMiddleKnot(const GridMap &gridMap, const Position &queriedPosition, Index *index)
bool computeNormalizedCoordinates(const GridMap &gridMap, const Index &originIndex, const Position &queriedPosition, Position *normalizedCoordinates)
const Matrix & get(const std::string &layer) const
static const Eigen::Matrix4d bicubicInterpolationMatrix
const Size & getSize() const
double convolve1D(double t, const Eigen::Vector4d &functionValues)
static const Eigen::Matrix4d cubicInterpolationConvolutionMatrix
double firstOrderDerivativeAt(const Matrix &layerData, const Index &index, Dim2D dim, double resolution)
double getResolution() const
double mixedSecondOrderDerivativeAt(const Matrix &layerData, const Index &index, double resolution)
bool getNormalizedCoordinates(const GridMap &gridMap, const Position &queriedPosition, Position *position)
bool getFunctionValues(const Matrix &layerData, const IndicesMatrix &indices, DataMatrix *data)
bool getMixedSecondOrderDerivatives(const Matrix &layerData, const IndicesMatrix &indices, double resolution, DataMatrix *derivatives)
double evaluatePolynomial(const FunctionValueMatrix &functionValues, double tx, double ty)
double getLayerValue(const Matrix &layerMat, int rowReq, int colReq)
bool evaluateBicubicConvolutionInterpolation(const GridMap &gridMap, const std::string &layer, const Position &queriedPosition, double *interpolatedValue)
bool getClosestPointIndices(const GridMap &gridMap, const Position &queriedPosition, Index *index)
bool getUnitSquareCornerIndices(const GridMap &gridMap, const Position &queriedPosition, IndicesMatrix *indicesMatrix)
bool getIndex(const Position &position, Index &index) const
bool getPosition(const Index &index, Position &position) const
bool evaluateBicubicInterpolation(const GridMap &gridMap, const std::string &layer, const Position &queriedPosition, double *interpolatedValue)
bool assembleFunctionValueMatrix(const GridMap &gridMap, const std::string &layer, const Position &queriedPosition, FunctionValueMatrix *data)