1
0
Fork 0

Removed for this version of weather code.

This commit is contained in:
curt 1999-12-23 16:49:30 +00:00
parent 5c487a7803
commit 1963e006c3
7 changed files with 0 additions and 1346 deletions

View file

@ -1,265 +0,0 @@
/*****************************************************************************
Module: FGGlobalWeatherDatabase.cpp
Author: Christian Mayer
Date started: 28.05.99
Called by: main program
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Database for the global weather
This database is only called by the local database and by the weather
simulator driving this database
HISTORY
------------------------------------------------------------------------------
28.05.1999 Christian Mayer Created
16.06.1999 Durk Talsma Portability for Linux
20.06.1999 Christian Mayer added lots of consts
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#include "FGGlobalWeatherDatabase.h"
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
template<class V>
V triangle_interpolate(const sgVec2& x1, const V& v1, const sgVec2& x2, const V& v2, const sgVec2& x3, const V& v3, const sgVec2& p)
{
/************************************************************************/
/* First I have to solve the two equations. Rewritten they look like: */
/* */
/* a11 * x1 + a12 * x2 = b1 */
/* a21 * x1 + a22 * x2 = b2 */
/* */
/* with */
/* */
/* a11 = x2[0] - x1[0] a12 = x3[0] - x1[0] b1 = p[0] - x1[0] */
/* a21 = x2[1] - x1[1] a22 = x3[1] - x1[1] b2 = p[1] - x1[1] */
/* */
/* So I can easily get the solution by saying: */
/* */
/* | a11 a12 | */
/* D = | | */
/* | a21 a22 | */
/* */
/* | b1 a12 | | a11 b1 | */
/* | | | | */
/* | b2 a22 | | a21 b2 | */
/* x1 = ----------- x2 = ----------- */
/* D D */
/* */
/* I just need to take care then that D != 0 or I would get no */
/* solution or an infinite amount. Both wouildn't be good... */
/************************************************************************/
float D = (x2[0] - x1[0]) * (x3[1] - x1[1]) - (x2[1] - x1[1]) * (x3[0] - x1[0]);
if (D == 0.0)
return v1; //BAD THING HAPPENED!!! I should throw an exeption
float x = ( (p [0] - x1[0]) * (x3[1] - x1[1]) - (p [1] - x1[1]) * (x3[0] - x1[0]) ) / D;
float y = ( (x2[0] - x1[0]) * (p [1] - x1[1]) - (x2[1] - x1[1]) * (p [0] - x1[0]) ) / D;
return v1 + x * (v2 - v1) + y * (v3 - v1);
}
/****************************************************************************/
/* Constructor and Destructor */
/****************************************************************************/
FGGlobalWeatherDatabase::FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus s)
{
DatabaseStatus = s;
}
FGGlobalWeatherDatabase::~FGGlobalWeatherDatabase()
{
}
/****************************************************************************/
/* Get the physical properties on the specified point p */
/* do this by interpolating between the 3 closest points */
/****************************************************************************/
FGPhysicalProperties FGGlobalWeatherDatabase::get(const sgVec2& p) const
{
WeatherPrecision distance[3]; //store the 3 closest distances
FGPhysicalProperties2DVectorConstIt iterator[3]; //and the coresponding iterators
WeatherPrecision d;
distance[0] = 9.46e15; //init with a distance that every calculated
distance[1] = 9.46e15; //distance is guranteed to be shorter as
distance[2] = 9.46e15; //9.46e15 metres are 1 light year...
for (FGPhysicalProperties2DVectorConstIt it=database.begin(); it!=database.end(); it++)
{ //go through the whole database
d = sgDistanceVec2(it->p, p);
if (d<distance[0])
{
distance[2] = distance[1]; distance[1] = distance[0]; distance[0] = d;
iterator[2] = iterator[1]; iterator[1] = iterator[0]; iterator[0] = it;
//NOTE: The last line causes a warning that an unitialized variable
//is used. You can ignore this warning here.
}
else if (d<distance[1])
{
distance[2] = distance[1]; distance[1] = d;
iterator[2] = iterator[1]; iterator[1] = it;
}
else if (d<distance[2])
{
distance[2] = d;
iterator[2] = it;
}
}
//now I've got the closest entry in xx[0], the 2nd closest in xx[1] and the
//3rd in xx[2];
//interpolate now:
return triangle_interpolate(
iterator[0]->p, (FGPhysicalProperties)*iterator[0],
iterator[1]->p, (FGPhysicalProperties)*iterator[1],
iterator[2]->p, (FGPhysicalProperties)*iterator[2], p);
}
/****************************************************************************/
/* update the database. Since the last call we had dt seconds */
/****************************************************************************/
void FGGlobalWeatherDatabase::update(const WeatherPrecision dt)
{
// I've got nothing to update here (yet...)
}
/****************************************************************************/
/* Add a physical property on the specified point p */
/****************************************************************************/
void FGGlobalWeatherDatabase::add(const sgVec2& p, const FGPhysicalProperties& x)
{
FGPhysicalProperties2D e;
sgCopyVec2(e.p, p);
e.Wind = x.Wind;
e.Turbulence = x.Turbulence;
e.Temperature = x.Temperature;
e.AirPressure = x.AirPressure;
e.VaporPressure = x.VaporPressure;
e.Clouds = x.Clouds;
e.SnowRainIntensity = x.SnowRainIntensity;
e.snowRainType = x.snowRainType;
e.LightningProbability = x.LightningProbability;
database.push_back(e);
}
/****************************************************************************/
/* Change the closest physical property to p. If p is further away than */
/* tolerance I'm returning false otherwise true */
/****************************************************************************/
bool FGGlobalWeatherDatabase::change(const FGPhysicalProperties2D& p, const WeatherPrecision tolerance)
{
for (FGPhysicalProperties2DVectorIt it = database.begin(); it != database.end(); it++)
{
if (sgScalarProductVec2(it->p, p.p) < (tolerance*tolerance))
{ //assume that's my point
(*it) = p;
return true;
}
}
return false;
}
/****************************************************************************/
/* Get all, but at least min, stored point in the circle around p with the */
/* radius r */
/****************************************************************************/
FGPhysicalProperties2DVector FGGlobalWeatherDatabase::getAll(const sgVec2& p, const WeatherPrecision r, const unsigned int min)
{
FGPhysicalProperties2DVector ret_list;
if ( (DatabaseStatus == FGGlobalWeatherDatabase_only_static)
||(DatabaseStatus == FGGlobalWeatherDatabase_working ) )
{ //doest it make sense?
FGPhysicalProperties2DVectorIt *it; //store the closest entries
WeatherPrecision *d;
unsigned int act_it = 0;
int i;
it = new FGPhysicalProperties2DVectorIt[min+1];
d = new WeatherPrecision[min+1];
for (it[0]=database.begin(); it[act_it]!=database.end(); it[act_it]++)
{ //go through the whole database
d[act_it] = sgScalarProductVec2(it[act_it]->p, p);
if (r >= d[act_it])
{ //add it
ret_list.push_back(*it[act_it]);
}
else
{
if (act_it>0)
{ //figure out if this distance belongs to the closest ones
WeatherPrecision dummy;
FGPhysicalProperties2DVectorIt dummyIt;
for (i = act_it++; i >= 0;)
{
if (d[i] >= d[--i])
{
act_it--;
break; //nope => stop
}
//swap both
dummy =d[i]; d[i] = d[i+1]; d[i+1] = dummy;
dummyIt = it[i]; it[i] = it[i+1]; it[i+1] = dummyIt;
}
}
}
}
if (ret_list.size()<min)
{
for(i = 0; (i < (int)(min - ret_list.size())) && (ret_list.size() < database.size()); i++)
ret_list.push_back(*it[i]);
}
delete d;
delete it;
}
return ret_list;
}

View file

@ -1,173 +0,0 @@
/*****************************************************************************
Header: FGGlobalWeatherDatabase.h
Author: Christian Mayer
Date started: 28.05.99
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Database for the global weather
This database is only called by the local database and by the weather
simulator driving this database
HISTORY
------------------------------------------------------------------------------
28.05.1999 Christian Mayer Created
16.06.1999 Durk Talsma Portability for Linux
20.06.1999 Christian Mayer added lots of consts
30.06.1999 Christian Mayer STL portability
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* SENTRY */
/****************************************************************************/
#ifndef FGGlobalWeatherDatabase_H
#define FGGlobalWeatherDatabase_H
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Include/compiler.h>
#include <vector>
#include STL_IOSTREAM
#include <sg.h>
#include "FGPhysicalProperties.h"
#include "FGPhysicalProperty.h"
/****************************************************************************/
/* DEFINES */
/****************************************************************************/
FG_USING_STD(vector);
#ifndef FG_HAVE_NATIVE_SGI_COMPILERS
FG_USING_STD(iostream);
#endif
FG_USING_NAMESPACE(std);
enum FGGlobalWeatherDatabaseStatus {
FGGlobalWeatherDatabase_not_used,
FGGlobalWeatherDatabase_switched_off,
FGGlobalWeatherDatabase_only_static,
FGGlobalWeatherDatabase_working
};
class FGGlobalWeatherDatabase;
ostream& operator<< ( ostream& out, const FGGlobalWeatherDatabase& p );
/****************************************************************************/
/* CLASS DECLARATION */
/****************************************************************************/
class FGGlobalWeatherDatabase
{
private:
protected:
FGGlobalWeatherDatabaseStatus DatabaseStatus;
FGPhysicalProperties2DVector database;
public:
/************************************************************************/
/* Constructor and Destructor */
/************************************************************************/
FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus s = FGGlobalWeatherDatabase_not_used);
~FGGlobalWeatherDatabase();
/************************************************************************/
/* Get the physical properties on the specified point p */
/************************************************************************/
FGPhysicalProperties get(const sgVec2& p) const;
FGPhysicalProperty get(const sgVec3& p) const
{
sgVec2 temp;
sgSetVec2( temp, p[0], p[1] );
return FGPhysicalProperty( get(temp), p[3] );
}
/************************************************************************/
/* update the database. Since the last call we had dt seconds */
/************************************************************************/
void update(const WeatherPrecision dt);
/************************************************************************/
/* Add a physical property on the specified point p */
/************************************************************************/
void add(const sgVec2& p, const FGPhysicalProperties& x);
void add(const FGPhysicalProperties2D& x)
{
database.push_back(x);
}
/************************************************************************/
/* Change the closest physical property to p. If p is further away than */
/* tolerance I'm returning false otherwise true */
/************************************************************************/
bool change(const FGPhysicalProperties2D& p, const WeatherPrecision tolerance = 0.0000001);
/************************************************************************/
/* Get all stored points in the circle around p with the radius r, but */
/* at least min points. */
/************************************************************************/
FGPhysicalProperties2DVector getAll(const sgVec2& p, const WeatherPrecision r, const unsigned int min = 0);
FGPhysicalProperties2DVector getAll(const sgVec3& p, const WeatherPrecision r, const unsigned int min = 0)
{
sgVec2 temp;
sgSetVec2(temp, p[0], p[1]);
return getAll(temp, r, min);
}
/************************************************************************/
/* get/set the operating status of the database */
/************************************************************************/
FGGlobalWeatherDatabaseStatus getDatabaseStatus(void) const { return DatabaseStatus; }
void setDatabaseStatus(const FGGlobalWeatherDatabaseStatus& s) { DatabaseStatus = s; }
/************************************************************************/
/* Dump the whole database */
/************************************************************************/
friend ostream& operator<< ( ostream& out, const FGGlobalWeatherDatabase& p );
};
inline ostream& operator<< ( ostream& out, const FGGlobalWeatherDatabase& p )
{
//out << "Database status: " << DatabaseStatus << "\n";
out << "Database number of entries: " << p.database.size() << "\n";
for (FGPhysicalProperties2DVector::const_iterator it = p.database.begin(); it != p.database.end(); it++)
out << "Next entry: " << *it;
return out;
}
/****************************************************************************/
#endif /*FGGlobalWeatherDatabase_H*/

View file

@ -1,173 +0,0 @@
/*****************************************************************************
Module: FGMicroWeather.cpp
Author: Christian Mayer
Date started: 28.05.99
Called by: FGLocalWeatherDatabase
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Handle the weather areas
HISTORY
------------------------------------------------------------------------------
28.05.1999 Christian Mayer Created
16.06.1999 Durk Talsma Portability for Linux
20.06.1999 Christian Mayer added lots of consts
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#include <Include/compiler.h>
#include <Include/fg_constants.h>
#include "FGMicroWeather.h"
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
FGMicroWeather::FGMicroWeather(const FGPhysicalProperties2D& p, const positionList& points)
{
StoredWeather = p;
position = points;
}
FGMicroWeather::~FGMicroWeather()
{
}
/****************************************************************************/
/* Add the features to the micro weather */
/* return succss */
/****************************************************************************/
void FGMicroWeather::addWind(const WeatherPrecision alt, const FGWindItem& x)
{
StoredWeather.Wind[alt] = x;
}
void FGMicroWeather::addTurbulence(const WeatherPrecision alt, const FGTurbulenceItem& x)
{
StoredWeather.Turbulence[alt] = x;
}
void FGMicroWeather::addTemperature(const WeatherPrecision alt, const WeatherPrecision x)
{
StoredWeather.Temperature[alt] = x;
}
void FGMicroWeather::addAirPressure(const WeatherPrecision alt, const WeatherPrecision x)
{
cerr << "Error: caught attempt to add AirPressure which is logical wrong\n";
//StoredWeather.AirPressure[alt] = x;
}
void FGMicroWeather::addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x)
{
StoredWeather.VaporPressure[alt] = x;
}
void FGMicroWeather::addCloud(const WeatherPrecision alt, const FGCloudItem& x)
{
StoredWeather.Clouds[alt] = x;
}
void FGMicroWeather::setSnowRainIntensity(const WeatherPrecision x)
{
StoredWeather.SnowRainIntensity = x;
}
void FGMicroWeather::setSnowRainType(const SnowRainType x)
{
StoredWeather.snowRainType = x;
}
void FGMicroWeather::setLightningProbability(const WeatherPrecision x)
{
StoredWeather.LightningProbability = x;
}
void FGMicroWeather::setStoredWeather(const FGPhysicalProperties2D& x)
{
StoredWeather = x;
}
/****************************************************************************/
/* return true if p is inside this micro weather */
/* code stolen from $FG_ROOT/Simulator/Objects/fragment.cxx, which was */
/* written by Curtis L. Olson - curt@me.umn.edu */
/****************************************************************************/
template <class T> //template to help with the calulation
inline const int FG_SIGN(const T& x) {
return x < T(0) ? -1 : 1;
}
bool FGMicroWeather::hasPoint(const sgVec2& p) const
{
if (position.size()==0)
return true; //no border => this tile is infinite
if (position.size()==1)
return false; //a border on 1 point?!?
//when I'm here I've got at least 2 points
WeatherPrecision t;
signed char side1, side2;
const_positionListIt it = position.begin();
const_positionListIt it2 = it; it2++;
for (;;)
{
if (it2 == position.end())
break;
if (fabs(it->p[0] - it2->p[0]) >= FG_EPSILON)
{
t = (it->p[1] - it2->p[1]) / (it->p[0] - it2->p[0]);
side1 = FG_SIGN (t * (StoredWeather.p[0] - it2->p[0]) + it2->p[1] - StoredWeather.p[1]);
side2 = FG_SIGN (t * ( p[0] - it2->p[0]) + it2->p[1] - p[1]);
if ( side1 != side2 )
return false; //cout << "failed side check\n";
}
else
{
t = (it->p[0] - it2->p[0]) / (it->p[1] - it2->p[1]);
side1 = FG_SIGN (t * (StoredWeather.p[1] - it2->p[1]) + it2->p[0] - StoredWeather.p[0]);
side2 = FG_SIGN (t * ( p[1] - it2->p[1]) + it2->p[0] - p[0]);
if ( side1 != side2 )
return false; //cout << "failed side check\n";
}
it++; it2++;
}
return true;
}

View file

@ -1,142 +0,0 @@
/*****************************************************************************
Header: FGMicroWeather.h
Author: Christian Mayer
Date started: 28.05.99
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Store the single weather areas
HISTORY
------------------------------------------------------------------------------
28.05.1999 Christian Mayer Created
16.06.1999 Durk Talsma Portability for Linux
20.06.1999 Christian Mayer added lots of consts
30.06.1999 Christian Mayer STL portability
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* SENTRY */
/****************************************************************************/
#ifndef FGMicroWeather_H
#define FGMicroWeather_H
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#include <set>
#include "sg.h"
#include "FGWeatherVectorWrap.h"
#include "FGWeatherDefs.h"
//Include all the simulated weather features
#include "FGCloud.h"
#include "FGSnowRain.h"
#include "FGAirPressureItem.h"
#include "FGWindItem.h"
#include "FGTurbulenceItem.h"
#include "FGPhysicalProperties.h"
#include "FGPhysicalProperty.h"
/****************************************************************************/
/* DEFINES */
/****************************************************************************/
FG_USING_STD(set);
FG_USING_NAMESPACE(std);
/****************************************************************************/
/* CLASS DECLARATION */
/****************************************************************************/
class FGMicroWeather
{
private:
protected:
typedef vector<sgVec2Wrap> positionList;
typedef positionList::iterator positionListIt;
typedef positionList::const_iterator const_positionListIt;
positionList position; //the points that specify the outline of the
//micro weather (lat/lon)
FGPhysicalProperties2D StoredWeather; //property if nothing is specified
public:
/************************************************************************/
/* Constructor and Destructor */
/************************************************************************/
FGMicroWeather(const FGPhysicalProperties2D& p, const positionList& points);
~FGMicroWeather();
/************************************************************************/
/* Add a feature to the micro weather */
/************************************************************************/
void addWind (const WeatherPrecision alt, const FGWindItem& x);
void addTurbulence (const WeatherPrecision alt, const FGTurbulenceItem& x);
void addTemperature (const WeatherPrecision alt, const WeatherPrecision x);
void addAirPressure (const WeatherPrecision alt, const WeatherPrecision x);
void addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x);
void addCloud (const WeatherPrecision alt, const FGCloudItem& x);
void setSnowRainIntensity (const WeatherPrecision x);
void setSnowRainType (const SnowRainType x);
void setLightningProbability(const WeatherPrecision x);
void setStoredWeather (const FGPhysicalProperties2D& x);
/************************************************************************/
/* get physical properties in the micro weather */
/* NOTE: I don't neet to speify a positon as the properties don't */
/* change in a micro weather */
/************************************************************************/
FGPhysicalProperties get(void) const
{
return FGPhysicalProperties();
}
FGPhysicalProperty get(const WeatherPrecision altitude) const
{
return FGPhysicalProperty(StoredWeather, altitude);
}
/************************************************************************/
/* return true if p is inside this micro weather */
/************************************************************************/
bool hasPoint(const sgVec2& p) const;
bool hasPoint(const sgVec3& p) const
{
sgVec2 temp;
sgSetVec2(temp, p[0], p[1]);
return hasPoint( temp );
}
};
/****************************************************************************/
#endif /*FGMicroWeather_H*/

View file

@ -1,226 +0,0 @@
/*****************************************************************************
Module: FGVoronoi.cpp
Author: Christian Mayer
Date started: 28.05.99
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
library for Voronoi Diagram calculation based on Steven Fortune 'Sweep2'
FGVoronoi is the wraper to feed the voronoi calulation with a vetor of points
and any class you want, as it uses templates
NOTE: Sweep2 didn't free *any* memory. So I'm doing what I can, but that's not
good enough...
HISTORY
------------------------------------------------------------------------------
30.05.99 Christian Mayer Created
16.06.99 Durk Talsma Portability for Linux
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#include "FGVoronoi.h"
#include <Voronoi/voronoi.h>
#include <Voronoi/my_memory.h>
#include <Voronoi/defs.h>
extern "C" {
//forward definitions
void voronoi(int triangulate, struct Site *(*nextsite)());
void geominit();
void freeinit(struct Freelist *fl, int size);
struct Site *nextone();
bool readsites(PointList input);
};
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
FGVoronoiOutputList Voronoiate(const FGVoronoiInputList& input)
{
FGVoronoiOutputList ret_list;
PointList p2ds;
FGVoronoiInputList::const_iterator it1;
//get the points
for (it1 = input.begin(); it1 != input.end(); it1++)
{
p2ds.push_back(VoronoiPoint(it1->position[0], it1->position[1]));
}
cl.clear(); //make sure that it's empty
if (readsites(p2ds) == false)
return ret_list;
freeinit(&sfl, sizeof *sites);
siteidx = 0;
geominit();
voronoi(triangulate, nextone);
_my_free();
/*free(sites); //to prevent a *big* memory leak...
free(ELhash); //Sweep2 didn't free *any* memory...
free(PQhash);*/
for (cellList::iterator it2 = cl.begin(); it2 != cl.end(); it2++)
{
it2->sort();
it2->strip();
//uncomment for debugging
//cout << *it2;
Point2DList boundary;
//copy points
PointList::iterator it3 = it2->boundary.begin();
if (it3->infinity == false)
boundary.push_back( sgVec2Wrap(it3->p) );
else
{
sgVec2 direction_vector;
sgCopyVec2(direction_vector, it3->p);
it3++;
sgAddVec2(direction_vector, it3->p);
boundary.push_back( direction_vector );
}
for (; it3 != it2->boundary.end(); it3++)
{
boundary.push_back( sgVec2Wrap(it3->p) );
}
it3--;
if (it3->infinity == true)
{
sgVec2 direction_vector;
sgCopyVec2(direction_vector, it3->p);
it3--;
sgAddVec2(direction_vector, it3->p);
boundary.pop_back();
boundary.push_back(direction_vector);
}
ret_list.push_back(FGVoronoiOutput(boundary, input[it2->ID].value));
}
return ret_list;
}
extern "C"
{
/* return a single in-storage site */
struct Site *nextone(void)
{
struct Site *s;
if(siteidx < nsites)
{
s = &sites[siteidx];
siteidx ++;
return(s);
}
else
return( (struct Site *)NULL);
}
/* sort sites on y, then x, coord */
//int scomp(const struct Point *s1, const struct Point *s2)
int scomp(const void *s1, const void *s2)
{
if(((Point*)s1) -> y < ((Point*)s2) -> y) return(-1);
if(((Point*)s1) -> y > ((Point*)s2) -> y) return(1);
if(((Point*)s1) -> x < ((Point*)s2) -> x) return(-1);
if(((Point*)s1) -> x > ((Point*)s2) -> x) return(1);
return(0);
}
/* read all sites, sort, and compute xmin, xmax, ymin, ymax */
bool readsites(PointList input)
{
int i;
if (input.size() == 0)
return false; //empty array
PointList::iterator It = input.begin();
nsites=0;
sites = (struct Site *) myalloc(4000*sizeof(*sites));
while(It != input.end())
{
sites[nsites].coord.x = It->p[0];
sites[nsites].coord.y = It->p[1];
sites[nsites].sitenbr = nsites;
sites[nsites].refcnt = 0;
nsites ++;
It++;
if (nsites % 4000 == 0)
sites = (struct Site *) my_realloc(sites,(nsites+4000)*sizeof(*sites));
};
qsort(sites, nsites, sizeof (*sites), scomp);
xmin=sites[0].coord.x;
xmax=sites[0].coord.x;
for(i=1; i<nsites; i+=1)
{
if(sites[i].coord.x < xmin)
xmin = sites[i].coord.x;
if(sites[i].coord.x > xmax)
xmax = sites[i].coord.x;
};
ymin = sites[0].coord.y;
ymax = sites[nsites-1].coord.y;
return true;
}
}

View file

@ -1,112 +0,0 @@
/*****************************************************************************
Header: FGVoronoi.h
Author: Christian Mayer
Date started: 28.05.99
-------- Copyright (C) 1999 Christian Mayer (fgfs@christianmayer.de) --------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
library for Voronoi Diagram calculation based on Steven Fortune 'Sweep2'
FGVoronoi is the wraper to feed the voronoi calulation with a vetor of points
and any class you want, as it uses templates
NOTE: Sweep2 didn't free *any* memory. So I'm doing what I can, but that's not
good enough...
HISTORY
------------------------------------------------------------------------------
30.05.1999 Christian Mayer Created
16.06.1999 Durk Talsma Portability for Linux
20.06.1999 Christian Mayer added lots of consts
30.06.1999 Christian Mayer STL portability
11.10.1999 Christian Mayer changed set<> to map<> on Bernie Bright's
suggestion
19.10.1999 Christian Mayer change to use PLIB's sg instead of Point[2/3]D
and lots of wee code cleaning
*****************************************************************************/
/****************************************************************************/
/* SENTRY */
/****************************************************************************/
#ifndef FGVoronoi_H
#define FGVoronoi_H
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <Include/compiler.h>
#ifdef HAVE_WINDOWS_H
# include <windows.h>
#endif
#include <vector>
#include "sg.h"
#include "FGWeatherVectorWrap.h"
#include "FGPhysicalProperties.h"
/****************************************************************************/
/* DEFINES */
/****************************************************************************/
FG_USING_STD(vector);
FG_USING_NAMESPACE(std);
typedef vector<sgVec2Wrap> Point2DList;
struct FGVoronoiInput
{
sgVec2 position;
FGPhysicalProperties2D value;
FGVoronoiInput(const sgVec2& p, const FGPhysicalProperties2D& v)
{
sgCopyVec2(position, p);
value = v;
}
};
struct FGVoronoiOutput
{
Point2DList boundary;
FGPhysicalProperties2D value;
FGVoronoiOutput(const Point2DList& b, const FGPhysicalProperties2D& v)
{
boundary = b;
value = v;
};
};
typedef vector<FGVoronoiInput> FGVoronoiInputList;
typedef vector<FGVoronoiOutput> FGVoronoiOutputList;
/****************************************************************************/
/* FUNCTION DECLARATION */
/****************************************************************************/
FGVoronoiOutputList Voronoiate(const FGVoronoiInputList& input);
#endif /*FGVoronoi_H*/

View file

@ -1,255 +0,0 @@
/*****************************************************************************
Module: test.cpp
Author: Christian Mayer
Date started: 28.05.99
Called by: command line
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
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., 59 Temple
Place - Suite 330, Boston, MA 02111-1307, USA.
Further information about the GNU General Public License can also be found on
the world wide web at http://www.gnu.org.
FUNCTIONAL DESCRIPTION
------------------------------------------------------------------------------
Test program for the weather database
HISTORY
------------------------------------------------------------------------------
28.05.99 CM Created
*****************************************************************************/
/****************************************************************************/
/* INCLUDES */
/****************************************************************************/
#include "FGLocalWeatherDatabase.h"
#include "FGGlobalWeatherDatabase.h"
#include "LibVoronoi/FGVoronoi.h"
#include "FGWeatherUtils.h"
#include <time.h>
#include STL_IOSTREAM
#include <vector>
/****************************************************************************/
/********************************** CODE ************************************/
/****************************************************************************/
int main(void)
{
//init local database:
FGLocalWeatherDatabase local(Point3D(0,0,0), 10000, FGLocalWeatherDatabase::use_global);
FGGlobalWeatherDatabase global(FGGlobalWeatherDatabase_working);
Point3D p(0);
Point2D p2d(0);
FGPhysicalProperties x;
FGPhysicalProperties2D x2d;
FGPhysicalProperties2DVector getAllvect;
cout << "\n**************** FGGlobalWeatherDatabase Test ****************\n";
x.Temperature.insert(FGTemperatureItem(100, Celsius(10)));
global.add(Point2D(5,5), x);
x.Temperature.insert(FGTemperatureItem(110, Celsius(-10)));
global.add(Point3D(10,10,10), x);
x2d.Temperature.insert(FGTemperatureItem(90, Celsius(-20)));
x2d.p = Point2D(10,5);
global.add(x2d);
getAllvect = global.getAll(p2d, 10000);
cout << "Returned size: " << getAllvect.size() << "\n";
getAllvect = global.getAll(p2d, 10000, 30);
cout << "Returned size: " << getAllvect.size() << "\n";
getAllvect = global.getAll(p, 10000);
cout << "Returned size: " << getAllvect.size() << "\n";
getAllvect = global.getAll(p, 10000, 3);
cout << "Returned size: " << getAllvect.size() << "\n";
cout << "Temperature: " << global.get(Point3D(5, 5, 100)).Temperature << "°C\n";
cout << "AirPressure at 0m: " << global.get(Point3D(5, 5, 0)).AirPressure << "\n";
cout << "AirPressure at 1000m: " << global.get(Point3D(5, 5, 1000)).AirPressure << "\n";
cout << global;
cout << "\n**************** FGMicroWeather Test ****************\n";
vector<Point2D> points;
points.push_back(Point2D(0.1, 0.1));
points.push_back(Point2D(0.9, 0.1));
points.push_back(Point2D(0.9, 0.9));
points.push_back(Point2D(0.1, 0.9));
points.push_back(Point2D(0.1, 0.1));
x2d.p = Point2D(0.4, 0.4);
FGMicroWeather micro(x2d, points);
cout << "hasPoint 0.5, 0.5: ";
if (micro.hasPoint(Point2D(0.5, 0.5)) == true)
cout << "true";
else
cout << "false";
cout << "\nhasPoint 0.9, 0.5: ";
if (micro.hasPoint(Point2D(0.9, 0.5)) == true)
cout << "true";
else
cout << "false";
cout << "\nhasPoint 1.5, 0.5: ";
if (micro.hasPoint(Point2D(1.5, 0.5)) == true)
cout << "true";
else
cout << "false";
cout << "\n";
cout << "\n**************** Voronoi Diagram Test ****************\n";
FGVoronoiInputList input;
FGVoronoiOutputList output;
FGVoronoiInput test(Point2D(0.0), FGPhysicalProperties2D());
test.position = Point2D(0.1,0.2);
input.push_back(test);
test.position = Point2D(0.8,0.9);
input.push_back(test);
test.position = Point2D(0.9,0.1);
input.push_back(test);
test.position = Point2D(0.6,0.4);
input.push_back(test);
test.position = Point2D(1.1,1.2);
input.push_back(test);
test.position = Point2D(1.8,1.9);
input.push_back(test);
test.position = Point2D(1.9,1.1);
input.push_back(test);
test.position = Point2D(1.6,1.4);
input.push_back(test);
test.position = Point2D(2.9,2.1);
input.push_back(test);
test.position = Point2D(2.6,2.4);
input.push_back(test);
output = Voronoiate(input);
cout << "\n";
for (FGVoronoiOutputList::iterator it=output.begin(); it!=output.end(); it++)
{
cout << "Cell start: ";
for (Point2DList::iterator it2= it->boundary.begin();it2!= it->boundary.end();it2++)
{
if (it2==it->boundary.begin())
cout << "(";
else
cout << "-(";
cout << *it2 << ")";
}
cout << "\n";
}
cout << "\n**************** Database Stress Test ****************\n";
time_t starttime, currenttime;
unsigned long count = 0;
unsigned long count2 = 0;
float xxx, yyy;
cout << "Filling Database... ";
time( &starttime );
for (count = 0; count < 5000; count++)
{
xxx = (rand()%36000)/100.0;
yyy = (rand()%18000)/100.0;
local.addProperties(FGPhysicalProperties2D(FGPhysicalProperties(), Point2D(xxx, yyy)));
}
local.addProperties(FGPhysicalProperties2D(FGPhysicalProperties(), Point3D(-10.0)));
local.addProperties(FGPhysicalProperties2D(FGPhysicalProperties(), Point3D(+10.0)));
local.addProperties(FGPhysicalProperties2D(FGPhysicalProperties(), Point3D(-100.0)));
local.addProperties(FGPhysicalProperties2D(FGPhysicalProperties(), Point3D(+100.0)));
time( &currenttime );
cout << float(count)/float(currenttime - starttime) << "/s filling rate; ";
time( &starttime );
for (count = 0; count < 5; count++)
{
local.reset(FGLocalWeatherDatabase::use_global); //make sure I've got a current voronoi
}
time( &currenttime );
cout << float(currenttime - starttime)/float(count) << "s resetting time; Done\n";
count = 0;
//for (;count<200;)
cout << "local.get() test: 10 seconds\n";
time( &starttime );
time( &currenttime );
for (;currenttime<(starttime+10);)
{
time( &currenttime );
count++;
local.get(Point3D(0.0));
}
cout << "Result: " << float(count) / float(currenttime-starttime) << "/s\n";
count = 0;
cout << "output = Voronoiate(input) test: 10 seconds\n";
time( &starttime );
time( &currenttime );
for (;currenttime<(starttime+10);)
{
time( &currenttime );
count++;
output = Voronoiate(input);
}
cout << "Result: " << float(count) / float(currenttime-starttime) << "/s\n";
cout << "Reference: 176800/s\n";
cout << "\n**************** Database Stress Test end ****************\n";
return 0;
}