Draw a sphere: Difference between revisions
Content added Content deleted
m (→{{header|REXX}}: change internal subroutine name. -- ~~~~) |
(→Fun with 3D noise texture: Reverted the "small changes", as they resoulted in a worse, probably incorrect picture. I might have made a mistake.) |
||
Line 326: | Line 326: | ||
#define MAXD 8 |
#define MAXD 8 |
||
int g[] = { -1, |
int g[] = { -1, 1, -1, 1 }; |
||
/* Perlin-like noise */ |
/* Perlin-like noise */ |
||
inline void |
inline void |
||
Line 348: | Line 348: | ||
# undef ror |
# undef ror |
||
for (i = len; i--; ) { |
for (i = len; i--; ) { |
||
out[i] = g[h |
out[i] = g[h & 3]; |
||
h |
h >>= 2; |
||
} |
} |
||
} |
} |
||
Line 368: | Line 368: | ||
register int i, j; |
register int i, j; |
||
int n[MAXD], o[MAXD], g[MAXD], tmp; |
int n[MAXD], o[MAXD], g[MAXD], tmp; |
||
double s, r, t, ret, u[MAXD]; |
double s, r, t, w, ret, u[MAXD]; |
||
sum(s, x[j]); |
sum(s, x[j]); |
||
Line 385: | Line 385: | ||
tmp = o[i], o[i] = o[j], o[j] = tmp; |
tmp = o[i], o[i] = o[j], o[j] = tmp; |
||
⚫ | |||
sum(r, n[j]); |
|||
for (s = 0, j = 0; j < d; j++) s += n[j]; |
|||
s *= scale_u[d]; |
|||
⚫ | |||
for (i = 0; i <= d; i++) { |
|||
⚫ | |||
u[j] = x[j] + s - n[j]; |
|||
for (t = (d + 1.) / (2 * d), j = 0; j < d; j++) { |
|||
t -= u[j] * u[j]; |
|||
if |
if (t <= 0) break; |
||
} |
|||
if (t >= 0) { |
if (t >= 0) { |
||
Line 398: | Line 402: | ||
hashed(n, g, d); |
hashed(n, g, d); |
||
for (j = 0; j < d; j++) |
for (j = 0; j < d; j++) |
||
if (g[j] == 1) |
if (g[j]) r += (g[j] == 1 ? u[j] : -u[j]); |
||
r += u[j]; |
|||
else if (g[j] == -1) |
|||
r -= u[j]; |
|||
t *= t; |
t *= t; |
||
ret += r * t * t; |
ret += r * t * t; |
||
Line 408: | Line 408: | ||
if (i < d) { |
if (i < d) { |
||
n[o[i]]++ |
n[o[i]]++; |
||
s += scale_u[d]; |
|||
} |
} |
||
} |
} |
||
Line 417: | Line 417: | ||
double get_noise2(double x, double y) |
double get_noise2(double x, double y) |
||
{ |
{ |
||
int i; |
int i, ws; |
||
double |
double r = 0, v[2]; |
||
for (i = 1, ws = 0; i <= |
for (i = 1, ws = 0; i <= 128; i <<= 1) { |
||
v[0] = x * i, v[1] = y * i; |
v[0] = x * i, v[1] = y * i; |
||
r += noise(v, 2); |
r += noise(v, 2); |
||
Line 431: | Line 431: | ||
double get_noise3(double x, double y, double z) |
double get_noise3(double x, double y, double z) |
||
{ |
{ |
||
int i; |
int i, ws; |
||
double r = 0, v[3], w |
double r = 0, v[3], w; |
||
for (i = 1, ws = 0; i <= |
for (i = 1, ws = 0; i <= 32; i <<= 1) { |
||
v[0] = x * i, v[1] = y * i, v[2] = z * i; |
v[0] = x * i, v[1] = y * i, v[2] = z * i; |
||
w = 1./sqrt(i); |
w = 1./sqrt(i); |
||
Line 451: | Line 451: | ||
FILE *fp; |
FILE *fp; |
||
ddd = atoi(v[1]); |
|||
noise_init(); |
noise_init(); |
||
Line 459: | Line 460: | ||
for (j = 0; j < 256; j++, p++) { |
for (j = 0; j < 256; j++, p++) { |
||
x = (j - 128) / 125.; |
x = (j - 128) / 125.; |
||
*p = (get_noise2(i/256., j/256.) + 1) / 6 * i; |
|||
*p = (get_noise2(i/256., j/256.) + 1) * 100; |
|||
z = 1- x*x - y*y; |
z = 1- x*x - y*y; |
||
Line 466: | Line 466: | ||
z = sqrt(z); |
z = sqrt(z); |
||
w = get_noise3(x, y, -z); |
|||
⚫ | |||
w = get_noise3(x, y, z); |
w = get_noise3(x, y, z); |
||
⚫ | |||
w = ( |
w = (w + 1) / 2; |
||
w *= (1 + x - y + z) / 3.5; |
|||
⚫ | |||
*p = w * 255; |
*p = w * 255; |
||
} |
} |