rayExit method

(double, double)? rayExit(
  1. double du,
  2. double dv
)

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;
}