From 1963e006c31bc2ed880557dd0c8778a57465e9cb Mon Sep 17 00:00:00 2001 From: curt Date: Thu, 23 Dec 1999 16:49:30 +0000 Subject: [PATCH] Removed for this version of weather code. --- src/WeatherCM/FGGlobalWeatherDatabase.cpp | 265 ---------------------- src/WeatherCM/FGGlobalWeatherDatabase.h | 173 -------------- src/WeatherCM/FGMicroWeather.cpp | 173 -------------- src/WeatherCM/FGMicroWeather.h | 142 ------------ src/WeatherCM/FGVoronoi.cpp | 226 ------------------ src/WeatherCM/FGVoronoi.h | 112 --------- src/WeatherCM/test.cpp | 255 --------------------- 7 files changed, 1346 deletions(-) delete mode 100644 src/WeatherCM/FGGlobalWeatherDatabase.cpp delete mode 100644 src/WeatherCM/FGGlobalWeatherDatabase.h delete mode 100644 src/WeatherCM/FGMicroWeather.cpp delete mode 100644 src/WeatherCM/FGMicroWeather.h delete mode 100644 src/WeatherCM/FGVoronoi.cpp delete mode 100644 src/WeatherCM/FGVoronoi.h delete mode 100644 src/WeatherCM/test.cpp diff --git a/src/WeatherCM/FGGlobalWeatherDatabase.cpp b/src/WeatherCM/FGGlobalWeatherDatabase.cpp deleted file mode 100644 index 172adf1c2..000000000 --- a/src/WeatherCM/FGGlobalWeatherDatabase.cpp +++ /dev/null @@ -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 -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 (dp, (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() 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 -#endif - -#include - -#include -#include STL_IOSTREAM - -#include - -#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*/ diff --git a/src/WeatherCM/FGMicroWeather.cpp b/src/WeatherCM/FGMicroWeather.cpp deleted file mode 100644 index 600e72581..000000000 --- a/src/WeatherCM/FGMicroWeather.cpp +++ /dev/null @@ -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 - -#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 //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; -} diff --git a/src/WeatherCM/FGMicroWeather.h b/src/WeatherCM/FGMicroWeather.h deleted file mode 100644 index 18e37e19a..000000000 --- a/src/WeatherCM/FGMicroWeather.h +++ /dev/null @@ -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 - -#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 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*/ diff --git a/src/WeatherCM/FGVoronoi.cpp b/src/WeatherCM/FGVoronoi.cpp deleted file mode 100644 index 63ab8f202..000000000 --- a/src/WeatherCM/FGVoronoi.cpp +++ /dev/null @@ -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 -#include - -#include - -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 xmax) - xmax = sites[i].coord.x; - }; - - ymin = sites[0].coord.y; - ymax = sites[nsites-1].coord.y; - - return true; -} - - -} - - diff --git a/src/WeatherCM/FGVoronoi.h b/src/WeatherCM/FGVoronoi.h deleted file mode 100644 index b2906dece..000000000 --- a/src/WeatherCM/FGVoronoi.h +++ /dev/null @@ -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 -#endif - -#include - -#ifdef HAVE_WINDOWS_H -# include -#endif - -#include - -#include "sg.h" - -#include "FGWeatherVectorWrap.h" -#include "FGPhysicalProperties.h" - -/****************************************************************************/ -/* DEFINES */ -/****************************************************************************/ -FG_USING_STD(vector); -FG_USING_NAMESPACE(std); - -typedef vector 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 FGVoronoiInputList; -typedef vector FGVoronoiOutputList; - -/****************************************************************************/ -/* FUNCTION DECLARATION */ -/****************************************************************************/ -FGVoronoiOutputList Voronoiate(const FGVoronoiInputList& input); - -#endif /*FGVoronoi_H*/ diff --git a/src/WeatherCM/test.cpp b/src/WeatherCM/test.cpp deleted file mode 100644 index 4ecf7c6df..000000000 --- a/src/WeatherCM/test.cpp +++ /dev/null @@ -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 -#include STL_IOSTREAM -#include - -/****************************************************************************/ -/********************************** 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 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; -} - - - - - - - - - - - - - - -