93 lines
2.0 KiB
C
93 lines
2.0 KiB
C
#include <math.h>
|
|
#include <stdio.h>
|
|
|
|
#define KLEIN_IMPLEMENT
|
|
#include <klein/klein.h>
|
|
#include <klein/norm.h>
|
|
#include <klein/parm.h>
|
|
|
|
#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 = (2 * M_PI) * ((float)coord[0] / grid[0]);
|
|
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 < 3; ++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;
|
|
}
|