Used "new" to auto-allocate large DEM parsing arrays in class constructor.
This commit is contained in:
parent
cd7233754f
commit
1f7da4f54e
2 changed files with 38 additions and 47 deletions
50
DEM/dem.cxx
50
DEM/dem.cxx
|
@ -45,6 +45,8 @@
|
||||||
|
|
||||||
fgDEM::fgDEM( void ) {
|
fgDEM::fgDEM( void ) {
|
||||||
// printf("class fgDEM CONstructor called.\n");
|
// printf("class fgDEM CONstructor called.\n");
|
||||||
|
dem_data = new float[DEM_SIZE_1][DEM_SIZE_1];
|
||||||
|
output_data = new float[DEM_SIZE_1][DEM_SIZE_1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -315,8 +317,7 @@ void fgDEM::read_a_record( void ) {
|
||||||
|
|
||||||
|
|
||||||
// read and parse DEM "B" record
|
// read and parse DEM "B" record
|
||||||
void fgDEM::read_b_record(float dem_data[DEM_SIZE_1][DEM_SIZE_1])
|
void fgDEM::read_b_record( void ) {
|
||||||
{
|
|
||||||
char token[80];
|
char token[80];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -353,7 +354,7 @@ void fgDEM::read_b_record(float dem_data[DEM_SIZE_1][DEM_SIZE_1])
|
||||||
|
|
||||||
|
|
||||||
// parse dem file
|
// parse dem file
|
||||||
int fgDEM::parse( float dem_data[DEM_SIZE_1][DEM_SIZE_1] ) {
|
int fgDEM::parse( void ) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
cur_row = 0;
|
cur_row = 0;
|
||||||
|
@ -361,7 +362,8 @@ int fgDEM::parse( float dem_data[DEM_SIZE_1][DEM_SIZE_1] ) {
|
||||||
read_a_record();
|
read_a_record();
|
||||||
|
|
||||||
for ( i = 0; i < dem_num_profiles; i++ ) {
|
for ( i = 0; i < dem_num_profiles; i++ ) {
|
||||||
read_b_record( dem_data );
|
// printf("Ready to read next b record\n");
|
||||||
|
read_b_record();
|
||||||
cur_col++;
|
cur_col++;
|
||||||
|
|
||||||
if ( cur_col % 100 == 0 ) {
|
if ( cur_col % 100 == 0 ) {
|
||||||
|
@ -377,9 +379,7 @@ int fgDEM::parse( float dem_data[DEM_SIZE_1][DEM_SIZE_1] ) {
|
||||||
|
|
||||||
// return the current altitude based on mesh data. We should rewrite
|
// return the current altitude based on mesh data. We should rewrite
|
||||||
// this to interpolate exact values, but for now this is good enough
|
// this to interpolate exact values, but for now this is good enough
|
||||||
double fgDEM::interpolate_altitude( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
double fgDEM::interpolate_altitude( double lon, double lat ) {
|
||||||
double lon, double lat)
|
|
||||||
{
|
|
||||||
// we expect incoming (lon,lat) to be in arcsec for now
|
// we expect incoming (lon,lat) to be in arcsec for now
|
||||||
|
|
||||||
double xlocal, ylocal, dx, dy, zA, zB, elev;
|
double xlocal, ylocal, dx, dy, zA, zB, elev;
|
||||||
|
@ -492,10 +492,7 @@ double fgDEM::interpolate_altitude( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
||||||
|
|
||||||
|
|
||||||
// Use least squares to fit a simpler data set to dem data
|
// Use least squares to fit a simpler data set to dem data
|
||||||
void fgDEM::fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
void fgDEM::fit( char *fg_root, double error, struct fgBUCKET *p ) {
|
||||||
float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
|
||||||
char *fg_root, double error, struct fgBUCKET *p )
|
|
||||||
{
|
|
||||||
double x[DEM_SIZE_1], y[DEM_SIZE_1];
|
double x[DEM_SIZE_1], y[DEM_SIZE_1];
|
||||||
double m, b, ave_error, max_error;
|
double m, b, ave_error, max_error;
|
||||||
double cury, lasty;
|
double cury, lasty;
|
||||||
|
@ -504,7 +501,7 @@ void fgDEM::fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
||||||
// FILE *dem, *fit, *fit1;
|
// FILE *dem, *fit, *fit1;
|
||||||
|
|
||||||
printf("Initializing output mesh structure\n");
|
printf("Initializing output mesh structure\n");
|
||||||
outputmesh_init( output_data );
|
outputmesh_init();
|
||||||
|
|
||||||
// determine dimensions
|
// determine dimensions
|
||||||
colmin = p->x * ( (cols - 1) / 8);
|
colmin = p->x * ( (cols - 1) / 8);
|
||||||
|
@ -514,10 +511,10 @@ void fgDEM::fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
||||||
printf("Fitting region = %d,%d to %d,%d\n", colmin, rowmin, colmax, rowmax);
|
printf("Fitting region = %d,%d to %d,%d\n", colmin, rowmin, colmax, rowmax);
|
||||||
|
|
||||||
// include the corners explicitly
|
// include the corners explicitly
|
||||||
outputmesh_set_pt(output_data, colmin, rowmin, dem_data[colmin][rowmin]);
|
outputmesh_set_pt(colmin, rowmin, dem_data[colmin][rowmin]);
|
||||||
outputmesh_set_pt(output_data, colmin, rowmax, dem_data[colmin][rowmax]);
|
outputmesh_set_pt(colmin, rowmax, dem_data[colmin][rowmax]);
|
||||||
outputmesh_set_pt(output_data, colmax, rowmax, dem_data[colmax][rowmax]);
|
outputmesh_set_pt(colmax, rowmax, dem_data[colmax][rowmax]);
|
||||||
outputmesh_set_pt(output_data, colmax, rowmin, dem_data[colmax][rowmin]);
|
outputmesh_set_pt(colmax, rowmin, dem_data[colmax][rowmin]);
|
||||||
|
|
||||||
printf("Beginning best fit procedure\n");
|
printf("Beginning best fit procedure\n");
|
||||||
|
|
||||||
|
@ -598,7 +595,7 @@ void fgDEM::fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
||||||
if ( start > colmin ) {
|
if ( start > colmin ) {
|
||||||
// skip this for the first line segment
|
// skip this for the first line segment
|
||||||
cury = m * x[0] + b;
|
cury = m * x[0] + b;
|
||||||
outputmesh_set_pt(output_data, start, row, (lasty + cury) / 2);
|
outputmesh_set_pt(start, row, (lasty + cury) / 2);
|
||||||
// fprintf(fit, "%.2f %.2f\n", x[0], (lasty + cury) / 2);
|
// fprintf(fit, "%.2f %.2f\n", x[0], (lasty + cury) / 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -625,12 +622,12 @@ void fgDEM::fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
||||||
// printf("Please hit return: "); gets(junk);
|
// printf("Please hit return: "); gets(junk);
|
||||||
}
|
}
|
||||||
|
|
||||||
outputmesh_output_nodes(output_data, fg_root, p);
|
outputmesh_output_nodes(fg_root, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Initialize output mesh structure
|
// Initialize output mesh structure
|
||||||
void fgDEM::outputmesh_init( float output_data[DEM_SIZE_1][DEM_SIZE_1] ) {
|
void fgDEM::outputmesh_init( void ) {
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
for ( j = 0; j < DEM_SIZE_1; j++ ) {
|
for ( j = 0; j < DEM_SIZE_1; j++ ) {
|
||||||
|
@ -642,26 +639,20 @@ void fgDEM::outputmesh_init( float output_data[DEM_SIZE_1][DEM_SIZE_1] ) {
|
||||||
|
|
||||||
|
|
||||||
// Get the value of a mesh node
|
// Get the value of a mesh node
|
||||||
double fgDEM::outputmesh_get_pt( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
double fgDEM::outputmesh_get_pt( int i, int j ) {
|
||||||
int i, int j )
|
|
||||||
{
|
|
||||||
return ( output_data[i][j] );
|
return ( output_data[i][j] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Set the value of a mesh node
|
// Set the value of a mesh node
|
||||||
void fgDEM::outputmesh_set_pt( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
void fgDEM::outputmesh_set_pt( int i, int j, double value ) {
|
||||||
int i, int j, double value )
|
|
||||||
{
|
|
||||||
// printf("Setting data[%d][%d] = %.2f\n", i, j, value);
|
// printf("Setting data[%d][%d] = %.2f\n", i, j, value);
|
||||||
output_data[i][j] = value;
|
output_data[i][j] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Write out a node file that can be used by the "triangle" program
|
// Write out a node file that can be used by the "triangle" program
|
||||||
void fgDEM::outputmesh_output_nodes( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
void fgDEM::outputmesh_output_nodes( char *fg_root, struct fgBUCKET *p ) {
|
||||||
char *fg_root, struct fgBUCKET *p )
|
|
||||||
{
|
|
||||||
struct stat stat_buf;
|
struct stat stat_buf;
|
||||||
char base_path[256], dir[256], file[256];
|
char base_path[256], dir[256], file[256];
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
|
@ -763,6 +754,9 @@ fgDEM::~fgDEM( void ) {
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.2 1998/04/14 02:43:27 curt
|
||||||
|
// Used "new" to auto-allocate large DEM parsing arrays in class constructor.
|
||||||
|
//
|
||||||
// Revision 1.1 1998/04/08 22:57:22 curt
|
// Revision 1.1 1998/04/08 22:57:22 curt
|
||||||
// Adopted Gnu automake/autoconf system.
|
// Adopted Gnu automake/autoconf system.
|
||||||
//
|
//
|
||||||
|
|
35
DEM/dem.hxx
35
DEM/dem.hxx
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include <Scenery/Bucket/bucketutils.h>
|
#include <Bucket/bucketutils.h>
|
||||||
|
|
||||||
|
|
||||||
#define DEM_SIZE 1200
|
#define DEM_SIZE 1200
|
||||||
|
@ -50,9 +50,9 @@ class fgDEM {
|
||||||
// Distance between column and row data points (in arc seconds)
|
// Distance between column and row data points (in arc seconds)
|
||||||
double col_step, row_step;
|
double col_step, row_step;
|
||||||
|
|
||||||
// the actual mesh data allocated here
|
// pointers to the actual mesh data allocated here
|
||||||
// float dem_data[DEM_SIZE_1][DEM_SIZE_1];
|
float (*dem_data)[DEM_SIZE_1];
|
||||||
// float output_data[DEM_SIZE_1][DEM_SIZE_1];
|
float (*output_data)[DEM_SIZE_1];
|
||||||
|
|
||||||
// Current "A" Record Information
|
// Current "A" Record Information
|
||||||
char dem_description[80], dem_quadrangle[80];
|
char dem_description[80], dem_quadrangle[80];
|
||||||
|
@ -83,13 +83,13 @@ public:
|
||||||
int close ( void );
|
int close ( void );
|
||||||
|
|
||||||
// parse a DEM file
|
// parse a DEM file
|
||||||
int parse( float dem_data[DEM_SIZE_1][DEM_SIZE_1] );
|
int parse( void );
|
||||||
|
|
||||||
// read and parse DEM "A" record
|
// read and parse DEM "A" record
|
||||||
void read_a_record( );
|
void read_a_record( void );
|
||||||
|
|
||||||
// read and parse DEM "B" record
|
// read and parse DEM "B" record
|
||||||
void read_b_record( float dem_data[DEM_SIZE_1][DEM_SIZE_1] );
|
void read_b_record( void );
|
||||||
|
|
||||||
// Informational methods
|
// Informational methods
|
||||||
double info_originx( void ) { return(originx); }
|
double info_originx( void ) { return(originx); }
|
||||||
|
@ -98,28 +98,22 @@ public:
|
||||||
// return the current altitude based on mesh data. We should
|
// return the current altitude based on mesh data. We should
|
||||||
// rewrite this to interpolate exact values, but for now this is
|
// rewrite this to interpolate exact values, but for now this is
|
||||||
// good enough
|
// good enough
|
||||||
double interpolate_altitude( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
double interpolate_altitude( double lon, double lat );
|
||||||
double lon, double lat);
|
|
||||||
|
|
||||||
// Use least squares to fit a simpler data set to dem data
|
// Use least squares to fit a simpler data set to dem data
|
||||||
void fit( float dem_data[DEM_SIZE_1][DEM_SIZE_1],
|
void fit( char *fg_root, double error, struct fgBUCKET *p );
|
||||||
float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
|
||||||
char *fg_root, double error, struct fgBUCKET *p );
|
|
||||||
|
|
||||||
// Initialize output mesh structure
|
// Initialize output mesh structure
|
||||||
void outputmesh_init( float output_data[DEM_SIZE_1][DEM_SIZE_1] );
|
void outputmesh_init( void );
|
||||||
|
|
||||||
// Get the value of a mesh node
|
// Get the value of a mesh node
|
||||||
double outputmesh_get_pt( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
double outputmesh_get_pt( int i, int j );
|
||||||
int i, int j );
|
|
||||||
|
|
||||||
// Set the value of a mesh node
|
// Set the value of a mesh node
|
||||||
void outputmesh_set_pt( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
void outputmesh_set_pt( int i, int j, double value );
|
||||||
int i, int j, double value );
|
|
||||||
|
|
||||||
// Write out a node file that can be used by the "triangle" program
|
// Write out a node file that can be used by the "triangle" program
|
||||||
void outputmesh_output_nodes( float output_data[DEM_SIZE_1][DEM_SIZE_1],
|
void outputmesh_output_nodes( char *fg_root, struct fgBUCKET *p );
|
||||||
char *fg_root, struct fgBUCKET *p );
|
|
||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~fgDEM( void );
|
~fgDEM( void );
|
||||||
|
@ -130,6 +124,9 @@ public:
|
||||||
|
|
||||||
|
|
||||||
// $Log$
|
// $Log$
|
||||||
|
// Revision 1.2 1998/04/14 02:43:28 curt
|
||||||
|
// Used "new" to auto-allocate large DEM parsing arrays in class constructor.
|
||||||
|
//
|
||||||
// Revision 1.1 1998/04/08 22:57:23 curt
|
// Revision 1.1 1998/04/08 22:57:23 curt
|
||||||
// Adopted Gnu automake/autoconf system.
|
// Adopted Gnu automake/autoconf system.
|
||||||
//
|
//
|
||||||
|
|
Loading…
Add table
Reference in a new issue