Я пытаюсь повторно реализовать Визитная карточка Ray Tracer в ржавчине ради веселья и выгоды. Насколько я могу судить, вся логика на месте, но я не могу понять, как правильно преобразовать мои значения с плавающей запятой в байты RGB, которых ожидает формат файла ppm. В исходном коде (C ++) это выглядит так:
printf("%c%c%c",(int)p.x,(int)p.y,(int)p.z);
где p
3-й вектор с плавающей точкой, представляющий значение RGB. Мне не очень повезло с print!
так что после долгих настроек я написал эквивалентное выражение как:
let mut out = io::stdout();
out.write(&[(p.x as u8),(p.x as u8),(p.x as u8)]);
Тем не менее, вывод очень далек (я могу опубликовать его, если вы действительно хотите, но достаточно сказать, что в правильном выводе много непечатаемых символов, в то время как моя версия вполне пригодна для печати). Я, честно говоря, не понимаю нюансов преобразования типов ни для одного языка. Кто-нибудь хочет протянуть руку?
Редактировать: полный источник (обратите внимание, что я использую float в качестве векторных атрибутов)
Ваш код кажется в основном правильным (при условии, что вы не имели в виду p.x три раза).
Вот небольшая программа, показывающая печать структуры RGB, содержащей u32s в виде байтов, которая, как я проверял, работает как положено (печатает ABC \ n)
struct RGB {
x: u32,
y: u32,
z: u32
}
fn main() {
let p = RGB{ x:65, y:66, z:67};
let mut out = std::io::stdout();
out.write([p.x as u8, p.y as u8, p.z as u8, 10]);
}
Других решений пока нет …