Actualizar src/surface.c

This commit is contained in:
islas
2024-12-03 01:18:23 +00:00
parent fd598255f4
commit b1897b500b

View File

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