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");
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) {