Я разрабатываю платформу без математической библиотеки, поэтому мне нужно создать собственные инструменты. Мой текущий способ получения фракции - преобразовать float в фиксированную точку (умножить на (float) 0xFFFF, cast to int), получить только нижнюю часть (маску с 0xFFFF) и снова преобразовать ее обратно в float.
Однако неточность убивает меня. Я использую функции Frac() и InvFrac() для создания сглаженной линии. Используя modf
, я получаю совершенно гладкую линию. С моим собственным методом пиксели начинают прыгать из-за потери точности.
Это мой код:
const float fp_amount = (float)(0xFFFF);
const float fp_amount_inv = 1.f / fp_amount;
inline float Frac(float a_X)
{
return ((int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
inline float Frac(float a_X)
{
return (0xFFFF - (int)(a_X * fp_amount) & 0xFFFF) * fp_amount_inv;
}
Спасибо заранее!