Actualizar src/surface.c
This commit is contained in:
@@ -36,15 +36,19 @@ int write_klein_file(const char *filename, unsigned char dim, unsigned long vert
|
||||
{
|
||||
FILE *file = fopen(filename, "wb");
|
||||
if (!file)
|
||||
return 1;
|
||||
{
|
||||
perror("Error al abrir el archivo");
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// Escribir encabezado
|
||||
fwrite("KLEIN", 1, 5, file); // Los primeros 5 bytes son "KLEIN"
|
||||
fwrite("\0", 1, 1, file); // Byte vacío
|
||||
fputc(0, file); // Byte vacío
|
||||
fwrite(&dim, 1, 1, file); // Dimensión de la superficie
|
||||
fwrite(&vertex, 8, 1, file); // Número de vértices (8 bytes)
|
||||
fwrite(vertices, 16, vertex * dim, file);
|
||||
fwrite(normals, 16, vertex * dim, file);
|
||||
fwrite(&vertex, sizeof(unsigned long), 1, file); // Número de vértices (8 bytes)
|
||||
fwrite(vertices, sizeof(float), vertex * dim, file);
|
||||
fwrite(normals, sizeof(float), vertex * dim, file);
|
||||
printf("Archivo %s escrito correctamente.\n", filename);
|
||||
|
||||
fclose(file);
|
||||
return 0;
|
||||
@@ -123,17 +127,17 @@ void klein(float *d_surface, int *coord, unsigned char *grid)
|
||||
d_surface[3] = sin(v) * sin(u / 2);
|
||||
}
|
||||
|
||||
float *generate_data_surface(unsigned char *dim, unsigned long *vertex)
|
||||
float *generate_data_surface(unsigned char *dim, unsigned long *,vertex, struct parm *parm)
|
||||
{
|
||||
unsigned int i, j, k, o, p, n;
|
||||
unsigned long size, q = 0;
|
||||
float *d_surface;
|
||||
int *cara;
|
||||
|
||||
parm.f = cube;
|
||||
parm.m = 4;
|
||||
parm.n = 4;
|
||||
parm.grid = (char[]){16, 8, 4, 2, 1};
|
||||
parm->f = cube;
|
||||
parm->m = 4;
|
||||
parm->n = 4;
|
||||
parm->grid = (unsigned char[]){16, 8, 4, 2, 1};
|
||||
|
||||
#ifdef TEST
|
||||
assert(faces(2) == 1);
|
||||
@@ -141,74 +145,74 @@ float *generate_data_surface(unsigned char *dim, unsigned long *vertex)
|
||||
assert(faces(4) == 24);
|
||||
#endif
|
||||
|
||||
*dim = parm.n;
|
||||
*dim = parm->n;
|
||||
*vertex = 0;
|
||||
|
||||
{
|
||||
unsigned char test = 0;
|
||||
for (o = 0; o < parm.m; o++)
|
||||
for (o = 0; o < parm->m; o++)
|
||||
{
|
||||
for (p = 0; p < o; p++)
|
||||
{
|
||||
test += 1;
|
||||
*vertex += parm.grid[p] * parm.grid[o] * 6 * faces(parm.n);
|
||||
*vertex += parm->grid[p] * parm->grid[o] * 6 * faces(parm->n);
|
||||
}
|
||||
}
|
||||
*vertex /= test;
|
||||
}
|
||||
|
||||
cara = malloc(parm.m * sizeof(int));
|
||||
cara = malloc(parm->m * sizeof(int));
|
||||
size = (*dim) * (*vertex);
|
||||
d_surface = malloc(size * sizeof(float));
|
||||
|
||||
for (o = 0; o < parm.m; o++)
|
||||
for (o = 0; o < parm->m; o++)
|
||||
{
|
||||
for (p = 0; p < o; p++)
|
||||
{
|
||||
for (k = 0; k < (1 << (parm.m - 2)); k++)
|
||||
for (k = 0; k < (1 << (parm->m - 2)); k++)
|
||||
{
|
||||
unsigned char skip = 0;
|
||||
for (n = 0; n < parm.m; n++)
|
||||
for (n = 0; n < parm->m; n++)
|
||||
{
|
||||
if (n == o || n == p)
|
||||
skip++;
|
||||
|
||||
cara[n] = (k & (1 << (n - skip))) ? parm.grid[n] : 0;
|
||||
cara[n] = (k & (1 << (n - skip))) ? parm->grid[n] : 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < parm.grid[p]; i++)
|
||||
for (i = 0; i < parm->grid[p]; i++)
|
||||
{
|
||||
for (j = 0; j < parm.grid[o]; j++)
|
||||
for (j = 0; j < parm->grid[o]; j++)
|
||||
{
|
||||
cara[p] = i;
|
||||
cara[o] = j;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
|
||||
cara[p] = i + 1;
|
||||
cara[o] = j;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
|
||||
cara[p] = i + 1;
|
||||
cara[o] = j + 1;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
|
||||
cara[p] = i;
|
||||
cara[o] = j;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
|
||||
cara[p] = i;
|
||||
cara[o] = j + 1;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
|
||||
cara[p] = i + 1;
|
||||
cara[o] = j + 1;
|
||||
parm.f(&d_surface[q], cara, parm.grid);
|
||||
q += parm.n;
|
||||
parm->f(&d_surface[q], cara, parm->grid);
|
||||
q += parm->n;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -341,12 +345,19 @@ float *generate_normals_surface(float *d, unsigned char m, unsigned long vertex)
|
||||
}
|
||||
int main()
|
||||
{
|
||||
|
||||
struct parm parm_instance;
|
||||
parm_instance.grid = (unsigned char[]){16, 8, 4, 2, 1};
|
||||
parm_instance.m = 4;
|
||||
parm_instance.n = 4;
|
||||
parm_instance.f = cube;
|
||||
unsigned char dim;
|
||||
unsigned char dim;
|
||||
unsigned long vertex;
|
||||
float *vertices, *normals;
|
||||
|
||||
// Generar datos de la superficie
|
||||
vertices = generate_data_surface(&dim, &vertex);
|
||||
vertices = generate_data_surface(&dim, &vertex, &parm_instance);
|
||||
|
||||
// Verificar datos generados
|
||||
if (vertices == NULL) {
|
||||
|
||||
Reference in New Issue
Block a user