Angular interpolation does not return original values
Hi, I've been trying to understand openvds interpolation behavior and noticed the following.
Interpolation documentation says that
The sampled value will be exactly equal to the original at the voxel center, regardless of the interpolation method used.
But I observe on my synthetic file test.vds that this doesn't hold. For the voxel middle points 4 methods return same data (as I would expect), but angular interpolation returns something different.
#include <OpenVDS/OpenVDS.h>
#include <OpenVDS/VolumeDataLayout.h>
#include <OpenVDS/VolumeDataAccess.h>
#include <iostream>
#include <map>
int main(int argc, char *argv[]) {
/*
| xlines-ilines | 1 | 3 | 5 |
|---------------|--------------------|--------------------|--------------------|
| 10 | 100, 101, 102, 103 | 108, 109, 110, 111 | 116, 117, 118, 119 |
| 11 | 104, 105, 106, 107 | 112, 113, 114, 115 | 120, 121, 122, 123 |
*/
std::string url = "file://test.vds";
std::string connectionString = "";
OpenVDS::Error error;
OpenVDS::VDSHandle handle = OpenVDS::Open(url, connectionString, error);
OpenVDS::VolumeDataAccessManager accessManager = OpenVDS::GetAccessManager(handle);
OpenVDS::VolumeDataLayout const *layout = accessManager.GetVolumeDataLayout();
int sampleCount0 = layout->GetDimensionNumSamples(0);
int traceCount = 1;
// Angular is correct only for (1.5, 0.5)
float inlineValue = 2.5; // choose from 0.5, 1.5 and 2.5
float xlineValue = 1.5; // choose from 0.5 and 1.5
std::vector<float> buffer(traceCount * sampleCount0);
float tracePos[traceCount][6];
for (int trace = 0; trace < traceCount; trace++)
{
tracePos[trace][0] = 0;
tracePos[trace][1] = xlineValue;
tracePos[trace][2] = inlineValue;
tracePos[trace][3] = 0;
tracePos[trace][4] = 0;
tracePos[trace][5] = 0;
}
std::map<std::string, OpenVDS::InterpolationMethod> interpolations{
{"Nearest", OpenVDS::InterpolationMethod::Nearest},
{"Linear", OpenVDS::InterpolationMethod::Linear},
{"Cubic", OpenVDS::InterpolationMethod::Cubic},
{"Triangular", OpenVDS::InterpolationMethod::Triangular},
{"Angular", OpenVDS::InterpolationMethod::Angular}
};
for (const auto& interpolation : interpolations) {
auto request = accessManager.RequestVolumeTraces(
buffer.data(),
buffer.size() * sizeof(float),
OpenVDS::Dimensions_12, // I understand it doesn't matter if it is Dimensions_12 or Dimensions_012
0,
0,
tracePos,
traceCount,
interpolation.second,
0
);
request.get()->WaitForCompletion();
std::cout << "Interpolation " << interpolation.first <<": " ;
for (float f: buffer) {
std::cout << f << ' ';
}
std::cout << "\n" << std::flush;
}
}
(my openvds version is some 3.1-ish build, but I do not see anything about changes to angular interpolation in release notes, so I assume it's the same)
Am I doing something wrong?