Compare commits

...

11 Commits

Author SHA1 Message Date
curt
2c920ae1df Added is_open() so we can check if the open() succeeded. 1999-03-27 14:04:25 +00:00
curt
bbde3b36bf Elimitated some const warnings from the compiler. 1999-03-27 05:34:05 +00:00
curt
88a016c516 Minor optimization tweaks. 1999-03-25 19:02:28 +00:00
curt
22d4058564 Jettisoned old bucketutils.[ch] for newbucket.[ch]xx 1999-03-25 19:01:47 +00:00
curt
79e6c529ea MSVC++ portability tweaks contributed by Bernie Bright.
Added using std::ostream declaration.
  Added forward declarations to work around a MSVC bug.
1999-03-15 17:58:41 +00:00
curt
7b22b8cd92 Moved to math subdirectory. 1999-03-13 17:34:44 +00:00
curt
bc2ae82e81 Added some informational methods. 1999-03-12 22:51:18 +00:00
curt
764f4037b0 Tweak for native SGI compilers. 1999-03-08 22:00:12 +00:00
curt
a60454a786 Tweaks for compiling with native SGI compilers. 1999-03-02 01:01:42 +00:00
curt
d136ad3e57 Added initial support for native SGI compilers. 1999-02-26 22:07:53 +00:00
curt
739588f9c3 Renamed bucketutils.c -> bucketutils.cxx 1999-02-17 20:52:02 +00:00
19 changed files with 418 additions and 586 deletions

View File

@@ -1,7 +1,6 @@
noinst_LIBRARIES = libBucket.a
libBucket_a_SOURCES = bucketutils.c bucketutils.h bucketutils.hxx \
newbucket.cxx newbucket.hxx
libBucket_a_SOURCES = newbucket.cxx newbucket.hxx
bin_PROGRAMS = testbucket

View File

@@ -1,326 +0,0 @@
// bucketutils.c -- support routines to handle fgBUCKET operations
//
// Written by Curtis Olson, started January 1998.
//
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// $Id$
// (Log is kept at end of this file)
#include <math.h>
#include <stdio.h>
#include <Include/fg_constants.h>
#include "bucketutils.h"
/* Generate the unique scenery tile index containing the specified
lon/lat parameters.
The index is constructed as follows:
9 bits - to represent 360 degrees of longitude (-180 to 179)
8 bits - to represent 180 degrees of latitude (-90 to 89)
Each 1 degree by 1 degree tile is further broken down into an 8x8
grid. So we also need:
3 bits - to represent x (0 to 7)
3 bits - to represent y (0 to 7) */
long int fgBucketGenIndex( const fgBUCKET *p) {
long index = 0;
index = ((p->lon + 180) << 14) + ((p->lat + 90) << 6) + (p->y << 3) + p->x;
// printf(" generated index = %ld\n", index);
return(index);
}
// Parse a unique scenery tile index and find the lon, lat, x, and y
void fgBucketParseIndex(long int index, fgBUCKET *p) {
p->lon = index >> 14;
index -= p->lon << 14;
p->lon -= 180;
p->lat = index >> 6;
index -= p->lat << 6;
p->lat -= 90;
p->y = index >> 3;
index -= p->y << 3;
p->x = index;
}
// Build a path name from an tile index
void fgBucketGenBasePath( const fgBUCKET *p, char *path) {
long int index;
int top_lon, top_lat, main_lon, main_lat;
char hem, pole;
index = fgBucketGenIndex(p);
path[0] = '\0';
top_lon = p->lon / 10;
main_lon = p->lon;
if ( (p->lon < 0) && (top_lon * 10 != p->lon) ) {
top_lon -= 1;
}
top_lon *= 10;
if ( top_lon >= 0 ) {
hem = 'e';
} else {
hem = 'w';
top_lon *= -1;
}
if ( main_lon < 0 ) {
main_lon *= -1;
}
top_lat = p->lat / 10;
main_lat = p->lat;
if ( (p->lat < 0) && (top_lat * 10 != p->lat) ) {
top_lat -= 1;
}
top_lat *= 10;
if ( top_lat >= 0 ) {
pole = 'n';
} else {
pole = 's';
top_lat *= -1;
}
if ( main_lat < 0 ) {
main_lat *= -1;
}
sprintf(path, "%c%03d%c%03d/%c%03d%c%03d",
hem, top_lon, pole, top_lat,
hem, main_lon, pole, main_lat);
}
// offset an bucket struct by the specified amounts in the X & Y direction
void fgBucketOffset(fgBUCKET *in, fgBUCKET *out, int x, int y) {
int diff, temp;
int dist_lat;
out->lon = in->lon;
out->lat = in->lat;
out->x = in->x;
out->y = in->y;
// do X direction
diff = out->x + x;
// printf(" reducing x (%d)\n", diff);
if ( diff >= 0 ) {
temp = diff / 8;
} else if ( diff < -7 ) {
temp = (diff + 1) / 8 - 1;
} else {
temp = diff / 8 - 1;
}
out->x = ((diff % 8) + 8) % 8;
out->lon = ( (out->lon + 180 + 360 + temp) % 360 ) - 180;
// do Y direction
diff = out->y + y;
// printf(" reducing x (%d)\n", diff);
if ( diff >= 0 ) {
temp = diff / 8;
} else if ( diff < -7 ) {
temp = (diff + 1) / 8 - 1;
} else {
temp = diff / 8 - 1;
}
out->y = ((diff % 8) + 8) % 8;
out->lat = out->lat + temp;
if ( out->lat >= 90 ) {
dist_lat = out->lat - 90;
// printf(" +lat = %d +y = %d\n", dist_lat, out->y);
out->lat = 90 - (dist_lat + 1);
out->lon = ( (out->lon + 180 + 180) % 360 ) - 180;
out->y = 7 - out->y;
}
if ( out->lat < -90 ) {
dist_lat = -90 - out->lat;
// printf(" +lat = %d +y = %d\n", dist_lat, out->y);
out->lat = -90 + (dist_lat - 1);
out->lon = ( (out->lon + 180 + 180) % 360 ) - 180;
out->y = 7 - out->y;
}
}
// Given a lat/lon in degrees, find the "bucket" or tile that it falls
// within
void fgBucketFind(double lon, double lat, fgBUCKET *p) {
double diff;
diff = lon - (double)(int)lon;
// printf("diff = %.2f\n", diff);
if ( (lon >= 0) || (fabs(diff) < FG_EPSILON) ) {
p->lon = (int)lon;
} else {
p->lon = (int)lon - 1;
}
// printf(" p->lon = %d\n", p->lon);
diff = lat - (double)(int)lat;
// printf("diff = %.2f\n", diff);
if ( (lat >= 0) || (fabs(diff) < FG_EPSILON) ) {
p->lat = (int)lat;
} else {
p->lat = (int)lat - 1;
}
// printf(" p->lat = %d\n", p->lat);
p->x = (int)((lon - p->lon) * 8);
p->y = (int)((lat - p->lat) * 8);
// printf( "Bucket = lon,lat = %d,%d x,y index = %d,%d\n",
// p->lon, p->lat, p->x, p->y);
}
// Given a lat/lon, fill in the local tile index array
void fgBucketGenIdxArray(fgBUCKET *p1, fgBUCKET *tiles, int width, int height) {
fgBUCKET *p2;
int dw, dh, i, j;
dh = height / 2;
dw = width / 2;
for ( j = 0; j < height; j++ ) {
for ( i = 0; i < width; i++ ) {
fgBucketOffset(p1, &tiles[(j*width)+i], i - dw, j - dh);
p2 = &tiles[(j*width)+i];
/* printf( " bucket = %d %d %d %d index = %ld\n",
p2->lon, p2->lat, p2->x, p2->y,
fgBucketGenIndex(&tiles[(j*width)+i])); */
}
}
}
/* sample main for testing
int main() {
fgBUCKET p1;
long int tile[49];
char path[256];
double lon, lat;
int i, j;
p1.lon = 180;
p1.lat = 90;
p1.x = 7;
p1.y = 7;
printf("Max index = %ld\n", gen_index(&p1));
lon = -50.0;
lat = -50.0;
find_bucket(lon, lat, &p1);
gen_idx_array(&p1, tile, 7, 7);
for ( j = 0; j < 7; j++ ) {
for ( i = 0; i < 7; i++ ) {
gen_path(tile[(j*7)+i], path);
printf(" path = %s\n", path);
}
}
lon = 50.0;
lat = 50.0;
find_bucket(lon, lat, &p1);
gen_idx_array(&p1, tile, 7, 7);
for ( j = 0; j < 7; j++ ) {
for ( i = 0; i < 7; i++ ) {
gen_path(tile[(j*7)+i], path);
printf(" path = %s\n", path);
}
}
return(1);
} */
// $Log$
// Revision 1.5 1998/12/09 18:48:08 curt
// Use C++ style comments.
//
// Revision 1.4 1998/12/07 21:08:01 curt
// Added a const in a couple places to get rid of annoying compiler warnings.
//
// Revision 1.3 1998/07/04 00:46:47 curt
// typedef'd struct fgBUCKET.
//
// Revision 1.2 1998/04/25 22:06:22 curt
// Edited cvs log messages in source files ... bad bad bad!
//
// Revision 1.1 1998/04/08 23:28:58 curt
// Adopted Gnu automake/autoconf system.
//
// Revision 1.6 1998/02/09 15:07:51 curt
// Minor tweaks.
//
// Revision 1.5 1998/01/29 00:51:38 curt
// First pass at tile cache, dynamic tile loading and tile unloading now works.
//
// Revision 1.4 1998/01/27 03:26:41 curt
// Playing with new fgPrintf command.
//
// Revision 1.3 1998/01/27 00:48:01 curt
// Incorporated Paul Bleisch's <pbleisch@acm.org> new debug message
// system and commandline/config file processing code.
//
// Revision 1.2 1998/01/24 00:03:28 curt
// Initial revision.
//
// Revision 1.1 1998/01/23 20:06:51 curt
// tileutils.* renamed to bucketutils.*
//
// Revision 1.6 1998/01/19 19:27:18 curt
// Merged in make system changes from Bob Kuehne <rpk@sgi.com>
// This should simplify things tremendously.
//
// Revision 1.5 1998/01/14 02:19:04 curt
// Makde offset_bucket visible to outside.
//
// Revision 1.4 1998/01/13 00:23:12 curt
// Initial changes to support loading and management of scenery tiles. Note,
// there's still a fair amount of work left to be done.
//
// Revision 1.3 1998/01/10 00:01:47 curt
// Misc api changes and tweaks.
//
// Revision 1.2 1998/01/08 02:22:28 curt
// Continue working on basic features.
//
// Revision 1.1 1998/01/07 23:50:52 curt
// "area" renamed to "tile"
//
// Revision 1.1 1998/01/07 23:23:40 curt
// Initial revision.
//

View File

@@ -1,135 +0,0 @@
// bucketutils.h -- support routines to handle fgBUCKET operations
//
// Written by Curtis Olson, started January 1998.
//
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// $Id$
// (Log is kept at end of this file)
#ifndef _BUCKETUTILS_H
#define _BUCKETUTILS_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct {
int lon; // longitude (-180 to 179)
int lat; // latitude (-90 to 89)
int x; // x (0 to 7)
int y; // y (0 to 7)
} fgBUCKET;
/* Generate the unique scenery tile index containing the specified
lon/lat parameters.
The index is constructed as follows:
9 bits - to represent 360 degrees of longitude (-180 to 179)
8 bits - to represent 180 degrees of latitude (-90 to 89)
Each 1 degree by 1 degree tile is further broken down into an 8x8
grid. So we also need:
3 bits - to represent x (0 to 7)
3 bits - to represent y (0 to 7) */
long int fgBucketGenIndex( const fgBUCKET *p);
// Parse a unique scenery tile index and find the lon, lat, x, and y
void fgBucketParseIndex(long int index, fgBUCKET *p);
// Build a path name from an tile index
void fgBucketGenBasePath( const fgBUCKET *p, char *path);
// offset a bucket struct by the specified amounts in the X & Y direction
void fgBucketOffset(fgBUCKET *in, fgBUCKET *out, int x, int y);
// Given a lat/lon in degrees, find the "bucket" or tile that it falls
// within
void fgBucketFind(double lon, double lat, fgBUCKET *p);
// Given a lat/lon, fill in the local tile index array
void fgBucketGenIdxArray(fgBUCKET *p1, fgBUCKET *tiles, int width, int height);
#ifdef __cplusplus
}
#endif
#endif // _BUCKETUTILS_H
// $Log$
// Revision 1.5 1999/02/08 23:52:15 curt
// Added a new "newbucket.[ch]xx" FGBucket class to replace the old
// fgBUCKET struct and C routines. This FGBucket class adjusts the tile
// width towards the poles to ensure the tiles are at least 8 miles wide.
//
// Revision 1.4 1998/12/09 18:48:09 curt
// Use C++ style comments.
//
// Revision 1.3 1998/12/07 21:08:03 curt
// Added a const in a couple places to get rid of annoying compiler warnings.
//
// Revision 1.2 1998/07/04 00:46:48 curt
// typedef'd struct fgBUCKET.
//
// Revision 1.1 1998/04/08 23:28:59 curt
// Adopted Gnu automake/autoconf system.
//
// Revision 1.2 1998/01/24 00:03:28 curt
// Initial revision.
//
// Revision 1.1 1998/01/23 20:06:52 curt
// tileutils.* renamed to bucketutils.*
//
// Revision 1.6 1998/01/22 02:59:42 curt
// Changed #ifdef FILE_H to #ifdef _FILE_H
//
// Revision 1.5 1998/01/14 02:19:05 curt
// Makde offset_bucket visible to outside.
//
// Revision 1.4 1998/01/13 00:23:12 curt
// Initial changes to support loading and management of scenery tiles. Note,
// there's still a fair amount of work left to be done.
//
// Revision 1.3 1998/01/10 00:01:48 curt
// Misc api changes and tweaks.
//
// Revision 1.2 1998/01/08 02:22:28 curt
// Continue working on basic features.
//
// Revision 1.1 1998/01/07 23:50:52 curt
// "area" renamed to "tile"
//
// Revision 1.1 1998/01/07 23:23:40 curt
// Initial revision.
//

View File

@@ -1,81 +0,0 @@
/**************************************************************************
* bucketutils.hxx -- support routines to handle fgBUCKET operations
*
* Written by Bernie Bright, started January 1998.
*
* Copyright (C) 1998 Bernie Bright - bbright@c031.aone.net.au
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
* $Id$
* (Log is kept at end of this file)
**************************************************************************/
#ifndef _BUCKETUTILS_HXX
#define _BUCKETUTILS_HXX
#include <string>
FG_USING_NAMESPACE(std);
#include "bucketutils.h"
#include <Include/compiler.h>
FG_USING_STD(string);
inline bool
operator== ( const fgBUCKET& b1, const fgBUCKET& b2 )
{
return ( b1.lon == b2.lon &&
b1.lat == b2.lat &&
b1.x == b2.x &&
b1.y == b2.y );
}
inline string
fgBucketGenIndex( const fgBUCKET& p )
{
char index_str[256];
sprintf( index_str, "%ld", fgBucketGenIndex( &p ) );
return string( index_str );
}
inline string
fgBucketGenBasePath( const fgBUCKET& p )
{
char base_path[256];
fgBucketGenBasePath( &p, base_path );
return string( base_path );
}
inline ostream&
operator<< ( ostream& out, const fgBUCKET& b )
{
return out << b.lon << "," << b.lat << " " << b.x << "," << b.y;
}
#endif /* _BUCKETUTILS_HXX */
// $Log$
// Revision 1.2 1999/01/19 20:56:53 curt
// MacOS portability changes contributed by "Robert Puyol" <puyol@abvent.fr>
//
// Revision 1.1 1998/11/09 23:42:12 curt
// Initial revision.
//

View File

@@ -33,13 +33,13 @@
// Build the path name for this bucket
string FGBucket::gen_base_path() {
long int index;
string FGBucket::gen_base_path() const {
// long int index;
int top_lon, top_lat, main_lon, main_lat;
char hem, pole;
char path[256];
index = gen_index();
// index = gen_index();
path[0] = '\0';
@@ -146,6 +146,12 @@ void fgBucketDiff( const FGBucket& b1, const FGBucket& b2, int *dx, int *dy ) {
// $Log$
// Revision 1.4 1999/03/27 05:34:05 curt
// Elimitated some const warnings from the compiler.
//
// Revision 1.3 1999/02/26 22:07:54 curt
// Added initial support for native SGI compilers.
//
// Revision 1.2 1999/02/11 01:09:33 curt
// Added a routine to calculate the offset in bucket units between two buckets.
//
@@ -154,3 +160,4 @@ void fgBucketDiff( const FGBucket& b1, const FGBucket& b2, int *dx, int *dy ) {
// fgBUCKET struct and C routines. This FGBucket class adjusts the tile
// width towards the poles to ensure the tiles are at least 8 miles wide.
//

View File

@@ -29,12 +29,18 @@
#include <Include/compiler.h>
#include <string>
#include STL_STRING
#ifdef FG_HAVE_STD_INCLUDES
# include <cstdio> // sprintf()
# include <iostream>
#else
# include <stdio.h> // sprintf()
# include <iostream.h>
#endif
FG_USING_STD(string);
FG_USING_NAMESPACE(std);
#include <stdio.h> // sprintf()
FG_USING_STD(ostream);
#include <Include/fg_constants.h>
@@ -42,6 +48,9 @@ FG_USING_NAMESPACE(std);
#define FG_BUCKET_SPAN 0.125 // 1/8 of a degree
#define FG_HALF_BUCKET_SPAN 0.0625 // 1/2 of 1/8 of a degree = 1/16 = 0.0625
class FGBucket;
ostream& operator<< ( ostream&, const FGBucket& );
bool operator== ( const FGBucket&, const FGBucket& );
class FGBucket {
@@ -63,6 +72,9 @@ public:
// create a bucket based on "long int" index
FGBucket(const long int bindex);
// create an impossible bucket if false
FGBucket(const bool is_good);
~FGBucket();
// Set the bucket params for the specified lat and lon
@@ -70,16 +82,29 @@ public:
// Generate the unique scenery tile index for this bucket
long int gen_index();
string gen_index_str() const;
// Build the path name for this bucket
string gen_base_path();
string gen_base_path() const;
// return the center lon of a tile
double get_center_lon() const;
// return width of the tile
double get_width() const;
// return the center lat of a tile
double get_center_lat() const;
// return height of the tile
double get_height() const;
// Informational methods
inline int get_lon() const { return lon; }
inline int get_lat() const { return lat; }
inline int get_x() const { return x; }
inline int get_y() const { return y; }
// friends
friend ostream& operator<< ( ostream&, const FGBucket& );
friend bool operator== ( const FGBucket&, const FGBucket& );
@@ -182,6 +207,14 @@ inline FGBucket::FGBucket(const double dlon, const double dlat) {
set_bucket(dlon, dlat);
}
// create an impossible bucket if false
inline FGBucket::FGBucket(const bool is_good) {
set_bucket(0.0, 0.0);
if ( !is_good ) {
lon = -1000;
}
}
// Parse a unique scenery tile index and find the lon, lat, x, and y
inline FGBucket::FGBucket(const long int bindex) {
@@ -223,6 +256,13 @@ inline long int FGBucket::gen_index() {
return ((lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x;
}
inline string FGBucket::gen_index_str() const {
char tmp[20];
sprintf(tmp, "%ld",
(((long)lon + 180) << 14) + ((lat + 90) << 6) + (y << 3) + x);
return (string)tmp;
}
// return the center lon of a tile
inline double FGBucket::get_center_lon() const {
@@ -236,12 +276,24 @@ inline double FGBucket::get_center_lon() const {
}
// return width of the tile
inline double FGBucket::get_width() const {
return bucket_span( get_center_lat() );
}
// return the center lat of a tile
inline double FGBucket::get_center_lat() const {
return lat + y / 8.0 + FG_HALF_BUCKET_SPAN;
}
// return height of the tile
inline double FGBucket::get_height() const {
return FG_BUCKET_SPAN;
}
// offset a bucket struct by the specified tile units in the X & Y
// direction
FGBucket fgBucketOffset( double dlon, double dlat, int x, int y );
@@ -273,23 +325,31 @@ operator== ( const FGBucket& b1, const FGBucket& b2 )
b1.y == b2.y );
}
/*
inline string
fgBucketGenIndex( const fgBUCKET& p )
{
char index_str[256];
sprintf( index_str, "%ld", fgBucketGenIndex( &p ) );
return string( index_str );
}
*/
#endif // _NEWBUCKET_HXX
// $Log$
// Revision 1.8 1999/03/27 05:34:06 curt
// Elimitated some const warnings from the compiler.
//
// Revision 1.7 1999/03/25 19:01:51 curt
// Jettisoned old bucketutils.[ch] for newbucket.[ch]xx
//
// Revision 1.6 1999/03/15 17:58:41 curt
// MSVC++ portability tweaks contributed by Bernie Bright.
// Added using std::ostream declaration.
// Added forward declarations to work around a MSVC bug.
//
// Revision 1.5 1999/03/12 22:51:18 curt
// Added some informational methods.
//
// Revision 1.4 1999/03/02 01:01:43 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.3 1999/02/26 22:07:55 curt
// Added initial support for native SGI compilers.
//
// Revision 1.2 1999/02/11 01:09:34 curt
// Added a routine to calculate the offset in bucket units between two buckets.
//

View File

@@ -29,12 +29,11 @@
#endif
#include "Include/compiler.h"
#include <Include/compiler.h>
#ifdef FG_HAVE_STD_INCLUDES
# include <streambuf>
# include <iostream>
//# include <ostream>
#else
# include <iostream.h>
# include "Include/fg_traits.hxx"
@@ -42,10 +41,12 @@
#include "debug_types.h"
#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
FG_USING_STD(streambuf);
FG_USING_STD(ostream);
FG_USING_STD(cerr);
FG_USING_STD(endl);
#endif
//
// TODO:
@@ -211,6 +212,9 @@ fglog()
#endif // _LOGSTREAM_H
// $Log$
// Revision 1.4 1999/03/02 01:01:47 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.3 1999/01/19 20:53:35 curt
// Portability updates by Bernie Bright.
//

View File

@@ -8,6 +8,7 @@ libMath_a_SOURCES = \
fg_geodesy.cxx fg_geodesy.hxx \
fg_random.c fg_random.h \
interpolater.cxx interpolater.hxx \
leastsqs.cxx leastsqs.hxx \
mat3.h mat3defs.h mat3err.h \
point3d.hxx \
polar3d.cxx polar3d.hxx \

View File

@@ -21,7 +21,9 @@
#include <Math/fg_geodesy.hxx>
#include <Math/point3d.hxx>
#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
FG_USING_STD(cout);
#endif
// ONE_SECOND is pi/180/60/60, or about 100 feet at earths' equator
#define ONE_SECOND 4.848136811E-6
@@ -162,6 +164,9 @@ void fgGeodToGeoc( double lat_geod, double alt, double *sl_radius,
$Header$
$Log$
Revision 1.6 1999/03/02 01:01:49 curt
Tweaks for compiling with native SGI compilers.
Revision 1.5 1999/01/27 04:46:14 curt
Portability tweaks by Bernie Bright.
@@ -251,6 +256,9 @@ Initial Flight Gear revision.
// $Log$
// Revision 1.6 1999/03/02 01:01:49 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.5 1999/01/27 04:46:14 curt
// Portability tweaks by Bernie Bright.
//

View File

@@ -24,7 +24,9 @@
// (Log is kept at end of this file)
#include <string>
#include <Include/compiler.h>
#include STL_STRING
#include <Debug/logstream.hxx>
#include <Include/fg_zlib.h>
@@ -101,6 +103,9 @@ fgINTERPTABLE::~fgINTERPTABLE( void ) {
// $Log$
// Revision 1.7 1999/02/26 22:08:03 curt
// Added initial support for native SGI compilers.
//
// Revision 1.6 1999/01/27 04:46:16 curt
// Portability tweaks by Bernie Bright.
//

View File

@@ -32,10 +32,9 @@
# error This library requires C++
#endif
#include <string>
#include "Include/compiler.h"
#include STL_STRING
FG_USING_STD(string);
#define MAX_TABLE_SIZE 32
@@ -63,6 +62,12 @@ public:
// $Log$
// Revision 1.6 1999/03/02 01:01:50 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.5 1999/02/26 22:08:05 curt
// Added initial support for native SGI compilers.
//
// Revision 1.4 1999/01/27 04:46:17 curt
// Portability tweaks by Bernie Bright.
//

152
Math/leastsqs.cxx Normal file
View File

@@ -0,0 +1,152 @@
// leastsqs.c -- Implements a simple linear least squares best fit routine
//
// Written by Curtis Olson, started September 1997.
//
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// $Id$
// (Log is kept at end of this file)
//
#include <stdio.h>
#include "leastsqs.hxx"
/*
Least squares fit:
y = b0 + b1x
n*sum(xi*yi) - (sum(xi)*sum(yi))
b1 = --------------------------------
n*sum(xi^2) - (sum(xi))^2
b0 = sum(yi)/n - b1*(sum(xi)/n)
*/
double sum_xi, sum_yi, sum_xi_2, sum_xi_yi;
int sum_n;
void least_squares(double *x, double *y, int n, double *m, double *b) {
int i;
sum_xi = sum_yi = sum_xi_2 = sum_xi_yi = 0.0;
sum_n = n;
for ( i = 0; i < n; i++ ) {
sum_xi += x[i];
sum_yi += y[i];
sum_xi_2 += x[i] * x[i];
sum_xi_yi += x[i] * y[i];
}
/* printf("sum(xi)=%.2f sum(yi)=%.2f sum(xi^2)=%.2f sum(xi*yi)=%.2f\n",
sum_xi, sum_yi, sum_xi_2, sum_xi_yi); */
*m = ( (double)sum_n * sum_xi_yi - sum_xi * sum_yi ) /
( (double)sum_n * sum_xi_2 - sum_xi * sum_xi );
*b = (sum_yi / (double)sum_n) - (*m) * (sum_xi / (double)sum_n);
/* printf("slope = %.2f intercept = %.2f\n", *m, *b); */
}
/* incrimentally update existing values with a new data point */
void least_squares_update(double x, double y, double *m, double *b) {
++sum_n;
sum_xi += x;
sum_yi += y;
sum_xi_2 += x * x;
sum_xi_yi += x * y;
/* printf("sum(xi)=%.2f sum(yi)=%.2f sum(xi^2)=%.2f sum(xi*yi)=%.2f\n",
sum_xi, sum_yi, sum_xi_2, sum_xi_yi); */
*m = ( (double)sum_n * sum_xi_yi - sum_xi * sum_yi ) /
( (double)sum_n * sum_xi_2 - sum_xi * sum_xi );
*b = (sum_yi / (double)sum_n) - (*m) * (sum_xi / (double)sum_n);
/* printf("slope = %.2f intercept = %.2f\n", *m, *b); */
}
/*
return the least squares error:
(y[i] - y_hat[i])^2
-------------------
n
*/
double least_squares_error(double *x, double *y, int n, double m, double b) {
int i;
double error, sum;
sum = 0.0;
for ( i = 0; i < n; i++ ) {
error = y[i] - (m * x[i] + b);
sum += error * error;
// printf("%.2f %.2f\n", error, sum);
}
return ( sum / (double)n );
}
/*
return the maximum least squares error:
(y[i] - y_hat[i])^2
*/
double least_squares_max_error(double *x, double *y, int n, double m, double b){
int i;
double error, max_error;
max_error = 0.0;
for ( i = 0; i < n; i++ ) {
error = y[i] - (m * x[i] + b);
error = error * error;
if ( error > max_error ) {
max_error = error;
}
}
return ( max_error );
}
// $Log$
// Revision 1.1 1999/03/13 17:34:45 curt
// Moved to math subdirectory.
//
// Revision 1.2 1998/04/21 17:03:41 curt
// Prepairing for C++ integration.
//
// Revision 1.1 1998/04/08 22:57:24 curt
// Adopted Gnu automake/autoconf system.
//
// Revision 1.1 1998/03/19 02:54:47 curt
// Reorganized into a class lib called fgDEM.
//
// Revision 1.1 1997/10/13 17:02:35 curt
// Initial revision.
//

90
Math/leastsqs.hxx Normal file
View File

@@ -0,0 +1,90 @@
// leastsqs.h -- Implements a simple linear least squares best fit routine
//
// Written by Curtis Olson, started September 1997.
//
// Copyright (C) 1997 Curtis L. Olson - curt@infoplane.com
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// $Id$
// (Log is kept at end of this file)
///
#ifndef _LEASTSQS_H
#define _LEASTSQS_H
#ifndef __cplusplus
# error This library requires C++
#endif
/*
Least squares fit:
y = b0 + b1x
n*sum(xi*yi) - (sum(xi)*sum(yi))
b1 = --------------------------------
n*sum(xi^2) - (sum(xi))^2
b0 = sum(yi)/n - b1*(sum(xi)/n)
*/
void least_squares(double *x, double *y, int n, double *m, double *b);
/* incrimentally update existing values with a new data point */
void least_squares_update(double x, double y, double *m, double *b);
/*
return the least squares error:
(y[i] - y_hat[i])^2
-------------------
n
*/
double least_squares_error(double *x, double *y, int n, double m, double b);
/*
return the maximum least squares error:
(y[i] - y_hat[i])^2
*/
double least_squares_max_error(double *x, double *y, int n, double m, double b);
#endif // _LEASTSQS_H
// $Log$
// Revision 1.1 1999/03/13 17:34:45 curt
// Moved to math subdirectory.
//
// Revision 1.2 1998/04/21 17:03:42 curt
// Prepairing for C++ integration.
//
// Revision 1.1 1998/04/08 22:57:25 curt
// Adopted Gnu automake/autoconf system.
//
// Revision 1.1 1998/03/19 02:54:48 curt
// Reorganized into a class lib called fgDEM.
//
// Revision 1.1 1997/10/13 17:02:35 curt
// Initial revision.
//

View File

@@ -46,8 +46,10 @@
# include <math.h>
#endif
#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
FG_USING_STD(ostream);
FG_USING_STD(istream);
#endif
// -rp- assert.h is buggy under MWCWP3, as multiple #include undef assert !
#ifdef __MWERKS__
@@ -335,6 +337,9 @@ Point3D::distance3Dsquared(const Point3D& a ) const
// $Log$
// Revision 1.10 1999/03/02 01:01:52 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.9 1999/02/01 21:08:28 curt
// Optimizations from Norman Vine.
//

View File

@@ -82,7 +82,7 @@ void map_vec_onto_cur_surface_plane(MAT3vec normal, MAT3vec v0, MAT3vec vec,
// find the shortest distance from the point to the line
double fgPointLine(MAT3vec p, MAT3vec p0, MAT3vec d) {
MAT3vec u, u1, v;
double ud, dd, tmp, dist;
double ud, dd, tmp;
// u = p - p0
MAT3_SUB_VEC(u, p, p0);
@@ -99,9 +99,7 @@ double fgPointLine(MAT3vec p, MAT3vec p0, MAT3vec d) {
// original point, p.
MAT3_SUB_VEC(v, u, u1);
dist = sqrt(MAT3_DOT_PRODUCT(v, v));
return( dist );
return sqrt(MAT3_DOT_PRODUCT(v, v));
}
@@ -131,6 +129,9 @@ double fgPointLineSquared(MAT3vec p, MAT3vec p0, MAT3vec d) {
// $Log$
// Revision 1.6 1999/03/25 19:02:28 curt
// Minor optimization tweaks.
//
// Revision 1.5 1998/10/16 23:36:38 curt
// c++-ifying.
//

View File

@@ -32,21 +32,27 @@
# include "Include/config.h"
#endif
#include <string>
#include <Include/compiler.h>
#include "Include/compiler.h"
#ifdef FG_HAVE_STD_INCLUDES
#if defined( FG_HAVE_STD_INCLUDES )
# include <istream>
#elif defined ( FG_HAVE_NATIVE_SGI_COMPILERS )
# include <CC/stream.h>
#else
# include <istream.h>
#endif
FG_USING_STD(string);
FG_USING_STD(istream);
#include STL_STRING
#include "zfstream.hxx"
FG_USING_STD(string);
#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
FG_USING_STD(istream);
#endif
//-----------------------------------------------------------------------------
//
// Envelope class for gzifstream.
@@ -72,6 +78,8 @@ public:
void close() { gzbuf.close(); }
bool is_open() { return gzbuf.is_open(); }
private:
// Not defined!
fg_gzifstream( const fg_gzifstream& );
@@ -92,6 +100,15 @@ istream& skipcomment( istream& in );
#endif /* _FGSTREAM_HXX */
// $Log$
// Revision 1.9 1999/03/27 14:04:25 curt
// Added is_open() so we can check if the open() succeeded.
//
// Revision 1.8 1999/03/02 01:01:55 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.7 1999/02/26 22:08:08 curt
// Added initial support for native SGI compilers.
//
// Revision 1.6 1999/01/19 20:41:46 curt
// Portability updates contributed by Bernie Bright.
//

View File

@@ -24,8 +24,8 @@
#ifndef STRUTILS_H
#define STRUTILS_H
#include <string>
#include "Include/compiler.h"
#include <Include/compiler.h>
#include STL_STRING
#ifdef FG_HAVE_STD_INCLUDES
# include <cstdlib>
@@ -64,6 +64,12 @@ atoi( const string& str )
#endif // STRUTILS_H
// $Log$
// Revision 1.6 1999/03/02 01:01:56 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.5 1999/02/26 22:08:09 curt
// Added initial support for native SGI compilers.
//
// Revision 1.4 1999/01/19 20:41:47 curt
// Portability updates contributed by Bernie Bright.
//

View File

@@ -66,6 +66,8 @@ FG_USING_STD(streamoff);
#if defined(__GNUC__) && __GNUC_MINOR__ < 8
# define ios_binary ios::bin
#elif defined( FG_HAVE_NATIVE_SGI_COMPILERS )
# define ios_binary 0
#else
# define ios_binary ios::binary
#endif
@@ -152,6 +154,12 @@ struct gzifstream_base
#endif // _zfstream_hxx
// $Log$
// Revision 1.9 1999/03/08 22:00:12 curt
// Tweak for native SGI compilers.
//
// Revision 1.8 1999/02/26 22:08:10 curt
// Added initial support for native SGI compilers.
//
// Revision 1.7 1999/01/19 20:41:49 curt
// Portability updates contributed by Bernie Bright.
//

View File

@@ -34,14 +34,14 @@
# include <config.h>
#endif
#include "Include/compiler.h"
#include <string>
FG_USING_STD(string);
#if defined( WIN32 ) && !defined( __CYGWIN__) && !defined( __CYGWIN32__ )
# include <windows.h>
#endif
#include <Include/compiler.h>
#include STL_STRING
FG_USING_STD(string);
// if someone know how to do this all with C++ streams let me know
// #include <stdio.h>
@@ -80,6 +80,12 @@ public:
// $Log$
// Revision 1.5 1999/03/02 01:01:58 curt
// Tweaks for compiling with native SGI compilers.
//
// Revision 1.4 1999/02/26 22:08:13 curt
// Added initial support for native SGI compilers.
//
// Revision 1.3 1999/02/02 20:13:24 curt
// MSVC++ portability changes by Bernie Bright:
//