Полагаю, OP хочет использовать весь диапазон uint16_t
, т.е. 0 ... 65535.
В этом случае значения высоты должны быть смещены и масштабированы до нового диапазона, то есть масштаб (макс. - мин.) -> 65535, и перевод мин. -> 0.
Это может выглядеть так:
value - min
pixel = ----------- * 65535
max - min
В коде:
#include <cstdint>
#include <iomanip>
#include <iostream>
std::uint16_t floatToUInt16(float value, float min, float max)
{
return (std::uint16_t)((value - min) / (max - min) * 65535.0f);
}
int main()
{
float min = -49.77f, max = 357.84f;
// some test values
float values[] = { 0.0f, min, max, min / 2, max / 2 };
// test conversion
for (float value : values) {
std::cout << std::fixed << std::setw(10) << value
<< " -> "
<< std::setw(5) << floatToUInt16(value, min, max)
<< '\n';
}
return 0;
}
Выход:
0.000000 -> 8001
-49.770000 -> 0
357.839996 -> 65535
-24.885000 -> 4000
178.919998 -> 36768
Живая демоверсия на coliru
Если бы это было сделано в цикле, я бы немного его оптимизировал.
Следовательно, 66535.0f / (max - min)
- это фиксированный коэффициент, применяемый ко всем значениям высоты.
Так что стоит посчитать этот коэффициент перед входом в цикл.