Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Programa para generar una malla rectangular a partir de puntos 3d dados

Estas en el tema de Programa para generar una malla rectangular a partir de puntos 3d dados en el foro de C/C++ en Foros del Web. Hola este es un programa que a partir de un conjunto de datos 3d ((x, y, z) o z(x, y) o como prefieran verlo) remuestrea ...
  #1 (permalink)  
Antiguo 30/05/2008, 09:42
 
Fecha de Ingreso: mayo-2008
Ubicación: Caracas
Mensajes: 35
Antigüedad: 16 años
Puntos: 1
Programa para generar una malla rectangular a partir de puntos 3d dados

Hola este es un programa que a partir de un conjunto de datos 3d ((x, y, z) o z(x, y) o como prefieran verlo) remuestrea y genera un nuevo set de datos distanciados regularmente en “X” y “Y”, y el nuevo valor de Z es obtenido mediante el promedio de los datos dentro de un radio asignado por el usuario. Todavía tengo que programar la lectura de datos a partir de un archivo (ese no es el problema, aunque acepto ayuda) y escribir los datos en un nuevo archivo (ese podria ser un problema porque deseo mantener un formato). Por lo demás todo funciona y bien.

Lo que deseo real ayuda y eso pueden verlo en una pregunta que nadie ha contestado aún (ver tema: Vectores y variables locales (Trate de hacer enlace pero necesito tener antiguedad )) es: mi vectores están declarados reservando un espacio max. En la línea 9 del programa se define max 500. Pero eso es insuficiente para lo que necesito. Yo necesito por lo menos max 500000. Sabemos que es mucha memoria y que el sistema operativo debería encargarse de eso pero adicionalmente sabemos que el espacio para vectores se reserva por bloques. Una librería que ya incluí llamada vector resuelve el problema, pero no logro usar sus vectores como argumento de otras funciones (ver tema: Vectores y variables locales ) y ese, ESE es el problema que necesito resolver.

Esto es parte de mi tesis y ya tengo mucho tiempo trabajando en ella (no estudio un área de la computación aunque mi tesis sea la elaboración de un programa) deseo graduarme.

Muchas gracias, pueden quedarse con el código. Apoyo el software libre :)

PD: Lyuego pedire ayuda para la graficacion de esos datos en superficies

Código:
//------------------------------------------------------------------------------
//      Programa para crear un grig regular a partir de datos X,Y,Z  v1.0 
//------------------------------------------------------------------------------
#include <cstdlib>
#include <iostream>
#include <vector>
#include <cmath>
//------------------------------------------------------------------------------
#define max 500
//------------------------------------------------------------------------------
int Lee_N(void);                                //Lee numero de elementos.
void Lee_datos(double A[][3], int N);       //Lee datos para crear grid.
void Genera_grid(double A[][3], double grid[][3], int N, int *NG);     //genera una nueva matriz con los datos de la matriz original.
void ExtraeVector(double A[][3], int N, double V[max], int objetivo);
double maximo(double V[max], int N);
double minimo(double V[max], int N);
void Genera_coordenadas(double X[], int Nx, double Y[], int Ny, double grid[][3], int NGrid);    //double espaciado();
void Calcula_nuevo_Z(double A[][3], double grid[][3], int N, int Ngrid, double Radio);
double DistEntrePuntos(double a[], double b[]);   
double promedio(double matriz[max], int N);  
void ImprimeMatriz(double matriz[][3], int Ngrid); 
//------------------------------------------------------------------------------
using namespace std;

int main(int argc, char *argv[])
{
    int NDatos, NGrid;
    double Datos[max][3], Grid[max][3];
    NDatos = Lee_N();
    Lee_datos(Datos, NDatos);
    Genera_grid(Datos, Grid, NDatos, &NGrid);
    ImprimeMatriz(Grid, NGrid);
   
    system("PAUSE");
    return EXIT_SUCCESS;
}
//------------------------------------------------------------------------------
int Lee_N(void)
{
    int Temp;
    do
    {
        cout << "Introduzca numero de datos: ";
        cin >> Temp;
        if(Temp<2 || Temp>max)
            cout << "\tERROR: El numero de datos debe ser > 1 y <= " << max<<endl;
    }
    while(Temp<2 || Temp>max);
    return Temp;    
}
//------------------------------------------------------------------------------
void Lee_datos(double A[][3], int N)
{
    cout << "\nIntroduzca los datos de la matriz"<<endl<<endl;
    for(int i=0; i<N;i++)
    {
        for(int j=0; j<3; j++)
        {   
            char coordenada;
            switch(j)
            {
                case 0: coordenada = 'X';break;
                case 1: coordenada = 'Y';break;
                case 2: coordenada = 'Z';break;
                default: break;
            }
            cout << "Datos["<<i+1<<"]["<<coordenada<<"]: ";
            cin >> A[i][j];
        }
        cout << endl;
    }
}
//------------------------------------------------------------------------------
void Genera_grid(double A[][3], double grid[][3], int N, int *NG)
{
     
    double minX, maxX, minY, maxY;       //Límites del grid
    int Nf, Nc, tempNG;                  //cantidad de filas y cantidad de columnas.
    double DeltaX, DeltaY;               //nuevo muestreo en X y Y
    double X[max];
    double Y[max];
    double Radio;
    
    int obj = 0;                     //Indica la columna 1 dentro de la matriz
    ExtraeVector(A, N, X, obj);
    
    obj = 1;                         //Indica la columna 2 dentro de la matriz
    ExtraeVector(A, N, Y, obj);
    
    minX = minimo(X, N);
    maxX = maximo(X, N);
    minY = minimo(Y, N);
    maxY = maximo(Y, N);
    
    cout << "Los limites del grid son: " << endl;
    cout << "\tMinX: " << minX << endl;
    cout << "\tMaxX: " << maxX << endl;
    cout << "\tMinY: " << minY << endl;
    cout << "\tmaxY: " << maxY << endl;
    
    cout << "Introduzca la cantidad de filas: "; //Cantidad de filas que tendra el grid.
    cin >> Nf;
    cout << "Introduzca la cantidad de columnas: "; //Cantidad de columnas que tendra el grid. 
    cin >> Nc;
    
    DeltaX = (maxX-minX)/(Nc-1);  //Calcula el nuevo muestreo en X para el grid
    DeltaY = (maxY-minY)/(Nf-1);  //Calcula el nuevo muestreo en Y para el grid
    
    X[0] = minX;                  //Vuelve a generar el vector X, pero remuestreado
    for(int i=1; i<Nc; i++)
         X[i] = X[i-1] + DeltaX;
    
    Y[0] = minY;                  //Vuelve a generar el vector X, pero remuestreado
    for(int i=1; i<Nf; i++)
         Y[i] =Y[i-1] + DeltaY; 
    
    tempNG = Nc*Nf;               //Calcula el numero de renglones que tendra el grid.
    
    Genera_coordenadas(X, Nc, Y, Nf, grid, tempNG);   //genera los nuevos X y Y en el grid
     
    cout << "\nIndroduzca radio de busqueda: ";
    cin >> Radio;
    
    Calcula_nuevo_Z(A, grid, N, tempNG, Radio); 
    *NG = tempNG;
}
//------------------------------------------------------------------------------
void ExtraeVector(double A[][3], int N, double V[max], int objetivo)
{
     for(int i=0; i<N; i++)
         V[i] = A[i][objetivo];
     cout << endl;
}
//------------------------------------------------------------------------------
double maximo(double V[max], int N)
{
     double temp = V[0];
     for(int i=1; i<N; i++)
         if(temp < V[i])
             temp = V[i];
     return temp;             
}
//------------------------------------------------------------------------------
double minimo(double V[max], int N)
{
     double temp = V[0];
     for(int i=1; i<N; i++)
         if(temp > V[i])
             temp = V[i];
     return temp;
}
//------------------------------------------------------------------------------
void Genera_coordenadas(double X[], int Nx, double Y[], int Ny, double grid[][3], int NGrid)
{
     int z = 0;
     for(int i=0; i<Nx; i++)
         for(int j=0; j<Ny; j++)
         {
             grid[z][0] = X[i];
             grid[z][1] = Y[j];
             z++;
         }
}
//------------------------------------------------------------------------------
void Calcula_nuevo_Z(double A[][3], double grid[][3], int N, int Ngrid, double Radio)
{
     double Z_en_Area[max];
     double a[2], b[2]; 
     int contadorZ = 0;
     
     for(int i=0; i<Ngrid; ++i) 
     {
          a[0] = grid[i][0];
          a[1] = grid[i][1];              
          for(int j=0; j<N; ++j)
          {
             b[0] = A[j][0];
             b[1] = A[j][1];
             if(DistEntrePuntos(a, b)<=Radio)
             {
                 Z_en_Area[contadorZ] = A[j][2];
                 contadorZ ++;
             }
          }
          grid[i][2] = promedio(Z_en_Area, contadorZ); 
          contadorZ = 0;
     } 
}
//------------------------------------------------------------------------------
double DistEntrePuntos(double a[], double b[])
{
     double g = sqrt((a[0]-b[0])*(a[0]-b[0])+(a[1]-b[1])*(a[1]-b[1]));
     return g;                       //Calcula la distancia entre los puntos
}
//------------------------------------------------------------------------------
double promedio(double matriz[max], int N)
{
      double suma = 0;
      for(int i=0; i<N; ++i)
      {
             suma += matriz[i];      //Suma de valores de la matriz
      }
      return suma/N;                 //Retorna la media aritmetica
}
//------------------------------------------------------------------------------
void ImprimeMatriz(double matriz[][3], int N)
{
     for(int i=0;i<N;i++)
     {
        for(int j=0;j<3;j++)
        {
                cout<<"\t"<<matriz[i][j];
        }
        cout << endl;
     }
}
//------------------------------------------------------------------------------
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:22.