C++, линейная интерполяция между беззнаковыми символамиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 C++, линейная интерполяция между беззнаковыми символами

Сообщение Anonymous »

Неожиданно для меня я столкнулся со странной проблемой:

Вот пример ЛОГИЧЕСКОЙ реализации тривиальной линейной интерполяции Лагранжа:

Код: Выделить всё

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,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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»