From b1897b500b219299b1a095842f796fb910471d9e Mon Sep 17 00:00:00 2001 From: islas Date: Tue, 3 Dec 2024 01:18:23 +0000 Subject: [PATCH] Actualizar src/surface.c --- src/surface.c | 77 +++++++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/src/surface.c b/src/surface.c index 1375645..d5fe8a7 100644 --- a/src/surface.c +++ b/src/surface.c @@ -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) {