}
public void castPhotons(long n, ProgressMonitor monitor, long progressInterval) {
long untilCallback = 0;
Random rng = new SimpleRandom();
int sqrt = (int) Math.floor(Math.sqrt(n));
int nbox = sqrt * sqrt;
for (int i = 0; i < n; i++) {
if (--untilCallback <= 0) {
double progress = (double) i / (double) n;
if (!monitor.notifyProgress(progress)) {
monitor.notifyCancelled();
return;
}
untilCallback = progressInterval;
}
double ru = rng.next();
double rv = rng.next();
double rj = rng.next();
if (i < nbox) {
ru = (((double) (i % sqrt)) + ru) / (double) sqrt;
rv = (((double) (i / sqrt)) + rv) / (double) sqrt;
}