diff --git a/src/surface.c b/src/surface.c index 342efcf..aa76d09 100644 --- a/src/surface.c +++ b/src/surface.c @@ -9,31 +9,45 @@ #define M_PI 3.14159265358979323846 #endif -void mobius(float *d_surface, int i, int j, int grid_size) +void mobius(float *d_surface, int * coord, int grid_size) { const float width = 0.5; - float u = (2 * M_PI) * ((float)i / grid_size); - float v = (2 * width) * ((float)j / grid_size) - width; + 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 i, int j, int grid_size) +void torus(float *d_surface, int * coord, int grid_size) { - float u = (2 * M_PI) * ((float)i / grid_size); - float v = (2 * M_PI) * ((float)j / 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 i, int j, int grid_size) +void torus_5d(float *d_surface, int * coord, int grid_size) { - float u = (2 * M_PI) * ((float)i / grid_size); - float v = (2 * M_PI) * ((float)j / grid_size); + float u = (2 * M_PI) * ((float)coord[0] / grid_size); + float v = (2 * M_PI) * ((float)coord[1] / grid_size); + float r1 = (float)coord[2] / grid_size; + float r2 = (float)coord[3] / grid_size; + + d_surface[0] = (r1 + r2 * cos(v)) * cos(u); + d_surface[1] = (r1 + r2 * cos(v)) * sin(u); + d_surface[2] = r2 * sin(v); + d_surface[3] = r1; + d_surface[4] = r2; +} + +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); @@ -41,7 +55,7 @@ void klein(float *d_surface, int i, int j, int grid_size) d_surface[3] = sin(v) * sin(u / 2); } -typedef void (*function_t)(float *, int, int, int); +typedef void (*function_t)(float *, int *, int); float *generate_data_surface(int grid_size, unsigned char *m) { @@ -52,6 +66,7 @@ float *generate_data_surface(int grid_size, unsigned char *m) f = klein; *m = 4; + size = grid_size * grid_size * 6 * (*m); d_surface = malloc((size + 1) * sizeof(float)); d_surface[0] = size; @@ -61,19 +76,19 @@ float *generate_data_surface(int grid_size, unsigned char *m) for (j = 0; j < grid_size; j++) { // triangle 1, Front - f(&d_surface[k + 1], i, j, grid_size); + f(&d_surface[k + 1], (int[2]){i, j}, grid_size); k += *m; - f(&d_surface[k + 1], i + 1, j, grid_size); + f(&d_surface[k + 1], (int[2]){i + 1, j}, grid_size); k += *m; - f(&d_surface[k + 1], i + 1, j + 1, grid_size); + f(&d_surface[k + 1], (int[2]){i + 1, j + 1}, grid_size); k += *m; // triangle 2, Back - f(&d_surface[k + 1], i, j, grid_size); + f(&d_surface[k + 1], (int[2]){i, j}, grid_size); k += *m; - f(&d_surface[k + 1], i, j + 1, grid_size); + f(&d_surface[k + 1], (int[2]){i, j + 1}, grid_size); k += *m; - f(&d_surface[k + 1], i + 1, j + 1, grid_size); + f(&d_surface[k + 1], (int[2]){i + 1, j + 1}, grid_size); k += *m; } }