0

Tengo el siguiente código que genera una cuadrícula de cubos, primero se genera una estructura para un punto 3-dimensional el cual es usado en la función principal al construir en cada paso un cubo, pero al compilar tengo problema, tiene que ver con la estructura al guardar el valor de las coordenadas en la matriz

 #include <cstdio>  
 #include <iostream>    
 #include <math.h>              
 #include <cstdlib>     
 #include <fstream>     
 #include <conio.h>         

 using namespace std;


 typedef struct {

   float x;
   float y;
   float z;
 } point3D;


 int main(){
    float x_size, xe, xs, y_size, ye, ys, z_size, ze, zs, x_step, y_step, z_step, n_step;
    int n;

    n_step = 1e5;

    xe = 0.0;
    xs = 10.0;

 x_size = xs - xe;   // Tamaño
 y_size = ys - ye;
 z_size = zs - ze;

 x_step = x_size/n_step;
 y_step = y_size/n_step;   // # de pasos
 z_step = z_size/n_step;

 n = n_step + 1;    // Aumento de los pasos

 point3D grid[n*n*n];       //Alloc o malloc

 for (int i = 0; i < n; i++) { //move on x axis

   for (int j = 0; j < n; j++) { //move on y axis

     for (int k = 0; k < n; k++) { //move on z axis

       point3D p;
       p.x = xs + x_step * i;
       p.y = ys + y_step * j;
       p.z = zs + z_step * k;
       grid[i+n*j+n*n*k] = point3D;
     } 
   }
 }
    getch();
 return 0;
    }

Un cubo tiene 8 vértices los cuales se obtienen de las combinación de los iteradores for (i,j,k), grupos de 8 puntos son las esquinas de cada cubo, y asi, hasta el n-ésimo paso.

Necesito una función que defina cada cubo a partir de sus esquinas

 (x, y, z)
 1: (0, 0, 0)
 2: (0, 0, 1)
 3: (0, 1, 0)  
 4: (0, 1, 1)
 5: (1, 0, 0)
 6: (1, 0, 1)
 7: (1, 1, 0)
 8: (1, 1, 1)
juan
  • 7
  • 4

1 Answers1

1

Necesito una función que defina cada cubo a partir de sus esquinas.

Fácil y sencillo:

std::array<point3D, 8> cubo(const point3D &posicion, float tamanyo) {
    return {{
        { posicion.x,           posicion.y,           posicion.z },
        { posicion.x,           posicion.y,           posicion.z + tamanyo },
        { posicion.x,           posicion.y + tamanyo, posicion.z },
        { posicion.x,           posicion.y + tamanyo, posicion.z + tamanyo },
        { posicion.x + tamanyo, posicion.y,           posicion.z },
        { posicion.x + tamanyo, posicion.y,           posicion.z + tamanyo },
        { posicion.x + tamanyo, posicion.y + tamanyo, posicion.z },
        { posicion.x + tamanyo, posicion.y + tamanyo, posicion.z + tamanyo }
    }};
}

posicion sería la esquina donde se encuentra el cubo, tamanyo sería la distancia que se extiende el cubo en cada eje. La función devuelve una colección de point3D con cada una de las esquinas del cubo.

Otras cosas a tener en cuenta.

  • No mezcles cabeceras de C en tu programa C++: Las cabeceras <math.h> y <conio.h> son de C no deben ser usadas en C++, en su lugar debes usar la versión adaptada a C++ que es <cmath>. Lee este hilo para saber más del tema.
    • La cabecera <conio.h> además de no ser una cabecera C++, no es una cabecera estándar, no deberías usarla. Lee este hilo para saber más del tema.
  • No incluyas cabeceras que no vas a usar: Incluir cabeceras de las que no usas nada, tiene un impacto en tus tiempos de compilación… la cabecera <cstdio> da acceso a funciones de entrada y salida de datos, lo mismo que <iostream>; si incluyes una no deberías incluir la otra. La cabecera <cstdlib> da acceso a (entre otras cosas) funciones de gestión de memoria, ni <cstdio> ni <cstdlib> son necesarias en tu código y además son cabeceras de C que ofrecen funcionalidades que ya están cubiertas en cabeceras de C++.
  • Procura no abusar de la cláusula using namespace std;, si la usas: hazlo en el ámbito más pequeño posible, no en el ámbito global.
  • En C++ las estructuras (struct) son tipos per se, no necesitan una definición de tipo (typedef) para ser considerados como tal:

    struct point3D {
        float x;
        float y;
        float z;
     };
    
  • Un cubo, por definición es un poliedro regular, no necesitas una variable para cada tamaño en cada eje, pues el tamaño es el mismo en todos los ejes.
  • No declares variables que no necesitas usar, menos aún: no declares variables que después usas sin inicializar.
  • No puedes definir formaciones1 cuyo tamaño se define por una variable: point3D grid[n*n*n], lee estos hilos para saber más del tema. Las formaciones tampoco tienen nada que ver con alloc o malloc, y malloc es una función que no tienes necesidad de usar en C++.
  • Usa nombres de variable autoexplicativos, nombres como xe, xs, ye, ys, ze, zs y n no dan ninguna pista de su cometido o importancia.
  • point3D es un tipo, no una instancia, esta línea no compila: grid[i+n*j+n*n*k] = point3D;.

1También conocidas como arreglo o en inglés array.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82