我有一个模板 2D 图像缓冲区类,可以与许多值类型一起使用。这些值存储为 的一维动态数组T
,通过一种Row
方法访问以获取指向正确行的指针。
该类的方法之一用于对图像中的值进行双线性采样。
该代码通常可以工作,但是我在生产中的这种方法中很少遇到访问冲突异常,我似乎无法重新创建,因为故障转储不包括传递给该方法的坐标。
这些是代码的相关部分:
T* data;
int width, height;
T* Row(int y) const { return data + width * y; }
T GetValueBilinear(float x, float y) const
{
const float PIXEL_CENTER_OFFSET = 0.5F;
const float cx = clamp(0.0F, width - 1.0F, x - PIXEL_CENTER_OFFSET);
const float cy = clamp(0.0F, height - 1.0F, y - PIXEL_CENTER_OFFSET);
const float tx = fmod(cx, 1.0F);
const float ty = fmod(cy, 1.0F);
const int xInt = (int)cx;
const int yInt = (int)cy;
const T* r0 = Row(yInt);
const T* r1 = ty && yInt < (height - 1) ? Row(yInt + 1) : r0;
//interpolate on Y
const T& c00 = r0[xInt];
const T& c01 = r1[xInt];
T c0 = lerp(c00, c01, ty);
if (tx && xInt < (width - 1))
{
//interpolate on X
const T& c10 = r0[xInt + 1];
const T& c11 = r1[xInt + 1];
T c1 = lerp(c10, c11, ty);
return lerp(c0, c1, tx);
}
else
{
return c0;
}
}
clamp
和的定义lerp
是:
template <typename T>
inline T clamp(T min, T max, T value) { return value < min ? min : value > max ? max : value; }
template <typename T>
inline T lerp(T a, T b, float t) { return a + (b - a) * t; } //i.e. a(1-t)+bt
您是否看到任何明显的错误会导致任何非 NaN值x
的访问冲突?y
您可以假设width
,height
和data
是有效且正确的(即,正尺寸 - 在这种特殊情况下 1280x720,data
不是悬空指针)。
如果它很重要,那么在这种情况下T
就是一个。float
这是不可重现的,并且通常 99.9% 的时间都可以正常工作,这让我觉得这可能是一个准确性问题,尽管我看不出它来自哪里。
或者,我可以使用哪些调试技术来更有效地分析故障转储?