aiura con R^n

This commit is contained in:
roberto.mc
2024-11-27 19:08:57 -06:00
parent 6c5e2a9a29
commit 7888c06c41
2 changed files with 64 additions and 1 deletions

BIN
src/main.o Normal file

Binary file not shown.

View File

@@ -82,6 +82,38 @@ float *generate_data_surface(int grid_size, unsigned char *m)
return d_surface;
}
/* pa' rearmar la funcion _calc_normal te entendi que creara las funciones de cglm artesanalmente, entonces ps eso hago xd */
void subtract(const float *v1, const float *v2, float *result, unsigned char n)
{
for (unsigned char i = 0; i < n; i++) {
result[i] = v1[i] - v2[i];
}
}
float dot_product(const float *a, const float *b, unsigned char n)
{
float result = 0.0f;
for (unsigned char i = 0; i < n; i++) {
result += a[i] * b[i];
}
return result;
}
void escalar_product(float a, const float *v1, float *result, unsigned char n)
{
for (unsigned char i = 0; i < n; i++) {
result[i] = a * v1[i];
}
}
void norm(const float *v1, float *result, unsigned char n)
{
float lenght = sqrtf(dot_product(v1, v1, n));
float inv_lenght = 1.0f / lenght;
escalar_product(inv_lenght, v1, result, n);
}
static void __calculate_normal(
float *p1, float *p2, float *p3, float *normal, unsigned char n)
{
@@ -190,7 +222,7 @@ static void __calculate_normal(
return;
}
}
/*
float *generate_normals_surface(float *d, unsigned char m)
{
float *n;
@@ -209,3 +241,34 @@ float *generate_normals_surface(float *d, unsigned char m)
}
return n;
}
*/
// Ando bien perdido u.u
float *generate_normals_surface(const float *d, unsigned char m)
{
float *n = malloc((*d + 1) * sizeof(float));
*n = *d;
float v1[m], v2[m], normal[m];
for (int i = 0; i < *d; i += 3 * m)
{
const float *A = (d + 1) + i;
const float *B = (d + 1) + i + m;
const float *C = (d + 1) + i + 2 * m;
subtract(B, A, v1, m);
subtract(C, A, v2, m);
for (unsigned char j = 0; j < m; j++) {
normal[j] = v1[(j + 1) % m] * v2[(j + 2) % m] - v1[(j + 2) % m] * v2[(j + 1) % m];
}
norm(normal, normal, m);
for (unsigned char j = 0; j < m; j++) {
(n + 1)[i + j] = normal[j];
(n + 1)[i + m + j] = normal[j];
(n + 1)[i + 2 * m + j] = normal[j];
}
}
return n;
}