97 lines
2.1 KiB
C
97 lines
2.1 KiB
C
#include <stdio.h>
|
|
#include <math.h>
|
|
#include <stdlib.h>
|
|
|
|
#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 torus(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[3] = sin(v)*sin(u/2);
|
|
}
|
|
|
|
float * generate_surface(int grid_size, unsigned char *m )
|
|
{
|
|
unsigned int i,j,k=0;
|
|
long size;
|
|
function_t f;
|
|
float * d_surface;
|
|
|
|
f = klein;
|
|
*m = 4;
|
|
size = grid_size*grid_size*12*(*m);
|
|
d_surface = malloc((size+1)*sizeof(float));
|
|
d_surface[0] = size;
|
|
|
|
|
|
for( i = 0; i < grid_size; i++)
|
|
{
|
|
for( j = 0; j < grid_size; j++)
|
|
{
|
|
// triangle 1, Front
|
|
f(&d_surface[k + 1], i, j, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i + 1, j, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i + 1, j + 1, grid_size);
|
|
k+=*m;
|
|
|
|
// triangle 1, Back
|
|
f(&d_surface[k + 1], i + 1, j + 1, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i + 1, j, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i, j, grid_size);
|
|
k+=*m;
|
|
|
|
// triangle 2, Frontt
|
|
f(&d_surface[k + 1], i + 1, j + 1, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i, j + 1, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i, j, grid_size);
|
|
k+=*m;
|
|
|
|
// triangle 2, Back
|
|
f(&d_surface[k + 1], i, j, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i, j + 1, grid_size);
|
|
k+=*m;
|
|
f(&d_surface[k + 1], i + 1, j + 1, grid_size);
|
|
k+=*m;
|
|
}
|
|
}
|
|
|
|
return d_surface;
|
|
}
|