Вот пример ЛОГИЧЕСКОЙ реализации тривиальной линейной интерполяции Лагранжа:
Код: Выделить всё
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;
}
Позиция аргумента всегда находится в диапазоне 0,0. f - 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);
}
Подробнее здесь: https://stackoverflow.com/questions/483 ... gned-chars
Мобильная версия