#include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif typedef void(*function_t)(float*,int, int, int); void mobius(float *d_surface, int i, int j, 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; 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 toro(float *d_surface, int i, int j, int grid_size) { float u = (2*M_PI) * ((float)i/grid_size ); float v = (2*M_PI) * ((float)j/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) { float u = (2*M_PI) * ((float)i/grid_size ); float v = (2*M_PI) * ((float)j/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[2] = sin(v)*sin(u/2); } float * generate_surface(int grid_size) { long size = grid_size*grid_size*2*3*3*2; function_t f = klein; float * d_surface; int k=0; d_surface = malloc((size+1)*sizeof(float)); d_surface[0] = size; for (int i = 0; i < grid_size; i++) { for (int j = 0; j < grid_size; j++) { // triangle 1, front f(&d_surface[k + 1], i, j, grid_size); k+=3; f(&d_surface[k + 1], i + 1, j, grid_size); k+=3; f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=3; // triangle 1, back f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=3; f(&d_surface[k + 1], i + 1, j, grid_size); k+=3; f(&d_surface[k + 1], i, j, grid_size); k+=3; // triangle 2, font f(&d_surface[k + 1], i, j, grid_size); k+=3; f(&d_surface[k + 1], i, j + 1, grid_size); k+=3; f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=3; // triangle 2, back f(&d_surface[k + 1], i + 1, j + 1, grid_size); k+=3; f(&d_surface[k + 1], i, j + 1, grid_size); k+=3; f(&d_surface[k + 1], i, j, grid_size); k+=3; } } return d_surface; }