Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
57
Task/Draw-a-sphere/C/draw-a-sphere-1.c
Normal file
57
Task/Draw-a-sphere/C/draw-a-sphere-1.c
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <math.h>
|
||||
|
||||
const char *shades = ".:!*oe&#%@";
|
||||
|
||||
double light[3] = { 30, 30, -50 };
|
||||
void normalize(double * v)
|
||||
{
|
||||
double len = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
|
||||
v[0] /= len; v[1] /= len; v[2] /= len;
|
||||
}
|
||||
|
||||
double dot(double *x, double *y)
|
||||
{
|
||||
double d = x[0]*y[0] + x[1]*y[1] + x[2]*y[2];
|
||||
return d < 0 ? -d : 0;
|
||||
}
|
||||
|
||||
void draw_sphere(double R, double k, double ambient)
|
||||
{
|
||||
int i, j, intensity;
|
||||
double b;
|
||||
double vec[3], x, y;
|
||||
for (i = floor(-R); i <= ceil(R); i++) {
|
||||
x = i + .5;
|
||||
for (j = floor(-2 * R); j <= ceil(2 * R); j++) {
|
||||
y = j / 2. + .5;
|
||||
if (x * x + y * y <= R * R) {
|
||||
vec[0] = x;
|
||||
vec[1] = y;
|
||||
vec[2] = sqrt(R * R - x * x - y * y);
|
||||
normalize(vec);
|
||||
b = pow(dot(light, vec), k) + ambient;
|
||||
intensity = (1 - b) * (sizeof(shades) - 1);
|
||||
if (intensity < 0) intensity = 0;
|
||||
if (intensity >= sizeof(shades) - 1)
|
||||
intensity = sizeof(shades) - 2;
|
||||
putchar(shades[intensity]);
|
||||
} else
|
||||
putchar(' ');
|
||||
}
|
||||
putchar('\n');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int main()
|
||||
{
|
||||
normalize(light);
|
||||
draw_sphere(20, 4, .1);
|
||||
draw_sphere(10, 2, .4);
|
||||
|
||||
return 0;
|
||||
}
|
||||
162
Task/Draw-a-sphere/C/draw-a-sphere-2.c
Normal file
162
Task/Draw-a-sphere/C/draw-a-sphere-2.c
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <math.h>
|
||||
|
||||
#define MAXD 8
|
||||
int g[] = { -1, 1, -1, 1 };
|
||||
/* Perlin-like noise */
|
||||
static inline void
|
||||
hashed(int *data, int *out, int len) {
|
||||
# define ror(a, d) ((a << (d)) | (a >> (32 - d)))
|
||||
register unsigned int h = 0x12345678, tmp;
|
||||
unsigned int *d = (void*)data;
|
||||
int i = len;
|
||||
|
||||
while (i--) {
|
||||
tmp = *d++;
|
||||
h += ror(h, 15) ^ ror(tmp, 5);
|
||||
}
|
||||
|
||||
h ^= ror(h, 7);
|
||||
h += ror(h, 23);
|
||||
h ^= ror(h, 19);
|
||||
h += ror(h, 11);
|
||||
h ^= ror(h, 13);
|
||||
h += ror(h, 17);
|
||||
# undef ror
|
||||
for (i = len; i--; ) {
|
||||
out[i] = g[h & 3];
|
||||
h >>= 2;
|
||||
}
|
||||
}
|
||||
|
||||
double scale[MAXD], scale_u[MAXD];
|
||||
void noise_init()
|
||||
{
|
||||
int i;
|
||||
for (i = 1; i < MAXD; i++) {
|
||||
scale[i] = 1 / (1 + sqrt(i + 1));
|
||||
scale_u[i] = scale[i] / sqrt(i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
double noise(double *x, int d)
|
||||
{
|
||||
# define sum(s, x) for (s = 0, j = 0; j < d; j++) s += x
|
||||
register int i, j;
|
||||
int n[MAXD], o[MAXD], g[MAXD], tmp;
|
||||
double s, r, t, w, ret, u[MAXD];
|
||||
|
||||
sum(s, x[j]);
|
||||
s *= scale[d];
|
||||
|
||||
for (i = 0; i < d; i++) {
|
||||
o[i] = i;
|
||||
t = x[i] + s;
|
||||
u[i] = t - (n[i] = floor(t));
|
||||
}
|
||||
o[d] = 0;
|
||||
|
||||
for (i = 0; i < d - 1; i++)
|
||||
for (j = i; j < d; j++)
|
||||
if (u[o[i]] < u[o[j]])
|
||||
tmp = o[i], o[i] = o[j], o[j] = tmp;
|
||||
|
||||
ret = w = 0, r = 1;
|
||||
for (s = 0, j = 0; j < d; j++) s += n[j];
|
||||
s *= scale_u[d];
|
||||
|
||||
for (i = 0; i <= d; i++) {
|
||||
for (j = 0; j < d; j++)
|
||||
u[j] = x[j] + s - n[j];
|
||||
|
||||
for (t = (d + 1.) / (2 * d), j = 0; j < d; j++) {
|
||||
t -= u[j] * u[j];
|
||||
if (t <= 0) break;
|
||||
}
|
||||
|
||||
if (t >= 0) {
|
||||
r = 0;
|
||||
hashed(n, g, d);
|
||||
for (j = 0; j < d; j++)
|
||||
if (g[j]) r += (g[j] == 1 ? u[j] : -u[j]);
|
||||
t *= t;
|
||||
ret += r * t * t;
|
||||
}
|
||||
|
||||
if (i < d) {
|
||||
n[o[i]]++;
|
||||
s += scale_u[d];
|
||||
}
|
||||
}
|
||||
return ret * (d * d);
|
||||
}
|
||||
|
||||
double get_noise2(double x, double y)
|
||||
{
|
||||
int i, ws;
|
||||
double r = 0, v[2];
|
||||
|
||||
for (i = 1, ws = 0; i <= 128; i <<= 1) {
|
||||
v[0] = x * i, v[1] = y * i;
|
||||
r += noise(v, 2);
|
||||
ws ++;
|
||||
}
|
||||
r /= ws;
|
||||
return r;
|
||||
}
|
||||
|
||||
double get_noise3(double x, double y, double z)
|
||||
{
|
||||
int i, ws;
|
||||
double r = 0, v[3], w;
|
||||
|
||||
for (i = 1, ws = 0; i <= 32; i <<= 1) {
|
||||
v[0] = x * i, v[1] = y * i, v[2] = z * i;
|
||||
w = 1./sqrt(i);
|
||||
r += noise(v, 3) * w;
|
||||
ws += w;
|
||||
}
|
||||
return r / ws;
|
||||
}
|
||||
|
||||
|
||||
int main(int c, char** v)
|
||||
{
|
||||
unsigned char pix[256 * 256], *p;
|
||||
int i, j;
|
||||
double x, y, z, w;
|
||||
FILE *fp;
|
||||
|
||||
noise_init();
|
||||
|
||||
for (p = pix, i = 0; i < 256 * 256; i++) *p++ = 0;
|
||||
|
||||
for (p = pix, i = 0; i < 256; i++) {
|
||||
y = (i - 128) / 125.;
|
||||
for (j = 0; j < 256; j++, p++) {
|
||||
x = (j - 128) / 125.;
|
||||
*p = (get_noise2(i/256., j/256.) + 1) / 6 * i;
|
||||
|
||||
z = 1- x*x - y*y;
|
||||
if (z < 0) continue;
|
||||
|
||||
z = sqrt(z);
|
||||
|
||||
w = get_noise3(x, y, z);
|
||||
|
||||
w = (w + 1) / 2;
|
||||
w *= (1 + x - y + z) / 3.5;
|
||||
if (w < 0) w = 0;
|
||||
|
||||
*p = w * 255;
|
||||
}
|
||||
}
|
||||
|
||||
fp = fopen("out.pgm", "w+");
|
||||
fprintf(fp, "P5\n256 256\n255\n");
|
||||
fwrite(pix, 1, 256 * 256, fp);
|
||||
fclose(fp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue