Пример #1
0
void BLI_jitter_init(float (*jitarr)[2], int num)
{
	float (*jit2)[2];
	float num_fl, num_fl_sqrt;
	float x, rad1, rad2, rad3;
	RNG *rng;
	int i;

	if (num == 0) {
		return;
	}

	num_fl = (float)num;
	num_fl_sqrt = sqrtf(num_fl);

	jit2 = MEM_mallocN(12 + (unsigned int)num * sizeof(float[2]), "initjit");
	rad1 = 1.0f        / num_fl_sqrt;
	rad2 = 1.0f        / num_fl;
	rad3 = num_fl_sqrt / num_fl;

	rng = BLI_rng_new(31415926 + (unsigned int)num);

	x = 0;
	for (i = 0; i < num; i++) {
		jitarr[i][0] =                 x + rad1 * (float)(0.5 - BLI_rng_get_double(rng));
		jitarr[i][1] = (float)i / num_fl + rad1 * (float)(0.5 - BLI_rng_get_double(rng));
		x += rad3;
		x -= floorf(x);
	}

	BLI_rng_free(rng);

	for (i = 0; i < 24; i++) {
		BLI_jitterate1(jitarr, jit2, num, rad1);
		BLI_jitterate1(jitarr, jit2, num, rad1);
		BLI_jitterate2(jitarr, jit2, num, rad2);
	}

	MEM_freeN(jit2);
	
	/* finally, move jittertab to be centered around (0, 0) */
	for (i = 0; i < num; i++) {
		jitarr[i][0] -= 0.5f;
		jitarr[i][1] -= 0.5f;
	}
}
Пример #2
0
/* modified copy from rayshade.c */
static void hammersley_create(float *out, int n, int seed, float amount)
{
	RNG *rng;
	double p, t, offs[2];
	int k, kk;

	rng = BLI_rng_new(31415926 + n + seed);
	offs[0] = BLI_rng_get_double(rng) + (double)amount;
	offs[1] = BLI_rng_get_double(rng) + (double)amount;
	BLI_rng_free(rng);

	for (k = 0; k < n; k++) {
		t = 0;
		for (p = 0.5, kk = k; kk; p *= 0.5, kk >>= 1)
			if (kk & 1) /* kk mod 2 = 1 */
				t += p;

		out[2*k + 0] = fmod((double)k/(double)n + offs[0], 1.0);
		out[2*k + 1] = fmod(t + offs[1], 1.0);
	}
}