rayExit method
Walks boundary segments to find where the ray white + s*(du, dv)
exits the slice. Returns (s, hueIndex + fraction), or null if the
slice is degenerate (tone ~0 or ~100, or a zero direction).
Implementation
(double, double)? rayExit(double du, double dv) {
final (wu, wv) = whiteUvPoint;
(double, double)? best;
for (var i = 0; i < 360; i++) {
final j = (i + 1) % 360;
final au = us[i] - wu, av = vs[i] - wv;
final bu = us[j] - wu, bv = vs[j] - wv;
final eu = bu - au, ev = bv - av;
final det = du * ev - dv * eu;
if (det.abs() < 1e-18) continue;
final t = (au * dv - av * du) / det; // along segment
final s = (au * ev - av * eu) / det; // along ray
if (t >= 0 && t < 1 && s > 0) {
if (best == null || s < best.$1) best = (s, i + t);
}
}
return best;
}