#include #include #define KLEIN_IMPLEMENT #include #include #include #ifndef M_PI #define M_PI 3.14159265358979323846 #endif void cube(float *d_surface, int *coord, unsigned char *grid) { int i; for (i = 0; i < 4; i++) d_surface[i] = (2 * (float)coord[i] / grid[i]) - 1; if (4 == 2) d_surface[2] = 0; } void mobius(float *d_surface, int *coord, unsigned char *grid) { const float width = 0.5; float u = (2 * M_PI) * ((float)coord[0] / grid[0]); float v = (2 * width) * ((float)coord[1] / grid[1]) - 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, unsigned char *grid) { float u = (M_PI) * ((float)coord[0] / grid[0]) + M_PI; float v = (2 * M_PI) * ((float)coord[1] / grid[1]); 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, unsigned char *grid) { float u = (2 * M_PI) * ((float)coord[0] / grid[0]); float v = (2 * M_PI) * ((float)coord[1] / grid[1]); 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); } int main(void) { unsigned char i = 0; const char *file_name[] = {"mobius.klein", "torus.klein", "klein.klein"}; struct parm parametrization[] = { { .grid = (unsigned char[]){16, 4}, .m = 2, .n = 3, .f = mobius, }, { .grid = (unsigned char[]){16, 8}, .m = 2, .n = 3, .f = torus, }, { .grid = (unsigned char[]){16, 16}, .m = 2, .n = 4, .f = klein, }, }; for (i = 0; i < 4; ++i) { struct klein klein; printf("writing %s\n", file_name[i]); klein_parametrize(&klein, parametrization[i]); klein_normalize(&klein); klein_export_file(klein, file_name[i]); free(klein.vertex); free(klein.normals); } return 0; }