|
auto t = (k-r.origin().y()) / r.direction().y(); |
|
if (t < t0 || t > t1) |
|
return false; |
If
r.direction().y() happens to be zero, you'll get
t=infinity. This infinity will get passed along, because
infinity > infinity is
false so the
if branch is not taken.
Additionally, if k-r.origin().y() happens to be 0 as well, you'll get 0.0 / 0.0 resulting in a NaN that again gets passed along.
This exists in all three cases of rect, with different axes being the culprit.
Caveat emptor: I bumped into this in my Rust implementation, so some specific details may be slightly different, including in case infinity & NaN semantics are slightly different in C++. But I think this should be applicable.
Offtopic sidenote: wonder if it would be worth it to make the distance be named something else than t, considering some other functions in the book use t or t0, t1 for time
raytracing.github.io/src/TheRestOfYourLife/aarect.h
Lines 124 to 126 in 7b92650
If
r.direction().y()happens to be zero, you'll gett=infinity. This infinity will get passed along, becauseinfinity > infinityisfalseso theifbranch is not taken.Additionally, if
k-r.origin().y()happens to be0as well, you'll get0.0 / 0.0resulting in aNaNthat again gets passed along.This exists in all three cases of
rect, with different axes being the culprit.Caveat emptor: I bumped into this in my Rust implementation, so some specific details may be slightly different, including in case infinity & NaN semantics are slightly different in C++. But I think this should be applicable.
Offtopic sidenote: wonder if it would be worth it to make the distance be named something else than
t, considering some other functions in the book usetort0, t1for time