#include #include #include #define KLEIN_IMPLEMENT #include #include #include #ifndef CMPLX #define CMPLX(a, b) (a + I * b) #endif complex float f(complex float z) { return csqrt(z); } void riemman(float *d_surface, int *coords, unsigned char *grid) { complex float eq; float u = 2 * ((float)coords[0] / grid[0]) - 1; float v = 2 * ((float)coords[1] / grid[1]) - 1; eq = f(CMPLX(u, v)); d_surface[0] = u; d_surface[1] = v; d_surface[2] = creal(eq); d_surface[3] = cimag(eq); } int main(void) { const char *file_name = "riemman.klein"; struct klein klein; struct parm parametrization = { .grid = (unsigned char[]){16, 4}, .m = 2, .n = 4, .f = riemman, }; printf("writing %s\n", file_name); klein_parametrize(&klein, parametrization); klein_normalize(&klein); klein_export_file(klein, file_name); free(klein.vertex); free(klein.normals); return 0; }