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, 0, 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 % 3];
out[i] = g[h & 3];
h /= 3;
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;


ret = w = 0, r = 1;
sum(r, n[j]);
r *= (s = scale_u[d]);
for (s = 0, j = 0; j < d; j++) s += n[j];
s *= scale_u[d];
for (j = 0; j < d; j++) u[j] = x[j] + r - n[j];


for (i = 0; i <= d; i++) {
for (j = 0; j < d; j++)
u[j] = x[j] + s - n[j];


for (ret = 0, i = 0; i <= d; i++) {
for (t = (d + 1.) / (2 * d), j = 0; j < d; j++) {
for (t = (d + 1.) / (2 * d), j = 0; j < d; j++)
t -= u[j] * u[j];
if ((t -= u[j] * u[j]) <= 0) break;
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]]++, u[o[i]]--;
n[o[i]]++;
for (j = 0; j < d; j++) u[j] += s;
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 ws, r = 0, v[2];
double r = 0, v[2];


for (i = 1, ws = 0; i <= 64; i <<= 1) {
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, ws;
double r = 0, v[3], w;


for (i = 1, ws = 0; i <= 8; i <<= 1) {
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) / 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);
if (w > 0) *p = 50;


w = get_noise3(x, y, z);
w = get_noise3(x, y, z);
if (w < 0) continue;


w = (1.5 + x - y + z) / 3.5;
w = (w + 1) / 2;
w *= (1 + x - y + z) / 3.5;
if (w < 0) w = 0;

*p = w * 255;
*p = w * 255;
}
}