c ++,无符号字符之间的线性插值

时间:2018-01-18 12:55:04

标签: c++ casting

出乎意料的是,我遇到了一个奇怪的问题:

以下是平凡线性拉格朗日插值的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;
}

参数x0x1始终在0 - 255范围内 参数位置始终在0.0f - 1.0f范围内。

我真的尝试了大量的实现(使用不同的演员等),但它在我的情况下不起作用!它返回不正确的结果(看起来像变量溢出或类似的东西。在互联网上寻找解决方案一整周后我决定问。可能有人遇到过类似的问题。

我正在使用MSVC 2017编译器(除语言级别外,大多数参数都是默认值) 操作系统 - Windows 10x64,Little Endian。

我做错了什么以及可能的问题来源是什么?

更新: 看起来这个问题比我预期的要深(感谢您的回复)。

这是微型github项目的链接,它展示了我的问题: https://github.com/elRadiance/altitudeMapVisualiser

输出bmp文件应包含平滑的高度图。而不是它,它包含垃圾。如果我只使用x0或x1作为插值函数的结果(没有插值),它就可以工作。没有它 - 不会(产生垃圾)。

期望的结果(如此处,但插值颜色,平滑)
Desired result (as here, but in interpolated colors, smooth)

实际结果(更新,取得最佳效果)
Actual result (updated, best result achieved)

运行它的主要类:

#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);
}

提前谢谢!

1 个答案:

答案 0 :(得分:0)

解决:谢天谢地@wololo。我的项目中的错误不在计算中。

我应该用选项“binary”打开文件:

file.open("test.bin", std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);

如果没有它,数据中的某些点可能会遇到值为10的字节 在Windows环境中,它可以像LineFeed一样处理,并更改为13