#include #include #include #define CGLM_ALL_UNALIGNED #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif #ifndef CMPLX #define CMPLX(a,b) (a+I*b) #endif void riemman(float *d_surface, int * coords, int grid_size) { complex double eq; float u = 2 * ((float)coords[0] / grid_size) - 1; float v = 2 * ((float)coords[1] / grid_size) - 1; eq = csqrt(CMPLX(u,v)); d_surface[0] = u; d_surface[1] = v; d_surface[2] = creal(eq); d_surface[3] = cimag(eq); } void cube( float *d_surface, int * coord, int grid_size ) { unsigned char i; for(int i=0; i<4; i++ ) d_surface[i]=(float)coord[i]/grid_size; } void mobius(float *d_surface, int * coord, int grid_size) { const float width = 0.5; float u = (2 * M_PI) * ((float)coord[0] / grid_size); float v = (2 * width) * ((float)coord[1] / grid_size) - width; d_surface[0] = cos(u) + v * cos(u / 2) * cos(u); d_surface[1] = sin(u) + v * cos(u / 2) * sin(u); d_surface[2] = v * sin(u / 2); } void torus(float *d_surface, int * coord, int grid_size) { float u = (2 * M_PI) * ((float)coord[0] / grid_size); float v = (2 * M_PI) * ((float)coord[1] / grid_size); d_surface[0] = (1 + 0.5 * cos(v)) * cos(u); d_surface[1] = (1 + 0.5 * cos(v)) * sin(u); d_surface[2] = 0.5 * sin(v); } void klein(float *d_surface, int * coord, int grid_size) { float u = (2 * M_PI) * ((float)coord[0] / grid_size); float v = (2 * M_PI) * ((float)coord[1]/ grid_size); d_surface[0] = (0.5 * cos(v) + 0.5) * cos(u); d_surface[1] = (0.5 * cos(v) + 0.5) * sin(u); d_surface[2] = sin(v) * cos(u / 2); d_surface[3] = sin(v) * sin(u / 2); } typedef void (*function_t)(float *, int *, int); float *generate_data_surface(int grid_size, unsigned char *s) { unsigned int i, j, k, o, p, l, n, m; long size, q=0; function_t f; float *d_surface; const int dim =2; int cara[dim]; char bits[dim+1]; bits[dim]=0; f =klein ; *s = 4; size = grid_size * grid_size * 6 * (*s) * 24; d_surface = malloc((size + 1) * sizeof(float)); d_surface[0] = size; for(o = 0; o < dim; o ++) { for (p = 0; p < o; p++) { for (k = 0; k < (1 << (dim-2)); k++) { unsigned char skip=0; for(n = 0; n < dim-2; n++) { if( n==(o-1) || n==p ) skip++; cara[n+skip] = (k & (1<