Removed for this version of weather code.
This commit is contained in:
parent
5c487a7803
commit
1963e006c3
7 changed files with 0 additions and 1346 deletions
|
@ -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;
|
||||
}
|
||||
|
|
@ -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*/
|
|
@ -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;
|
||||
}
|
|
@ -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*/
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -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*/
|
|
@ -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( ¤ttime );
|
||||
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( ¤ttime );
|
||||
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( ¤ttime );
|
||||
for (;currenttime<(starttime+10);)
|
||||
{
|
||||
time( ¤ttime );
|
||||
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( ¤ttime );
|
||||
for (;currenttime<(starttime+10);)
|
||||
{
|
||||
time( ¤ttime );
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Add table
Reference in a new issue