出乎意料的是,我遇到了一个奇怪的问题:
以下是平凡线性拉格朗日插值的LOGICAL实现示例:
unsigned char mix(unsigned char x0, unsigned char x1, float position){
// LOGICALLY must be something like (real implementation should be
// with casts)...
return x0 + (x1 - x0) * position;
}
参数x0
,x1
始终在0 - 255范围内
参数位置始终在0.0f - 1.0f
范围内。
我真的尝试了大量的实现(使用不同的演员等),但它在我的情况下不起作用!它返回不正确的结果(看起来像变量溢出或类似的东西。在互联网上寻找解决方案一整周后我决定问。可能有人遇到过类似的问题。
我正在使用MSVC 2017编译器(除语言级别外,大多数参数都是默认值) 操作系统 - Windows 10x64,Little Endian。
我做错了什么以及可能的问题来源是什么?
更新: 看起来这个问题比我预期的要深(感谢您的回复)。
这是微型github项目的链接,它展示了我的问题: https://github.com/elRadiance/altitudeMapVisualiser
输出bmp文件应包含平滑的高度图。而不是它,它包含垃圾。如果我只使用x0或x1作为插值函数的结果(没有插值),它就可以工作。没有它 - 不会(产生垃圾)。
运行它的主要类:
#include "Visualiser.h"
int main() {
unsigned int width = 512;
unsigned int height = 512;
float* altitudes = new float[width * height];
float c;
for (int w = 0; w < width; w++) {
c = (2.0f * w / width) - 1.0f;
for (int h = 0; h < height; h++) {
altitudes[w*height + h] = c;
}
}
Visualiser::visualiseAltitudeMap("gggggggggg.bmp", width, height, altitudes);
delete(altitudes);
}
提前谢谢!
答案 0 :(得分:0)
解决:谢天谢地@wololo。我的项目中的错误不在计算中。
我应该用选项“binary”打开文件:
file.open("test.bin", std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
如果没有它,数据中的某些点可能会遇到值为10
的字节
在Windows环境中,它可以像LineFeed一样处理,并更改为13
。