Компенсация продуктов аппаратной трассировки лучей с фиксированной точкой

Я пытаюсь воспроизвести реализацию целочисленного исчисления пересечения лучей и треугольников, и я основываю свой код на работе Йоханнеса Ханики (https://jo.dreggn.org/home/2007_master.pdf).).

Но у меня возникла проблема, которая, я думаю, заключается в следующих строках реализации Ханики:

long long int u = (long long int)e1p*kq - (long long int)e1q*kp;
long long int v = (long long int)e2q*kp - (long long int)e2p*kq;

Я считаю, что эти продукты должны иметь какую-то компенсацию, что-то вроде сдвига вправо на (m - 1), как в других разделах кода.

Я сделал эту компенсацию в своем коде, и она работает только таким образом.

Кто-нибудь здесь когда-нибудь реализовывал этот свой код? Или есть предположения по этой проблеме?


person Jorgeluis    schedule 31.07.2019    source источник


Ответы (1)


В документе на странице 30 говорится, что kp и kq являются целыми значениями. При работе с фиксированной точкой вам нужно нормализовать только при умножении двух значений фиксированной точки вместе.

int kp = O[p] + ((t*omega[p]) >> (m-1)) - pp;
int kq = O[q] + ((t*omega[q]) >> (m-1)) - pq;
long long int u = (long long int)e1p*kq - (long long int)e1q*kp;
long long int v = (long long int)e2q*kp - (long long int)e2p*kq;
person Michael Dorgan    schedule 31.07.2019
comment
Строго говоря, только если показатель степени целевого значения не равен сумме показателей степени операндов. - person John McFarlane; 01.08.2019
comment
e1p, e1q, e2p, e2q также являются фиксированными точками, как указано на странице 27, внутри определения структуры: (int e1q, e2q; // фиксированная точка со знаком) и (int e1p, e2p; // in (-2^ -Е, 2^-Е)) - person Jorgeluis; 01.08.2019