Updates by Christian Mayer.
This commit is contained in:
parent
aacffa37d6
commit
2751545008
27 changed files with 636 additions and 521 deletions
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: FGMicroWeather
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -46,8 +48,9 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include "FGWeatherDefs.h"
|
||||
#include <math.h>
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
|
@ -64,31 +67,30 @@ FGAirPressureItem operator-(const FGAirPressureItem& arg);
|
|||
class FGAirPressureItem
|
||||
{
|
||||
private:
|
||||
WeatherPrecition value;
|
||||
WeatherPrecision value;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
FGAirPressureItem(const WeatherPrecition& v) {value = v;}
|
||||
FGAirPressureItem() {value = FG_WEATHER_DEFAULT_AIRPRESSURE;}
|
||||
FGAirPressureItem(const WeatherPrecision v) {value = v;}
|
||||
FGAirPressureItem() {value = FG_WEATHER_DEFAULT_AIRPRESSURE;}
|
||||
|
||||
//WeatherPrecition getValue(WeatherPrecition alt) { return value * pow(1.0 - 0.0065*alt/288.0, 5.255); };
|
||||
|
||||
WeatherPrecition getValue(const WeatherPrecition& alt) const
|
||||
WeatherPrecision getValue(const WeatherPrecision& alt) const
|
||||
{
|
||||
return (WeatherPrecition)((value / 101325.0) *
|
||||
return (WeatherPrecision)((value / 101325.0) *
|
||||
(
|
||||
1.01325e5 + alt * (-1.19459535223623e1 + alt * (5.50461110007561e-4 + alt * (-1.13574703113648e-8 + alt * 8.61601726143988e-14)))
|
||||
));
|
||||
};
|
||||
|
||||
FGAirPressureItem& operator*=(const WeatherPrecition& arg);
|
||||
FGAirPressureItem& operator*=(const WeatherPrecision arg);
|
||||
FGAirPressureItem& operator+=(const FGAirPressureItem& arg);
|
||||
FGAirPressureItem& operator-=(const FGAirPressureItem& arg);
|
||||
|
||||
friend FGAirPressureItem operator-(const FGAirPressureItem& arg);
|
||||
};
|
||||
|
||||
inline FGAirPressureItem& FGAirPressureItem::operator*= (const WeatherPrecition& arg)
|
||||
inline FGAirPressureItem& FGAirPressureItem::operator*= (const WeatherPrecision arg)
|
||||
{
|
||||
value *= arg;
|
||||
return *this;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -34,6 +34,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: FGMicroWeather
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,6 +36,8 @@ HISTORY
|
|||
09.10.1999 Christian Mayer changed CloudItem on Durks request
|
||||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -25,7 +25,7 @@
|
|||
|
||||
FUNCTIONAL DESCRIPTION
|
||||
------------------------------------------------------------------------------
|
||||
Air pressure item that is stored in the micro weather class
|
||||
Cloud item that is stored in the micro weather class
|
||||
|
||||
HISTORY
|
||||
------------------------------------------------------------------------------
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
09.10.1999 Christian Mayer changed CloudItem on Durks request
|
||||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -58,17 +60,17 @@ HISTORY
|
|||
class FGCloudItem
|
||||
{
|
||||
private:
|
||||
WeatherPrecition thickness;
|
||||
WeatherPrecition density;
|
||||
WeatherPrecision thickness;
|
||||
WeatherPrecision density;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
FGCloudItem(const WeatherPrecition& t, const WeatherPrecition& d) {thickness = t; density = d;}
|
||||
FGCloudItem() {thickness = 0.0; density = 0.0;}
|
||||
FGCloudItem(const WeatherPrecision t, const WeatherPrecision d) {thickness = t; density = d;}
|
||||
FGCloudItem() {thickness = 0.0; density = 0.0;}
|
||||
|
||||
WeatherPrecition getThickness(void) const { return thickness; }
|
||||
WeatherPrecition getDensity (void) const { return density; }
|
||||
WeatherPrecision getThickness(void) const { return thickness; }
|
||||
WeatherPrecision getDensity (void) const { return density; }
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: main program
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -37,6 +37,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -60,23 +62,28 @@ HISTORY
|
|||
/* | \ \ If p isn't in the triangle the algoritm */
|
||||
/* x1------q------x2 extrapolates it's value */
|
||||
/****************************************************************************/
|
||||
template<class P, class V>
|
||||
V triangle_interpolate(const P& x1, const V& v1, const P& x2, const V& v2, const P& x3, const V& v3, const P& p)
|
||||
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)
|
||||
{
|
||||
P q;
|
||||
sgVec2 q;
|
||||
V q_value;
|
||||
|
||||
q = x1 + (x2 - x1)*( ((x3-x1).x()*(x1-x2).y() - (x1-x2).x()*(x3-x1).y())/((p-x3).x()*(x2-x1).y() - (x2-x1).x()*(p-x3).y()) );
|
||||
//q = x1 + (x2 - x1)*( ((x3-x1).x()*(x1-x2).y() - (x1-x2).x()*(x3-x1).y())/((p-x3).x()*(x2-x1).y() - (x2-x1).x()*(p-x3).y()) );
|
||||
|
||||
q_value = v1 + (v2 - v1) * (x1.distance3D(q) / x1.distance3D(x2));
|
||||
sgSubVec2 (q, x2, x1);
|
||||
sgScaleVec2(q, (x3[0]-x1[0])*(x1[1]-x2[1]) - (x1[0]-x2[0])*(x3[1]-x1[1]) );
|
||||
sgScaleVec2(q, 1.0 / ( (p [0]-x3[0])*(x2[1]-x1[1]) - (x2[0]-x1[0])*(p [1]-x3[1]) ) );
|
||||
sgAddVec2 (q, x1);
|
||||
|
||||
q_value = v1 + (v2 - v1) * ( sgDistanceVec2(x1, q) / sgDistanceVec2(x1, x2) );
|
||||
|
||||
return q_value + (v3 - q_value) * (q.distance3D(p) / q.distance3D(x3));
|
||||
return q_value + (v3 - q_value) * ( sgDistanceVec2(q, p) / sgDistanceVec2(q, x3));
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* Constructor and Destructor */
|
||||
/****************************************************************************/
|
||||
FGGlobalWeatherDatabase::FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus& s)
|
||||
FGGlobalWeatherDatabase::FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus s)
|
||||
{
|
||||
DatabaseStatus = s;
|
||||
}
|
||||
|
@ -89,11 +96,11 @@ FGGlobalWeatherDatabase::~FGGlobalWeatherDatabase()
|
|||
/* Get the physical properties on the specified point p */
|
||||
/* do this by interpolating between the 3 closest points */
|
||||
/****************************************************************************/
|
||||
FGPhysicalProperties FGGlobalWeatherDatabase::get(const Point2D& p) const
|
||||
FGPhysicalProperties FGGlobalWeatherDatabase::get(const sgVec2& p) const
|
||||
{
|
||||
WeatherPrecition distance[3]; //store the 3 closest distances
|
||||
WeatherPrecision distance[3]; //store the 3 closest distances
|
||||
FGPhysicalProperties2DVectorConstIt iterator[3]; //and the coresponding iterators
|
||||
WeatherPrecition d;
|
||||
WeatherPrecision d;
|
||||
|
||||
distance[0] = 9.46e15; //init with a distance that every calculated
|
||||
distance[1] = 9.46e15; //distance is guranteed to be shorter as
|
||||
|
@ -101,7 +108,7 @@ FGPhysicalProperties FGGlobalWeatherDatabase::get(const Point2D& p) const
|
|||
|
||||
for (FGPhysicalProperties2DVectorConstIt it=database.begin(); it!=database.end(); it++)
|
||||
{ //go through the whole database
|
||||
d = it->p.distance2Dsquared(p);
|
||||
d = sgScalarProductVec2(it->p, p);
|
||||
|
||||
if (d<distance[0])
|
||||
{
|
||||
|
@ -135,7 +142,7 @@ FGPhysicalProperties FGGlobalWeatherDatabase::get(const Point2D& p) const
|
|||
/****************************************************************************/
|
||||
/* update the database. Since the last call we had dt seconds */
|
||||
/****************************************************************************/
|
||||
void FGGlobalWeatherDatabase::update(const WeatherPrecition& dt)
|
||||
void FGGlobalWeatherDatabase::update(const WeatherPrecision dt)
|
||||
{
|
||||
// I've got nothing to update here (yet...)
|
||||
}
|
||||
|
@ -143,11 +150,11 @@ void FGGlobalWeatherDatabase::update(const WeatherPrecition& dt)
|
|||
/****************************************************************************/
|
||||
/* Add a physical property on the specified point p */
|
||||
/****************************************************************************/
|
||||
void FGGlobalWeatherDatabase::add(const Point2D& p, const FGPhysicalProperties& x)
|
||||
void FGGlobalWeatherDatabase::add(const sgVec2& p, const FGPhysicalProperties& x)
|
||||
{
|
||||
FGPhysicalProperties2D e;
|
||||
|
||||
e.p = p;
|
||||
sgCopyVec2(e.p, p);
|
||||
|
||||
e.Wind = x.Wind;
|
||||
e.Turbulence = x.Turbulence;
|
||||
|
@ -167,11 +174,11 @@ void FGGlobalWeatherDatabase::add(const Point2D& p, const FGPhysicalProperties&
|
|||
/* 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 WeatherPrecition& tolerance)
|
||||
bool FGGlobalWeatherDatabase::change(const FGPhysicalProperties2D& p, const WeatherPrecision tolerance)
|
||||
{
|
||||
for (FGPhysicalProperties2DVectorIt it = database.begin(); it != database.end(); it++)
|
||||
{
|
||||
if (it->p.distance3Dsquared(p.p) < (tolerance*tolerance))
|
||||
if (sgScalarProductVec2(it->p, p.p) < (tolerance*tolerance))
|
||||
{ //assume that's my point
|
||||
(*it) = p;
|
||||
return true;
|
||||
|
@ -185,25 +192,25 @@ bool FGGlobalWeatherDatabase::change(const FGPhysicalProperties2D& p, const Weat
|
|||
/* Get all, but at least min, stored point in the circle around p with the */
|
||||
/* radius r */
|
||||
/****************************************************************************/
|
||||
FGPhysicalProperties2DVector FGGlobalWeatherDatabase::getAll(const Point2D& p, const WeatherPrecition& r, const unsigned int& min)
|
||||
FGPhysicalProperties2DVector FGGlobalWeatherDatabase::getAll(const sgVec2& p, const WeatherPrecision r, const unsigned int min)
|
||||
{
|
||||
FGPhysicalProperties2DVector ret_list;
|
||||
|
||||
if ((DatabaseStatus == FGGlobalWeatherDatabase_only_static)
|
||||
||(DatabaseStatus == FGGlobalWeatherDatabase_working) )
|
||||
if ( (DatabaseStatus == FGGlobalWeatherDatabase_only_static)
|
||||
||(DatabaseStatus == FGGlobalWeatherDatabase_working ) )
|
||||
{ //doest it make sense?
|
||||
|
||||
FGPhysicalProperties2DVectorIt *it; //store the closest entries
|
||||
WeatherPrecition *d;
|
||||
WeatherPrecision *d;
|
||||
unsigned int act_it = 0;
|
||||
int i;
|
||||
|
||||
it = new FGPhysicalProperties2DVectorIt[min+1];
|
||||
d = new WeatherPrecition[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] = it[act_it]->p.distance2Dsquared(p);
|
||||
d[act_it] = sgScalarProductVec2(it[act_it]->p, p);
|
||||
|
||||
if (r >= d[act_it])
|
||||
{ //add it
|
||||
|
@ -213,7 +220,7 @@ FGPhysicalProperties2DVector FGGlobalWeatherDatabase::getAll(const Point2D& p, c
|
|||
{
|
||||
if (act_it>0)
|
||||
{ //figure out if this distance belongs to the closest ones
|
||||
WeatherPrecition dummy;
|
||||
WeatherPrecision dummy;
|
||||
FGPhysicalProperties2DVectorIt dummyIt;
|
||||
|
||||
for (i = act_it++; i >= 0;)
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -37,6 +37,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -48,18 +50,27 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include "FGPhysicalProperties.h"
|
||||
#include "FGPhysicalProperty.h"
|
||||
#include "sg.h"
|
||||
#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 {
|
||||
|
@ -86,50 +97,63 @@ public:
|
|||
/************************************************************************/
|
||||
/* Constructor and Destructor */
|
||||
/************************************************************************/
|
||||
FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus& s = FGGlobalWeatherDatabase_not_used);
|
||||
FGGlobalWeatherDatabase(const FGGlobalWeatherDatabaseStatus s = FGGlobalWeatherDatabase_not_used);
|
||||
~FGGlobalWeatherDatabase();
|
||||
|
||||
/************************************************************************/
|
||||
/* Get the physical properties on the specified point p */
|
||||
/************************************************************************/
|
||||
FGPhysicalProperties get(const Point2D& p) const;
|
||||
FGPhysicalProperties get(const sgVec2& p) const {return get(Point2D(p[0], p[1]));}
|
||||
inline FGPhysicalProperty get(const Point3D& p) const {return FGPhysicalProperty(get(Point2D(p)), p.elev());}
|
||||
inline FGPhysicalProperty get(const sgVec3& p) const {return FGPhysicalProperty(get(Point2D(p[0], p[1])), p[3]);}
|
||||
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 WeatherPrecition& dt);
|
||||
void update(const WeatherPrecision dt);
|
||||
|
||||
/************************************************************************/
|
||||
/* Add a physical property on the specified point p */
|
||||
/************************************************************************/
|
||||
void add(const Point2D& p, const FGPhysicalProperties& x);
|
||||
inline void add(const FGPhysicalProperties2D& x) {database.push_back(x);}
|
||||
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 WeatherPrecition& tolerance = 0.0000001);
|
||||
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 Point2D& p, const WeatherPrecition& r, const unsigned int& min = 0);
|
||||
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; }
|
||||
FGGlobalWeatherDatabaseStatus getDatabaseStatus(void) const { return DatabaseStatus; }
|
||||
void setDatabaseStatus(const FGGlobalWeatherDatabaseStatus& s) { DatabaseStatus = s; }
|
||||
|
||||
/************************************************************************/
|
||||
/* Dump the whole database */
|
||||
/************************************************************************/
|
||||
//friend istream& operator>> ( istream&, Point3D& );
|
||||
friend ostream& operator<< ( ostream& out, const FGGlobalWeatherDatabase& p );
|
||||
|
||||
};
|
||||
|
@ -146,4 +170,4 @@ inline ostream& operator<< ( ostream& out, const FGGlobalWeatherDatabase& p )
|
|||
}
|
||||
|
||||
/****************************************************************************/
|
||||
#endif /*FGGlobalWeatherDatabase_H*/
|
||||
#endif /*FGGlobalWeatherDatabase_H*/
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: main program
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,17 +36,21 @@ HISTORY
|
|||
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 "FGLocalWeatherDatabase.h"
|
||||
#include "FGVoronoi.h"
|
||||
#include "fg_constants.h"
|
||||
#include <Include/compiler.h>
|
||||
#include <Include/fg_constants.h>
|
||||
|
||||
#include <Aircraft/aircraft.hxx>
|
||||
#include <Include/fg_constants.h>
|
||||
|
||||
#include "FGLocalWeatherDatabase.h"
|
||||
#include "FGVoronoi.h"
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
/********************************** CODE ************************************/
|
||||
|
@ -55,7 +59,7 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* return the index (better: ID) of the area with point p */
|
||||
/****************************************************************************/
|
||||
unsigned int FGLocalWeatherDatabase::AreaWith(const Point2D& p) const
|
||||
unsigned int FGLocalWeatherDatabase::AreaWith(const sgVec2& p) const
|
||||
{
|
||||
|
||||
for (FGMicroWeatherList::size_type i = 0; i != WeatherAreas.size(); i++)
|
||||
|
@ -74,7 +78,7 @@ void FGLocalWeatherDatabase::tileLocalWeather(const FGPhysicalProperties2DVector
|
|||
{
|
||||
FGVoronoiInputList input;
|
||||
|
||||
for (FGPhysicalProperties2DVector::const_iterator it1 = EntryList.begin(); it1 != EntryList.end(); it1++)
|
||||
for (FGPhysicalProperties2DVectorConstIt it1 = EntryList.begin(); it1 != EntryList.end(); it1++)
|
||||
input.push_back(FGVoronoiInput(it1->p, *it1));
|
||||
|
||||
FGVoronoiOutputList output = Voronoiate(input);
|
||||
|
@ -89,7 +93,7 @@ void FGLocalWeatherDatabase::tileLocalWeather(const FGPhysicalProperties2DVector
|
|||
FGLocalWeatherDatabase* FGLocalWeatherDatabase::theFGLocalWeatherDatabase = 0;
|
||||
FGLocalWeatherDatabase *WeatherDatabase;
|
||||
|
||||
FGLocalWeatherDatabase::FGLocalWeatherDatabase(const Point3D& posititon, const WeatherPrecition& visibility, const DatabaseWorkingType& type)
|
||||
FGLocalWeatherDatabase::FGLocalWeatherDatabase(const sgVec3& posititon, const WeatherPrecision visibility, const DatabaseWorkingType type)
|
||||
{
|
||||
cerr << "Initializing FGLocalWeatherDatabase\n";
|
||||
cerr << "-----------------------------------\n";
|
||||
|
@ -102,10 +106,10 @@ FGLocalWeatherDatabase::FGLocalWeatherDatabase(const Point3D& posititon, const W
|
|||
}
|
||||
|
||||
setWeatherVisibility(visibility);
|
||||
//WeatherVisibility = visibility;
|
||||
|
||||
DatabaseStatus = type;
|
||||
global = 0; //just get sure...
|
||||
last_known_position = posititon;
|
||||
sgCopyVec3(last_known_position, posititon);
|
||||
|
||||
|
||||
theFGLocalWeatherDatabase = this;
|
||||
|
@ -127,7 +131,7 @@ FGLocalWeatherDatabase::FGLocalWeatherDatabase(const Point3D& posititon, const W
|
|||
case manual:
|
||||
case default_mode:
|
||||
{
|
||||
vector<Point2D> emptyList;
|
||||
vector<sgVec2Wrap> emptyList;
|
||||
WeatherAreas.push_back(FGMicroWeather(FGPhysicalProperties2D(), emptyList)); //in these cases I've only got one tile
|
||||
}
|
||||
break;
|
||||
|
@ -152,7 +156,7 @@ FGLocalWeatherDatabase::~FGLocalWeatherDatabase()
|
|||
/****************************************************************************/
|
||||
/* reset the whole database */
|
||||
/****************************************************************************/
|
||||
void FGLocalWeatherDatabase::reset(const DatabaseWorkingType& type)
|
||||
void FGLocalWeatherDatabase::reset(const DatabaseWorkingType type)
|
||||
{
|
||||
//delete global database if necessary
|
||||
if ((DatabaseStatus == use_global) && (type != use_global))
|
||||
|
@ -169,23 +173,23 @@ void FGLocalWeatherDatabase::reset(const DatabaseWorkingType& type)
|
|||
/****************************************************************************/
|
||||
/* update the database. Since the last call we had dt seconds */
|
||||
/****************************************************************************/
|
||||
void FGLocalWeatherDatabase::update(const WeatherPrecition& dt)
|
||||
void FGLocalWeatherDatabase::update(const WeatherPrecision dt)
|
||||
{
|
||||
if (DatabaseStatus==use_global)
|
||||
global->update(dt);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::update(const Point3D& p) //position has changed
|
||||
void FGLocalWeatherDatabase::update(const sgVec3& p) //position has changed
|
||||
{
|
||||
last_known_position = p;
|
||||
sgCopyVec3(last_known_position, p);
|
||||
//cerr << "****\nupdate inside\n";
|
||||
//cerr << "Parameter: " << p << "\n";
|
||||
//cerr << "****\n";
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::update(const Point3D& p, const WeatherPrecition& dt) //time and/or position has changed
|
||||
void FGLocalWeatherDatabase::update(const sgVec3& p, const WeatherPrecision dt) //time and/or position has changed
|
||||
{
|
||||
last_known_position = p;
|
||||
sgCopyVec3(last_known_position, p);
|
||||
|
||||
if (DatabaseStatus==use_global)
|
||||
global->update(dt);
|
||||
|
@ -194,29 +198,19 @@ void FGLocalWeatherDatabase::update(const Point3D& p, const WeatherPrecition& dt
|
|||
/****************************************************************************/
|
||||
/* Get the physical properties on the specified point p out of the database */
|
||||
/****************************************************************************/
|
||||
FGPhysicalProperty FGLocalWeatherDatabase::get(const Point3D& p) const
|
||||
FGPhysicalProperty FGLocalWeatherDatabase::get(const sgVec3& p) const
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
return WeatherAreas[a-1].get(p.elev());
|
||||
return WeatherAreas[a-1].get(p[3]);
|
||||
else //point is outside => ask GlobalWeatherDatabase
|
||||
return global->get(p);
|
||||
}
|
||||
|
||||
FGPhysicalProperty FGLocalWeatherDatabase::get(const sgVec3& p) const
|
||||
{
|
||||
Point3D temp(p[0], p[1], p[2]);
|
||||
|
||||
unsigned int a = AreaWith(temp);
|
||||
if (a != 0)
|
||||
return WeatherAreas[a-1].get(temp.elev());
|
||||
else //point is outside => ask GlobalWeatherDatabase
|
||||
return global->get(temp);
|
||||
}
|
||||
|
||||
FGPhysicalProperties FGLocalWeatherDatabase::get(const sgVec2& p) const
|
||||
{
|
||||
Point3D temp(p[0], p[1], 0.0);
|
||||
sgVec3 temp;
|
||||
sgSetVec3(temp, p[0], p[1], 0.0);
|
||||
|
||||
unsigned int a = AreaWith(temp);
|
||||
if (a != 0)
|
||||
|
@ -225,12 +219,12 @@ FGPhysicalProperties FGLocalWeatherDatabase::get(const sgVec2& p) const
|
|||
return global->get(p);
|
||||
}
|
||||
|
||||
WeatherPrecition FGLocalWeatherDatabase::getAirDensity(const Point3D& p) const
|
||||
WeatherPrecision FGLocalWeatherDatabase::getAirDensity(const sgVec3& p) const
|
||||
{
|
||||
FGPhysicalProperty dummy;
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
dummy = WeatherAreas[a-1].get(p.elev());
|
||||
dummy = WeatherAreas[a-1].get(p[3]);
|
||||
else //point is outside => ask GlobalWeatherDatabase
|
||||
dummy = global->get(p);
|
||||
|
||||
|
@ -239,82 +233,66 @@ WeatherPrecition FGLocalWeatherDatabase::getAirDensity(const Point3D& p) const
|
|||
(dummy.Temperature*FG_WEATHER_DEFAULT_AIRPRESSURE);
|
||||
}
|
||||
|
||||
WeatherPrecition FGLocalWeatherDatabase::getAirDensity(const sgVec3& p) const
|
||||
{
|
||||
Point3D temp(p[0], p[1], p[2]);
|
||||
|
||||
FGPhysicalProperty dummy;
|
||||
unsigned int a = AreaWith(temp);
|
||||
if (a != 0)
|
||||
dummy = WeatherAreas[a-1].get(temp.elev());
|
||||
else //point is outside => ask GlobalWeatherDatabase
|
||||
dummy = global->get(temp);
|
||||
|
||||
return
|
||||
(dummy.AirPressure*FG_WEATHER_DEFAULT_AIRDENSITY*FG_WEATHER_DEFAULT_TEMPERATURE) /
|
||||
(dummy.Temperature*FG_WEATHER_DEFAULT_AIRPRESSURE);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
/* Add a weather feature at the point p and surrounding area */
|
||||
/****************************************************************************/
|
||||
void FGLocalWeatherDatabase::addWind(const WeatherPrecition alt, const Point3D& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addWind(const WeatherPrecision alt, const sgVec3& x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addWind(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::addTurbulence(const WeatherPrecition alt, const Point3D& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addTurbulence(const WeatherPrecision alt, const sgVec3& x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addTurbulence(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::addTemperature(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addTemperature(const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addTemperature(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::addAirPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addAirPressure(const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addAirPressure(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::addVaporPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addVaporPressure(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::addCloud(const WeatherPrecition alt, const FGCloudItem& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::addCloud(const WeatherPrecision alt, const FGCloudItem& x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].addCloud(alt, x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::setSnowRainIntensity(const WeatherPrecition& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::setSnowRainIntensity(const WeatherPrecision x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].setSnowRainIntensity(x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::setSnowRainType(const SnowRainType& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::setSnowRainType(const SnowRainType x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
WeatherAreas[a-1].setSnowRainType(x);
|
||||
}
|
||||
|
||||
void FGLocalWeatherDatabase::setLightningProbability(const WeatherPrecition& x, const Point2D& p)
|
||||
void FGLocalWeatherDatabase::setLightningProbability(const WeatherPrecision x, const sgVec2& p)
|
||||
{
|
||||
unsigned int a = AreaWith(p);
|
||||
if (a != 0)
|
||||
|
@ -370,9 +348,12 @@ void FGLocalWeatherDatabase::setProperties(const FGPhysicalProperties2D& x)
|
|||
void fgUpdateWeatherDatabase(void)
|
||||
{
|
||||
//cerr << "FGLocalWeatherDatabase::update()\n";
|
||||
WeatherDatabase->update( Point3D(
|
||||
sgVec3 position;
|
||||
sgSetVec3(position,
|
||||
current_aircraft.fdm_state->get_Latitude(),
|
||||
current_aircraft.fdm_state->get_Longitude(),
|
||||
current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER) );
|
||||
current_aircraft.fdm_state->get_Altitude() * FEET_TO_METER);
|
||||
|
||||
WeatherDatabase->update( position );
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,6 +36,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -56,6 +58,7 @@ HISTORY
|
|||
#include <XGL/xgl.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGPhysicalProperties.h"
|
||||
|
@ -79,10 +82,10 @@ private:
|
|||
protected:
|
||||
FGGlobalWeatherDatabase *global; //point to the global database
|
||||
|
||||
typedef vector<FGMicroWeather> FGMicroWeatherList;
|
||||
typedef vector<FGMicroWeather> FGMicroWeatherList;
|
||||
typedef FGMicroWeatherList::iterator FGMicroWeatherListIt;
|
||||
|
||||
typedef vector<Point2D> pointVector;
|
||||
typedef vector<sgVec2> pointVector;
|
||||
typedef vector<pointVector> tileVector;
|
||||
|
||||
/************************************************************************/
|
||||
|
@ -92,9 +95,22 @@ protected:
|
|||
|
||||
FGMicroWeatherList WeatherAreas;
|
||||
|
||||
WeatherPrecition WeatherVisibility; //how far do I need to simulate the
|
||||
WeatherPrecision WeatherVisibility; //how far do I need to simulate the
|
||||
//local weather? Unit: metres
|
||||
Point3D last_known_position;
|
||||
sgVec3 last_known_position;
|
||||
|
||||
|
||||
/************************************************************************/
|
||||
/* return the index of the area with point p */
|
||||
/************************************************************************/
|
||||
unsigned int AreaWith(const sgVec2& p) const;
|
||||
unsigned int AreaWith(const sgVec3& p) const
|
||||
{
|
||||
sgVec2 temp;
|
||||
sgSetVec2(temp, p[0], p[1]);
|
||||
|
||||
return AreaWith(temp);
|
||||
}
|
||||
|
||||
public:
|
||||
static FGLocalWeatherDatabase *theFGLocalWeatherDatabase;
|
||||
|
@ -108,60 +124,65 @@ public:
|
|||
default_mode //use only default values
|
||||
};
|
||||
|
||||
protected:
|
||||
DatabaseWorkingType DatabaseStatus;
|
||||
|
||||
/************************************************************************/
|
||||
/* return the index of the area with point p */
|
||||
/************************************************************************/
|
||||
unsigned int AreaWith(const Point2D& p) const;
|
||||
|
||||
public:
|
||||
/************************************************************************/
|
||||
/* Constructor and Destructor */
|
||||
/************************************************************************/
|
||||
FGLocalWeatherDatabase(
|
||||
const Point3D& posititon,
|
||||
const WeatherPrecition& visibility = DEFAULT_WEATHER_VISIBILIY,
|
||||
const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
|
||||
const sgVec3& posititon,
|
||||
const WeatherPrecision visibility = DEFAULT_WEATHER_VISIBILIY,
|
||||
const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
|
||||
|
||||
FGLocalWeatherDatabase(
|
||||
const WeatherPrecision posititon_lat,
|
||||
const WeatherPrecision posititon_lon,
|
||||
const WeatherPrecision posititon_alt,
|
||||
const WeatherPrecision visibility = DEFAULT_WEATHER_VISIBILIY,
|
||||
const DatabaseWorkingType type = PREFERED_WORKING_TYPE)
|
||||
{
|
||||
sgVec3 position;
|
||||
sgSetVec3( position, posititon_lat, posititon_lon, posititon_alt );
|
||||
|
||||
FGLocalWeatherDatabase( position, visibility, type );
|
||||
}
|
||||
|
||||
~FGLocalWeatherDatabase();
|
||||
|
||||
/************************************************************************/
|
||||
/* reset the whole database */
|
||||
/************************************************************************/
|
||||
void reset(const DatabaseWorkingType& type = PREFERED_WORKING_TYPE);
|
||||
void reset(const DatabaseWorkingType type = PREFERED_WORKING_TYPE);
|
||||
|
||||
/************************************************************************/
|
||||
/* update the database. Since the last call we had dt seconds */
|
||||
/************************************************************************/
|
||||
void update(const WeatherPrecition& dt); //time has changed
|
||||
void update(const Point3D& p); //position has changed
|
||||
void update(const Point3D& p, const WeatherPrecition& dt); //time and/or position has changed
|
||||
void update(const WeatherPrecision dt); //time has changed
|
||||
void update(const sgVec3& p); //position has changed
|
||||
void update(const sgVec3& p, const WeatherPrecision dt); //time and/or position has changed
|
||||
|
||||
/************************************************************************/
|
||||
/* Get the physical properties on the specified point p */
|
||||
/************************************************************************/
|
||||
FGPhysicalProperty get(const Point3D& p) const;
|
||||
FGPhysicalProperty get(const sgVec3& p) const;
|
||||
FGPhysicalProperties get(const sgVec2& p) const;
|
||||
FGPhysicalProperty get(const sgVec3& p) const;
|
||||
|
||||
WeatherPrecition getAirDensity(const Point3D& p) const;
|
||||
WeatherPrecition getAirDensity(const sgVec3& p) const;
|
||||
WeatherPrecision getAirDensity(const sgVec3& p) const;
|
||||
|
||||
/************************************************************************/
|
||||
/* Add a weather feature at the point p and surrounding area */
|
||||
/************************************************************************/
|
||||
|
||||
void addWind(const WeatherPrecition alt, const Point3D& x, const Point2D& p);
|
||||
void addTurbulence(const WeatherPrecition alt, const Point3D& x, const Point2D& p);
|
||||
void addTemperature(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
|
||||
void addAirPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
|
||||
void addVaporPressure(const WeatherPrecition alt, const WeatherPrecition x, const Point2D& p);
|
||||
void addCloud(const WeatherPrecition alt, const FGCloudItem& x, const Point2D& p);
|
||||
void addWind (const WeatherPrecision alt, const sgVec3& x, const sgVec2& p);
|
||||
void addTurbulence (const WeatherPrecision alt, const sgVec3& x, const sgVec2& p);
|
||||
void addTemperature (const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
|
||||
void addAirPressure (const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
|
||||
void addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x, const sgVec2& p);
|
||||
void addCloud (const WeatherPrecision alt, const FGCloudItem& x, const sgVec2& p);
|
||||
|
||||
void setSnowRainIntensity(const WeatherPrecition& x, const Point2D& p);
|
||||
void setSnowRainType(const SnowRainType& x, const Point2D& p);
|
||||
void setLightningProbability(const WeatherPrecition& x, const Point2D& p);
|
||||
void setSnowRainIntensity (const WeatherPrecision x, const sgVec2& p);
|
||||
void setSnowRainType (const SnowRainType x, const sgVec2& p);
|
||||
void setLightningProbability(const WeatherPrecision x, const sgVec2& p);
|
||||
|
||||
void addProperties(const FGPhysicalProperties2D& x); //add a property
|
||||
void setProperties(const FGPhysicalProperties2D& x); //change a property
|
||||
|
@ -169,8 +190,8 @@ public:
|
|||
/************************************************************************/
|
||||
/* get/set weather visibility */
|
||||
/************************************************************************/
|
||||
void setWeatherVisibility(const WeatherPrecition& visibility);
|
||||
WeatherPrecition getWeatherVisibility(void) const;
|
||||
void setWeatherVisibility(const WeatherPrecision visibility);
|
||||
WeatherPrecision getWeatherVisibility(void) const;
|
||||
};
|
||||
|
||||
extern FGLocalWeatherDatabase *WeatherDatabase;
|
||||
|
@ -179,7 +200,7 @@ void fgUpdateWeatherDatabase(void);
|
|||
/****************************************************************************/
|
||||
/* get/set weather visibility */
|
||||
/****************************************************************************/
|
||||
void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecition& visibility)
|
||||
void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecision visibility)
|
||||
{
|
||||
if (visibility >= MINIMUM_WEATHER_VISIBILIY)
|
||||
WeatherVisibility = visibility;
|
||||
|
@ -210,7 +231,7 @@ void inline FGLocalWeatherDatabase::setWeatherVisibility(const WeatherPrecition&
|
|||
|
||||
}
|
||||
|
||||
WeatherPrecition inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
|
||||
WeatherPrecision inline FGLocalWeatherDatabase::getWeatherVisibility(void) const
|
||||
{
|
||||
//cerr << "FGLocalWeatherDatabase::getWeatherVisibility() = " << WeatherVisibility << "\n";
|
||||
return WeatherVisibility;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: FGLocalWeatherDatabase
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,13 +35,17 @@ HISTORY
|
|||
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"
|
||||
#include "fg_constants.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/********************************** CODE ************************************/
|
||||
|
@ -60,48 +64,48 @@ FGMicroWeather::~FGMicroWeather()
|
|||
/* Add the features to the micro weather */
|
||||
/* return succss */
|
||||
/****************************************************************************/
|
||||
void FGMicroWeather::addWind(const WeatherPrecition alt, const Point3D& x)
|
||||
void FGMicroWeather::addWind(const WeatherPrecision alt, const FGWindItem& x)
|
||||
{
|
||||
StoredWeather.Wind[alt] = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::addTurbulence(const WeatherPrecition alt, const Point3D& x)
|
||||
void FGMicroWeather::addTurbulence(const WeatherPrecision alt, const FGTurbulenceItem& x)
|
||||
{
|
||||
StoredWeather.Turbulence[alt] = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::addTemperature(const WeatherPrecition alt, const WeatherPrecition x)
|
||||
void FGMicroWeather::addTemperature(const WeatherPrecision alt, const WeatherPrecision x)
|
||||
{
|
||||
StoredWeather.Temperature[alt] = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::addAirPressure(const WeatherPrecition alt, const WeatherPrecition 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 WeatherPrecition alt, const WeatherPrecition x)
|
||||
void FGMicroWeather::addVaporPressure(const WeatherPrecision alt, const WeatherPrecision x)
|
||||
{
|
||||
StoredWeather.VaporPressure[alt] = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::addCloud(const WeatherPrecition alt, const FGCloudItem& x)
|
||||
void FGMicroWeather::addCloud(const WeatherPrecision alt, const FGCloudItem& x)
|
||||
{
|
||||
StoredWeather.Clouds[alt] = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::setSnowRainIntensity(const WeatherPrecition& x)
|
||||
void FGMicroWeather::setSnowRainIntensity(const WeatherPrecision x)
|
||||
{
|
||||
StoredWeather.SnowRainIntensity = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::setSnowRainType(const SnowRainType& x)
|
||||
void FGMicroWeather::setSnowRainType(const SnowRainType x)
|
||||
{
|
||||
StoredWeather.snowRainType = x;
|
||||
}
|
||||
|
||||
void FGMicroWeather::setLightningProbability(const WeatherPrecition& x)
|
||||
void FGMicroWeather::setLightningProbability(const WeatherPrecision x)
|
||||
{
|
||||
StoredWeather.LightningProbability = x;
|
||||
}
|
||||
|
@ -122,7 +126,7 @@ inline const int FG_SIGN(const T& x) {
|
|||
return x < T(0) ? -1 : 1;
|
||||
}
|
||||
|
||||
bool FGMicroWeather::hasPoint(const Point2D& p) const
|
||||
bool FGMicroWeather::hasPoint(const sgVec2& p) const
|
||||
{
|
||||
if (position.size()==0)
|
||||
return true; //no border => this tile is infinite
|
||||
|
@ -132,7 +136,7 @@ bool FGMicroWeather::hasPoint(const Point2D& p) const
|
|||
|
||||
//when I'm here I've got at least 2 points
|
||||
|
||||
WeatherPrecition t;
|
||||
WeatherPrecision t;
|
||||
signed char side1, side2;
|
||||
const_positionListIt it = position.begin();
|
||||
const_positionListIt it2 = it; it2++;
|
||||
|
@ -143,19 +147,21 @@ bool FGMicroWeather::hasPoint(const Point2D& p) const
|
|||
if (it2 == position.end())
|
||||
break;
|
||||
|
||||
if (fabs(it->x() - it2->x()) >= FG_EPSILON)
|
||||
if (fabs(it->p[0] - it2->p[0]) >= FG_EPSILON)
|
||||
{
|
||||
t = (it->y() - it2->y()) / (it->x() - it2->x());
|
||||
side1 = FG_SIGN (t * (StoredWeather.p.x() - it2->x()) + it2->y() - StoredWeather.p.y());
|
||||
side2 = FG_SIGN (t * ( p.x() - it2->x()) + it2->y() - p.y());
|
||||
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->x() - it2->x()) / (it->y() - it2->y());
|
||||
side1 = FG_SIGN (t * (StoredWeather.p.y() - it2->y()) + it2->x() - StoredWeather.p.x());
|
||||
side2 = FG_SIGN (t * ( p.y() - it2->y()) + it2->x() - p.x());
|
||||
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";
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -46,22 +48,23 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* 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 "FGTemperatureItem.h"
|
||||
#include "FGWindItem.h"
|
||||
#include "FGTurbulenceItem.h"
|
||||
#include "FGVaporPressureItem.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
#include "FGPhysicalProperties.h"
|
||||
#include "FGPhysicalProperty.h"
|
||||
#include <Voronoi/point2d.h>
|
||||
|
||||
#include <set>
|
||||
|
||||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
|
@ -76,13 +79,12 @@ class FGMicroWeather
|
|||
{
|
||||
private:
|
||||
protected:
|
||||
typedef vector<Point2D> positionList;
|
||||
typedef positionList::iterator positionListIt;
|
||||
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:
|
||||
|
@ -95,39 +97,45 @@ public:
|
|||
/************************************************************************/
|
||||
/* Add a feature to the micro weather */
|
||||
/************************************************************************/
|
||||
void addWind(const WeatherPrecition alt, const Point3D& x);
|
||||
void addTurbulence(const WeatherPrecition alt, const Point3D& x);
|
||||
void addTemperature(const WeatherPrecition alt, const WeatherPrecition x);
|
||||
void addAirPressure(const WeatherPrecition alt, const WeatherPrecition x);
|
||||
void addVaporPressure(const WeatherPrecition alt, const WeatherPrecition x);
|
||||
void addCloud(const WeatherPrecition alt, const FGCloudItem& x);
|
||||
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 WeatherPrecition& x);
|
||||
void setSnowRainType(const SnowRainType& x);
|
||||
void setLightningProbability(const WeatherPrecition& x);
|
||||
void setSnowRainIntensity (const WeatherPrecision x);
|
||||
void setSnowRainType (const SnowRainType x);
|
||||
void setLightningProbability(const WeatherPrecision x);
|
||||
|
||||
void setStoredWeather(const FGPhysicalProperties2D& 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 */
|
||||
/************************************************************************/
|
||||
inline FGPhysicalProperty get(const WeatherPrecition& altitude) const
|
||||
{
|
||||
return FGPhysicalProperty(StoredWeather, altitude);
|
||||
}
|
||||
|
||||
inline FGPhysicalProperties get(void) const
|
||||
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 */
|
||||
/************************************************************************/
|
||||
inline bool hasPoint(const Point3D& p) const { return hasPoint((Point2D) p); }
|
||||
bool hasPoint(const Point2D& p) const;
|
||||
bool hasPoint(const sgVec2& p) const;
|
||||
bool hasPoint(const sgVec3& p) const
|
||||
{
|
||||
sgVec2 temp;
|
||||
sgSetVec2(temp, p[0], p[1]);
|
||||
|
||||
return hasPoint( temp );
|
||||
}
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: main program
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -48,15 +50,17 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
FGPhysicalProperties::FGPhysicalProperties()
|
||||
{
|
||||
sgVec3 zero;
|
||||
sgZeroVec3( zero );
|
||||
/************************************************************************/
|
||||
/* This standart constructor fills the class with a standard weather */
|
||||
/************************************************************************/
|
||||
|
||||
Wind[-1000.0] = Point3D(0.0); //no Wind by default
|
||||
Wind[10000.0] = Point3D(0.0); //no Wind by default
|
||||
Wind[-1000.0] = FGWindItem(zero); //no Wind by default
|
||||
Wind[10000.0] = FGWindItem(zero); //no Wind by default
|
||||
|
||||
Turbulence[-1000.0] = Point3D(0.0); //no Turbulence by default
|
||||
Turbulence[10000.0] = Point3D(0.0); //no Turbulence by default
|
||||
Turbulence[-1000.0] = FGTurbulenceItem(zero); //no Turbulence by default
|
||||
Turbulence[10000.0] = FGTurbulenceItem(zero); //no Turbulence by default
|
||||
|
||||
//Initialice with the CINA atmosphere
|
||||
Temperature[ 0.0] = +15.0 + 273.16;
|
||||
|
@ -81,7 +85,7 @@ unsigned int FGPhysicalProperties::getNumberOfCloudLayers(void) const
|
|||
|
||||
FGCloudItem FGPhysicalProperties::getCloudLayer(unsigned int nr) const
|
||||
{
|
||||
map<WeatherPrecition,FGCloudItem>::const_iterator CloudsIt = Clouds.begin();
|
||||
map<WeatherPrecision,FGCloudItem>::const_iterator CloudsIt = Clouds.begin();
|
||||
|
||||
//set the iterator to the 'nr'th entry
|
||||
for (; nr > 0; nr--)
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
/*******-*- Mode: C++ -*-************************************************************
|
||||
/*****************************************************************************
|
||||
|
||||
Header: FGPhysicalProperties.h
|
||||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,6 +36,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -48,124 +50,136 @@ HISTORY
|
|||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include <Include/compiler.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
#include "FGAirPressureItem.h"
|
||||
#include "FGWindItem.h"
|
||||
#include "FGTurbulenceItem.h"
|
||||
|
||||
#include "FGCloudItem.h"
|
||||
#include "FGSnowRain.h"
|
||||
|
||||
FG_USING_STD(vector);
|
||||
FG_USING_STD(map);
|
||||
FG_USING_NAMESPACE(std);
|
||||
|
||||
#include <Math/point3d.hxx>
|
||||
#include <Voronoi/point2d.h>
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
#include "FGAirPressureItem.h"
|
||||
|
||||
#include "FGCloudItem.h"
|
||||
#include "FGSnowRain.h"
|
||||
/****************************************************************************/
|
||||
/* FOREWARD DEFINITIONS */
|
||||
/****************************************************************************/
|
||||
class FGPhysicalProperties2D;
|
||||
ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p );
|
||||
|
||||
class FGPhysicalProperties
|
||||
{
|
||||
public:
|
||||
typedef WeatherPrecition Altitude;
|
||||
typedef WeatherPrecision Altitude;
|
||||
|
||||
map<Altitude,Point3D> Wind; //all Wind vectors
|
||||
map<Altitude,Point3D> Turbulence; //all Turbulence vectors
|
||||
map<Altitude,WeatherPrecition> Temperature; //in deg. Kelvin (I *only* accept SI!)
|
||||
FGAirPressureItem AirPressure; //in Pascal (I *only* accept SI!)
|
||||
map<Altitude,WeatherPrecition> VaporPressure; //in Pascal (I *only* accept SI!)
|
||||
map<Altitude,FGWindItem> Wind; //all Wind vectors
|
||||
map<Altitude,FGTurbulenceItem> Turbulence; //all Turbulence vectors
|
||||
map<Altitude,WeatherPrecision> Temperature; //in deg. Kelvin (I *only* accept SI!)
|
||||
FGAirPressureItem AirPressure; //in Pascal (I *only* accept SI!)
|
||||
map<Altitude,WeatherPrecision> VaporPressure; //in Pascal (I *only* accept SI!)
|
||||
|
||||
map<Altitude,FGCloudItem> Clouds; //amount of covering and type
|
||||
map<Altitude,FGCloudItem> Clouds; //amount of covering and type
|
||||
|
||||
WeatherPrecition SnowRainIntensity; //this also stands for hail, snow,...
|
||||
SnowRainType snowRainType;
|
||||
WeatherPrecition LightningProbability;
|
||||
WeatherPrecision SnowRainIntensity; //this also stands for hail, snow,...
|
||||
SnowRainType snowRainType;
|
||||
WeatherPrecision LightningProbability;
|
||||
|
||||
FGPhysicalProperties(); //consructor to fill it with FG standart weather
|
||||
|
||||
//return values at specified altitudes
|
||||
Point3D WindAt(const WeatherPrecition& a) const;
|
||||
Point3D TurbulenceAt(const WeatherPrecition& a) const;
|
||||
WeatherPrecition TemperatureAt(const WeatherPrecition& a) const;
|
||||
WeatherPrecition AirPressureAt(const WeatherPrecition& a) const;
|
||||
WeatherPrecition VaporPressureAt(const WeatherPrecition& a) const;
|
||||
void WindAt (sgVec3 ret, const WeatherPrecision a) const;
|
||||
void TurbulenceAt (sgVec3 ret, const WeatherPrecision a) const;
|
||||
WeatherPrecision TemperatureAt (const WeatherPrecision a) const;
|
||||
WeatherPrecision AirPressureAt (const WeatherPrecision a) const;
|
||||
WeatherPrecision VaporPressureAt(const WeatherPrecision a) const;
|
||||
|
||||
//for easier access to the cloud stuff:
|
||||
unsigned int getNumberOfCloudLayers(void) const;
|
||||
FGCloudItem getCloudLayer(unsigned int nr) const;
|
||||
FGCloudItem getCloudLayer(unsigned int nr) const;
|
||||
|
||||
FGPhysicalProperties& operator = ( const FGPhysicalProperties& p );
|
||||
FGPhysicalProperties& operator *= ( const WeatherPrecition& d );
|
||||
FGPhysicalProperties& operator += ( const FGPhysicalProperties& p);
|
||||
FGPhysicalProperties& operator -= ( const FGPhysicalProperties& p);
|
||||
FGPhysicalProperties& operator = ( const FGPhysicalProperties& p );
|
||||
FGPhysicalProperties& operator *= ( const WeatherPrecision d );
|
||||
FGPhysicalProperties& operator += ( const FGPhysicalProperties& p );
|
||||
FGPhysicalProperties& operator -= ( const FGPhysicalProperties& p );
|
||||
};
|
||||
|
||||
typedef vector<FGPhysicalProperties> FGPhysicalPropertiesVector;
|
||||
typedef FGPhysicalPropertiesVector::iterator FGPhysicalPropertiesVectorIt;
|
||||
typedef FGPhysicalPropertiesVector::const_iterator FGPhysicalPropertiesVectorConstIt;
|
||||
|
||||
class FGPhysicalProperties2D;
|
||||
ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p );
|
||||
|
||||
class FGPhysicalProperties2D : public FGPhysicalProperties
|
||||
{
|
||||
public:
|
||||
Point2D p; //position of the property (lat/lon)
|
||||
sgVec2 p; //position of the property (lat/lon)
|
||||
friend ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p );
|
||||
|
||||
FGPhysicalProperties2D() {}
|
||||
|
||||
FGPhysicalProperties2D(const FGPhysicalProperties& prop, const Point2D& pos)
|
||||
FGPhysicalProperties2D(const FGPhysicalProperties& prop, const sgVec2& pos)
|
||||
{
|
||||
Wind = prop.Wind; Turbulence = prop.Turbulence; Temperature = prop.Temperature;
|
||||
AirPressure = prop.AirPressure; VaporPressure = prop.VaporPressure; p = pos;
|
||||
Wind = prop.Wind;
|
||||
Turbulence = prop.Turbulence;
|
||||
Temperature = prop.Temperature;
|
||||
AirPressure = prop.AirPressure;
|
||||
VaporPressure = prop.VaporPressure;
|
||||
sgCopyVec2(p, pos);
|
||||
}
|
||||
};
|
||||
|
||||
typedef vector<FGPhysicalProperties2D> FGPhysicalProperties2DVector;
|
||||
typedef FGPhysicalProperties2DVector::iterator FGPhysicalProperties2DVectorIt;
|
||||
typedef vector<FGPhysicalProperties> FGPhysicalPropertiesVector;
|
||||
typedef FGPhysicalPropertiesVector::iterator FGPhysicalPropertiesVectorIt;
|
||||
typedef FGPhysicalPropertiesVector::const_iterator FGPhysicalPropertiesVectorConstIt;
|
||||
|
||||
typedef vector<FGPhysicalProperties2D> FGPhysicalProperties2DVector;
|
||||
typedef FGPhysicalProperties2DVector::iterator FGPhysicalProperties2DVectorIt;
|
||||
typedef FGPhysicalProperties2DVector::const_iterator FGPhysicalProperties2DVectorConstIt;
|
||||
|
||||
inline ostream& operator<< ( ostream& out, const FGPhysicalProperties2D& p )
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D >::const_iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::const_iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
||||
|
||||
out << "Position: " << p.p << endl;
|
||||
out << "Position: (" << p.p[0] << ", " << p.p[1] << ", " << p.p[2] << ")\n";
|
||||
|
||||
out << "Stored Wind: ";
|
||||
for (vector_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++)
|
||||
out << "(" << WindIt->first << ") at " << WindIt->second << "m; ";
|
||||
out << endl;
|
||||
for (wind_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++)
|
||||
out << "(" << WindIt->first << ") at (" << WindIt->second.x() << ", " << WindIt->second.y() << ", " << WindIt->second.z() << ") m; ";
|
||||
out << "\n";
|
||||
|
||||
out << "Stored Turbulence: ";
|
||||
for (vector_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
out << "(" << TurbulenceIt->first << ") at " << TurbulenceIt->second << "m; ";
|
||||
out << endl;
|
||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
out << "(" << TurbulenceIt->first << ") at (" << TurbulenceIt->second.x() << ", " << TurbulenceIt->second.y() << ", " << TurbulenceIt->second.z() << ") m; ";
|
||||
out << "\n";
|
||||
|
||||
out << "Stored Temperature: ";
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
out << TemperatureIt->first << " at " << TemperatureIt->second << "m; ";
|
||||
out << endl;
|
||||
out << "\n";
|
||||
|
||||
out << "Stored AirPressure: ";
|
||||
out << p.AirPressure.getValue(0) << " at " << 0.0 << "m; ";
|
||||
out << endl;
|
||||
out << "\n";
|
||||
|
||||
out << "Stored VaporPressure: ";
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
out << VaporPressureIt->first << " at " << VaporPressureIt->second << "m; ";
|
||||
out << endl;
|
||||
out << "\n";
|
||||
|
||||
return out << endl;
|
||||
return out << "\n";
|
||||
}
|
||||
|
||||
|
||||
|
@ -179,31 +193,32 @@ inline FGPhysicalProperties& FGPhysicalProperties::operator = ( const FGPhysical
|
|||
return *this;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPrecition& d )
|
||||
inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPrecision d )
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D >::iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::iterator wind_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::iterator turbulence_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::iterator scalar_iterator;
|
||||
|
||||
for (vector_iterator WindIt = Wind.begin();
|
||||
WindIt != Wind.end();
|
||||
WindIt++)
|
||||
WindIt->second *= d;
|
||||
for (wind_iterator WindIt = Wind.begin();
|
||||
WindIt != Wind.end();
|
||||
WindIt++)
|
||||
WindIt->second*= d;
|
||||
|
||||
for (vector_iterator TurbulenceIt = Turbulence.begin();
|
||||
TurbulenceIt != Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
TurbulenceIt->second *= d;
|
||||
for (turbulence_iterator TurbulenceIt = Turbulence.begin();
|
||||
TurbulenceIt != Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
TurbulenceIt->second *= d;
|
||||
|
||||
for (scalar_iterator TemperatureIt = Temperature.begin();
|
||||
TemperatureIt != Temperature.end();
|
||||
TemperatureIt++)
|
||||
for (scalar_iterator TemperatureIt = Temperature.begin();
|
||||
TemperatureIt != Temperature.end();
|
||||
TemperatureIt++)
|
||||
TemperatureIt->second *= d;
|
||||
|
||||
AirPressure *= d;
|
||||
|
||||
for (scalar_iterator VaporPressureIt = VaporPressure.begin();
|
||||
VaporPressureIt != VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
for (scalar_iterator VaporPressureIt = VaporPressure.begin();
|
||||
VaporPressureIt != VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
VaporPressureIt->second *= d;
|
||||
|
||||
return *this;
|
||||
|
@ -211,32 +226,33 @@ inline FGPhysicalProperties& FGPhysicalProperties::operator *= ( const WeatherPr
|
|||
|
||||
inline FGPhysicalProperties& FGPhysicalProperties::operator += (const FGPhysicalProperties& p)
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D >::const_iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::const_iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
||||
|
||||
for (vector_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++ )
|
||||
for (wind_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++)
|
||||
if (!Wind.insert(*WindIt).second) //when it's not inserted => it's already existing
|
||||
Wind[WindIt->first] += WindIt->second; //=> add the value
|
||||
|
||||
for (vector_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
if (!Turbulence.insert(*TurbulenceIt).second)
|
||||
Turbulence[TurbulenceIt->first] += TurbulenceIt->second;
|
||||
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
if (!Temperature.insert(*TemperatureIt).second)
|
||||
Temperature[TemperatureIt->first] += TemperatureIt->second;
|
||||
|
||||
AirPressure += p.AirPressure.getValue(0.0);
|
||||
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
if (!VaporPressure.insert(*VaporPressureIt).second)
|
||||
VaporPressure[VaporPressureIt->first] += VaporPressureIt->second;
|
||||
|
||||
|
@ -245,32 +261,33 @@ inline FGPhysicalProperties& FGPhysicalProperties::operator += (const FGPhysical
|
|||
|
||||
inline FGPhysicalProperties& FGPhysicalProperties::operator -= (const FGPhysicalProperties& p)
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D >::const_iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::const_iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem >::const_iterator wind_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator turbulence_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
||||
|
||||
for (vector_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++ )
|
||||
for (wind_iterator WindIt = p.Wind.begin();
|
||||
WindIt != p.Wind.end();
|
||||
WindIt++)
|
||||
if (!Wind.insert( make_pair(WindIt->first, -WindIt->second) ).second) //when it's not inserted => it's already existing
|
||||
Wind[WindIt->first] -= WindIt->second; //=> substract the value
|
||||
|
||||
for (vector_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
for (turbulence_iterator TurbulenceIt = p.Turbulence.begin();
|
||||
TurbulenceIt != p.Turbulence.end();
|
||||
TurbulenceIt++)
|
||||
if (!Turbulence.insert( make_pair(TurbulenceIt->first, -TurbulenceIt->second) ).second)
|
||||
Turbulence[TurbulenceIt->first] -= TurbulenceIt->second;
|
||||
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
for (scalar_iterator TemperatureIt = p.Temperature.begin();
|
||||
TemperatureIt != p.Temperature.end();
|
||||
TemperatureIt++)
|
||||
if (!Temperature.insert( make_pair(TemperatureIt->first, -TemperatureIt->second) ).second)
|
||||
Temperature[TemperatureIt->first] -= TemperatureIt->second;
|
||||
|
||||
AirPressure -= p.AirPressure.getValue(0.0);
|
||||
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
for (scalar_iterator VaporPressureIt = p.VaporPressure.begin();
|
||||
VaporPressureIt != p.VaporPressure.end();
|
||||
VaporPressureIt++)
|
||||
if (!VaporPressure.insert( make_pair(VaporPressureIt->first, -VaporPressureIt->second) ).second)
|
||||
VaporPressure[VaporPressureIt->first] -= VaporPressureIt->second;
|
||||
|
||||
|
@ -279,33 +296,37 @@ inline FGPhysicalProperties& FGPhysicalProperties::operator -= (const FGPhysical
|
|||
}
|
||||
|
||||
|
||||
inline Point3D FGPhysicalProperties::WindAt(const WeatherPrecition& a) const
|
||||
inline void FGPhysicalProperties::WindAt(sgVec3 ret, const WeatherPrecision a) const
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D>::const_iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGWindItem>::const_iterator vector_iterator;
|
||||
|
||||
vector_iterator it = Wind.lower_bound(a);
|
||||
vector_iterator it2 = it;
|
||||
it--;
|
||||
|
||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
||||
return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second;
|
||||
sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue());
|
||||
sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first));
|
||||
sgAddVec3(ret, *it2->second.getValue());
|
||||
}
|
||||
|
||||
inline Point3D FGPhysicalProperties::TurbulenceAt(const WeatherPrecition& a) const
|
||||
inline void FGPhysicalProperties::TurbulenceAt(sgVec3 ret, const WeatherPrecision a) const
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, Point3D>::const_iterator vector_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, FGTurbulenceItem>::const_iterator vector_iterator;
|
||||
|
||||
vector_iterator it = Turbulence.lower_bound(a);
|
||||
vector_iterator it2 = it;
|
||||
it--;
|
||||
|
||||
//now I've got it->alt < a < it2->alt so I can interpolate
|
||||
return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second;
|
||||
sgSubVec3(ret, *it2->second.getValue(), *it->second.getValue());
|
||||
sgScaleVec3(ret, (a - it2->first) / (it2->first - it->first));
|
||||
sgAddVec3(ret, *it2->second.getValue());
|
||||
}
|
||||
|
||||
inline WeatherPrecition FGPhysicalProperties::TemperatureAt(const WeatherPrecition& a) const
|
||||
inline WeatherPrecision FGPhysicalProperties::TemperatureAt(const WeatherPrecision a) const
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::const_iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
||||
|
||||
scalar_iterator it = Temperature.lower_bound(a);
|
||||
scalar_iterator it2 = it;
|
||||
|
@ -315,14 +336,14 @@ inline WeatherPrecition FGPhysicalProperties::TemperatureAt(const WeatherPreciti
|
|||
return ( (it2->second - it->second)/(it2->first - it->first) ) * (a - it2->first) + it2->second;
|
||||
}
|
||||
|
||||
inline WeatherPrecition FGPhysicalProperties::AirPressureAt(const WeatherPrecition& a) const
|
||||
inline WeatherPrecision FGPhysicalProperties::AirPressureAt(const WeatherPrecision a) const
|
||||
{
|
||||
return AirPressure.getValue(a);
|
||||
}
|
||||
|
||||
inline WeatherPrecition FGPhysicalProperties::VaporPressureAt(const WeatherPrecition& a) const
|
||||
inline WeatherPrecision FGPhysicalProperties::VaporPressureAt(const WeatherPrecision a) const
|
||||
{
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecition>::const_iterator scalar_iterator;
|
||||
typedef map<FGPhysicalProperties::Altitude, WeatherPrecision>::const_iterator scalar_iterator;
|
||||
|
||||
scalar_iterator it = VaporPressure.lower_bound(a);
|
||||
scalar_iterator it2 = it;
|
||||
|
@ -333,12 +354,12 @@ inline WeatherPrecition FGPhysicalProperties::VaporPressureAt(const WeatherPreci
|
|||
}
|
||||
|
||||
|
||||
inline FGPhysicalProperties operator * (FGPhysicalProperties a, const WeatherPrecition& b)
|
||||
inline FGPhysicalProperties operator * (FGPhysicalProperties a, const WeatherPrecision b)
|
||||
{
|
||||
return a *= b;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperties operator * (const WeatherPrecition& b, FGPhysicalProperties a)
|
||||
inline FGPhysicalProperties operator * (const WeatherPrecision b, FGPhysicalProperties a)
|
||||
{
|
||||
return a *= b;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: main program
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,36 +35,34 @@ HISTORY
|
|||
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 "FGPhysicalProperty.h"
|
||||
#include "FGWeatherDefs.h"
|
||||
#include "FGPhysicalProperty.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/********************************** CODE ************************************/
|
||||
/****************************************************************************/
|
||||
FGPhysicalProperty::FGPhysicalProperty()
|
||||
{
|
||||
Wind.setx(0.0); //Wind vector
|
||||
Wind.sety(0.0); //Wind vector
|
||||
Wind.setz(0.0); //Wind vector
|
||||
sgZeroVec3(Wind); //Wind vector
|
||||
|
||||
Turbulence.setx(0.0); //Turbulence vector
|
||||
Turbulence.sety(0.0); //Turbulence vector
|
||||
Turbulence.setz(0.0); //Turbulence vector
|
||||
sgZeroVec3(Turbulence); //Turbulence vector
|
||||
|
||||
Temperature = FG_WEATHER_DEFAULT_TEMPERATURE; //a nice warm day
|
||||
AirPressure = FG_WEATHER_DEFAULT_AIRPRESSURE; //mbar, that's ground level
|
||||
VaporPressure = FG_WEATHER_DEFAULT_VAPORPRESSURE; //that gives about 50% relatvie humidity
|
||||
}
|
||||
|
||||
FGPhysicalProperty::FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecition& altitude)
|
||||
FGPhysicalProperty::FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecision altitude)
|
||||
{
|
||||
Wind = p.WindAt(altitude);
|
||||
Turbulence = p.TurbulenceAt(altitude);
|
||||
p.WindAt(Wind, altitude);
|
||||
p.TurbulenceAt(Turbulence, altitude);
|
||||
Temperature = p.TemperatureAt(altitude);
|
||||
AirPressure = p.AirPressureAt(altitude);
|
||||
VaporPressure = p.VaporPressureAt(altitude);
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,6 +36,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -48,63 +50,68 @@ HISTORY
|
|||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include <Include/compiler.h>
|
||||
#include <vector>
|
||||
FG_USING_STD(vector);
|
||||
FG_USING_NAMESPACE(std);
|
||||
|
||||
#include <Math/point3d.hxx>
|
||||
#include <Voronoi/point2d.h>
|
||||
#include <vector>
|
||||
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
#include "FGPhysicalProperties.h"
|
||||
|
||||
FG_USING_STD(vector);
|
||||
FG_USING_NAMESPACE(std);
|
||||
|
||||
/****************************************************************************/
|
||||
/* used for output: */
|
||||
/****************************************************************************/
|
||||
class FGPhysicalProperty;
|
||||
bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b); // p1 == p2?
|
||||
|
||||
class FGPhysicalProperty
|
||||
{
|
||||
private:
|
||||
protected:
|
||||
public:
|
||||
Point3D Wind; //Wind vector
|
||||
Point3D Turbulence; //Turbulence vector
|
||||
WeatherPrecition Temperature; //in deg. Kelvin (I *only* accept SI!)
|
||||
WeatherPrecition AirPressure; //in Pascal (I *only* accept SI!)
|
||||
WeatherPrecition VaporPressure; //in Pascal (I *only* accept SI!)
|
||||
sgVec3 Wind; //Wind vector
|
||||
sgVec3 Turbulence; //Turbulence vector
|
||||
WeatherPrecision Temperature; //in deg. Kelvin (I *only* accept SI!)
|
||||
WeatherPrecision AirPressure; //in Pascal (I *only* accept SI!)
|
||||
WeatherPrecision VaporPressure; //in Pascal (I *only* accept SI!)
|
||||
|
||||
FGPhysicalProperty(); //consructor to fill it with FG standart weather
|
||||
FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecition& altitude);
|
||||
FGPhysicalProperty(const FGPhysicalProperties& p, const WeatherPrecision altitude);
|
||||
|
||||
//allow calculations for easier handling such as interpolating
|
||||
FGPhysicalProperty& operator = ( const FGPhysicalProperty& p ); // assignment of a Point3D
|
||||
FGPhysicalProperty& operator += ( const FGPhysicalProperty& p ); // incrementation by a Point3D
|
||||
FGPhysicalProperty& operator -= ( const FGPhysicalProperty& p ); // decrementation by a Point3D
|
||||
FGPhysicalProperty& operator *= ( const double& d ); // multiplication by a constant
|
||||
FGPhysicalProperty& operator /= ( const double& d ); // division by a constant
|
||||
FGPhysicalProperty& operator = ( const FGPhysicalProperty& p ); // assignment of a FGPhysicalProperty
|
||||
FGPhysicalProperty& operator += ( const FGPhysicalProperty& p ); // incrementation by a FGPhysicalProperty
|
||||
FGPhysicalProperty& operator -= ( const FGPhysicalProperty& p ); // decrementation by a FGPhysicalProperty
|
||||
FGPhysicalProperty& operator *= ( const double d ); // multiplication by a constant
|
||||
FGPhysicalProperty& operator /= ( const double d ); // division by a constant
|
||||
|
||||
friend FGPhysicalProperty operator - (const FGPhysicalProperty& p); // -p1
|
||||
friend bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b); // p1 == p2?
|
||||
friend FGPhysicalProperty operator - (const FGPhysicalProperty& p); // -p1
|
||||
friend bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b); // p1 == p2?
|
||||
};
|
||||
|
||||
typedef vector<FGPhysicalProperty> FGPhysicalPropertyVector;
|
||||
typedef FGPhysicalPropertyVector::iterator FGPhysicalPropertyVectorIt;
|
||||
typedef FGPhysicalPropertyVector::const_iterator FGPhysicalPropertyVectorConstIt;
|
||||
|
||||
class FGPhysicalProperty3D : public FGPhysicalProperty
|
||||
{
|
||||
private:
|
||||
protected:
|
||||
public:
|
||||
Point3D p; //position of the property (lat/lon/alt)
|
||||
sgVec3 p; //position of the property (lat/lon/alt)
|
||||
};
|
||||
|
||||
typedef vector<FGPhysicalProperty3D> FGPhysicalProperty3DVector;
|
||||
typedef FGPhysicalProperty3DVector::iterator FGPhysicalProperty3DVectorIt;
|
||||
typedef vector<FGPhysicalProperty> FGPhysicalPropertyVector;
|
||||
typedef FGPhysicalPropertyVector::iterator FGPhysicalPropertyVectorIt;
|
||||
typedef FGPhysicalPropertyVector::const_iterator FGPhysicalPropertyVectorConstIt;
|
||||
|
||||
typedef vector<FGPhysicalProperty3D> FGPhysicalProperty3DVector;
|
||||
typedef FGPhysicalProperty3DVector::iterator FGPhysicalProperty3DVectorIt;
|
||||
typedef FGPhysicalProperty3DVector::const_iterator FGPhysicalProperty3DVectorConstIt;
|
||||
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator = ( const FGPhysicalProperty& p )
|
||||
{
|
||||
Wind = p.Wind;
|
||||
Turbulence = p.Turbulence;
|
||||
sgCopyVec3(Wind, p.Wind);
|
||||
sgCopyVec3(Turbulence, p.Turbulence);
|
||||
Temperature = p.Temperature;
|
||||
AirPressure = p.AirPressure;
|
||||
VaporPressure = p.VaporPressure;
|
||||
|
@ -113,8 +120,8 @@ inline FGPhysicalProperty& FGPhysicalProperty::operator = ( const FGPhysicalProp
|
|||
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator += ( const FGPhysicalProperty& p )
|
||||
{
|
||||
Wind += p.Wind;
|
||||
Turbulence += p.Turbulence;
|
||||
sgAddVec3(Wind, p.Wind);
|
||||
sgAddVec3(Turbulence, p.Turbulence);
|
||||
Temperature += p.Temperature;
|
||||
AirPressure += p.AirPressure;
|
||||
VaporPressure += p.VaporPressure;
|
||||
|
@ -123,28 +130,28 @@ inline FGPhysicalProperty& FGPhysicalProperty::operator += ( const FGPhysicalPro
|
|||
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator -= ( const FGPhysicalProperty& p )
|
||||
{
|
||||
Wind -= p.Wind;
|
||||
Turbulence -= p.Turbulence;
|
||||
sgSubVec3(Wind, p.Wind);
|
||||
sgSubVec3(Turbulence, p.Turbulence);
|
||||
Temperature -= p.Temperature;
|
||||
AirPressure -= p.AirPressure;
|
||||
VaporPressure -= p.VaporPressure;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator *= ( const double& d )
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator *= ( const double d )
|
||||
{
|
||||
Wind *= d;
|
||||
Turbulence *= d;
|
||||
sgScaleVec3(Wind, d);
|
||||
sgScaleVec3(Turbulence, d);
|
||||
Temperature *= d;
|
||||
AirPressure *= d;
|
||||
VaporPressure *= d;
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator /= ( const double& d )
|
||||
inline FGPhysicalProperty& FGPhysicalProperty::operator /= ( const double d )
|
||||
{
|
||||
Wind /= d;
|
||||
Turbulence /= d;
|
||||
sgScaleVec3(Wind, 1.0 / d);
|
||||
sgScaleVec3(Turbulence, 1.0 / d);
|
||||
Temperature /= d;
|
||||
AirPressure /= d;
|
||||
VaporPressure /= d;
|
||||
|
@ -154,8 +161,8 @@ inline FGPhysicalProperty& FGPhysicalProperty::operator /= ( const double& d )
|
|||
inline FGPhysicalProperty operator - (const FGPhysicalProperty& p)
|
||||
{
|
||||
FGPhysicalProperty x;
|
||||
x.Wind = -p.Wind;
|
||||
x.Turbulence = -p.Turbulence;
|
||||
sgNegateVec3(x.Wind, p.Wind);
|
||||
sgNegateVec3(x.Turbulence, p.Turbulence);
|
||||
x.Temperature = -p.Temperature;
|
||||
x.AirPressure = -p.AirPressure;
|
||||
x.VaporPressure = -p.VaporPressure;
|
||||
|
@ -165,8 +172,8 @@ inline FGPhysicalProperty operator - (const FGPhysicalProperty& p)
|
|||
inline bool operator == (const FGPhysicalProperty& a, const FGPhysicalProperty& b)
|
||||
{
|
||||
return (
|
||||
(a.Wind == b.Wind) &&
|
||||
(a.Turbulence == b.Turbulence) &&
|
||||
sgEqualVec3(a.Wind, b.Wind) &&
|
||||
sgEqualVec3(a.Turbulence, b.Turbulence) &&
|
||||
(a.Temperature == b.Temperature) &&
|
||||
(a.AirPressure == b.AirPressure) &&
|
||||
(a.VaporPressure == b.VaporPressure));
|
||||
|
@ -187,21 +194,20 @@ inline FGPhysicalProperty operator - (const FGPhysicalProperty& a, const FGPhysi
|
|||
return FGPhysicalProperty(a) -= b;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperty operator * (const FGPhysicalProperty& a, const WeatherPrecition& b)
|
||||
inline FGPhysicalProperty operator * (const FGPhysicalProperty& a, const WeatherPrecision b)
|
||||
{
|
||||
return FGPhysicalProperty(a) *= b;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperty operator * (const WeatherPrecition& b, const FGPhysicalProperty& a)
|
||||
inline FGPhysicalProperty operator * (const WeatherPrecision b, const FGPhysicalProperty& a)
|
||||
{
|
||||
return FGPhysicalProperty(a) *= b;
|
||||
}
|
||||
|
||||
inline FGPhysicalProperty operator / (const FGPhysicalProperty& a, const WeatherPrecition& b)
|
||||
inline FGPhysicalProperty operator / (const FGPhysicalProperty& a, const WeatherPrecision b)
|
||||
{
|
||||
return FGPhysicalProperty(a) *= (1.0/b);
|
||||
}
|
||||
|
||||
|
||||
/****************************************************************************/
|
||||
#endif /*FGPhysicalProperty_H*/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -34,6 +34,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -48,7 +48,7 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
//for the case that mutable isn't supported:
|
||||
// for the case that mutable isn't supported:
|
||||
#include "Include/compiler.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -63,20 +63,20 @@ FGTemperatureItem operator-(const FGTemperatureItem& arg);
|
|||
class FGTemperatureItem
|
||||
{
|
||||
private:
|
||||
mutable WeatherPrecition value;
|
||||
WeatherPrecition alt;
|
||||
mutable WeatherPrecision value;
|
||||
WeatherPrecision alt;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
FGTemperatureItem(const WeatherPrecition& a, const WeatherPrecition& v) {alt = a; value = v;}
|
||||
FGTemperatureItem(const WeatherPrecition& v) {alt = 0.0; value = v;}
|
||||
FGTemperatureItem() {alt = 0.0; value = (WeatherPrecition)FG_WEATHER_DEFAULT_TEMPERATURE;}
|
||||
FGTemperatureItem(const WeatherPrecision& a, const WeatherPrecision& v) {alt = a; value = v;}
|
||||
FGTemperatureItem(const WeatherPrecision& v) {alt = 0.0; value = v;}
|
||||
FGTemperatureItem() {alt = 0.0; value = (WeatherPrecision)FG_WEATHER_DEFAULT_TEMPERATURE;}
|
||||
|
||||
WeatherPrecition getValue() const { return value; };
|
||||
WeatherPrecition getAlt() const { return alt; };
|
||||
WeatherPrecision getValue() const { return value; };
|
||||
WeatherPrecision getAlt() const { return alt; };
|
||||
|
||||
FGTemperatureItem& operator*= (const WeatherPrecition& arg);
|
||||
FGTemperatureItem& operator*= (const WeatherPrecision& arg);
|
||||
FGTemperatureItem& operator+= (const FGTemperatureItem& arg);
|
||||
FGTemperatureItem& operator-= (const FGTemperatureItem& arg);
|
||||
|
||||
|
@ -85,7 +85,7 @@ public:
|
|||
|
||||
};
|
||||
|
||||
inline FGTemperatureItem& FGTemperatureItem::operator*= (const WeatherPrecition& arg)
|
||||
inline FGTemperatureItem& FGTemperatureItem::operator*= (const WeatherPrecision& arg)
|
||||
{
|
||||
value *= arg;
|
||||
return *this;
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: FGMicroWeather
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -45,8 +47,4 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/********************************** CODE ************************************/
|
||||
/****************************************************************************/
|
||||
bool operator<(const FGTurbulenceItem& arg1, const FGTurbulenceItem& arg2)
|
||||
{
|
||||
return arg1.alt < arg2.alt;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -32,9 +32,10 @@ HISTORY
|
|||
28.05.1999 Christian Mayer Created
|
||||
16.06.1999 Durk Talsma Portability for Linux
|
||||
20.06.1999 Christian Mayer added lots of consts
|
||||
10.10.1999 Christian Mayer added mutable for gcc 2.95 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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -46,12 +47,10 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include <Math/point3d.hxx>
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
//for the case that mutable isn't supported:
|
||||
#include "Include/compiler.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
/****************************************************************************/
|
||||
|
@ -64,48 +63,52 @@ FGTurbulenceItem operator-(const FGTurbulenceItem& arg);
|
|||
class FGTurbulenceItem
|
||||
{
|
||||
private:
|
||||
mutable Point3D value;
|
||||
WeatherPrecition alt;
|
||||
sgVec3 value;
|
||||
|
||||
protected:
|
||||
public:
|
||||
FGTurbulenceItem(const WeatherPrecition& a, const Point3D& v) {alt = a; value = v;}
|
||||
FGTurbulenceItem(const Point3D& v) {alt = 0.0; value = v;}
|
||||
FGTurbulenceItem() {alt = 0.0; value = Point3D(0.0);}
|
||||
FGTurbulenceItem(const sgVec3& v) { sgCopyVec3(value, v);}
|
||||
FGTurbulenceItem() { sgZeroVec3(value); }
|
||||
|
||||
Point3D getValue() const { return value; };
|
||||
WeatherPrecition getAlt() const { return alt; };
|
||||
void getValue(sgVec3 ret) const { sgCopyVec3(ret, value); };
|
||||
const sgVec3* getValue(void) const { return &value; };
|
||||
|
||||
FGTurbulenceItem& operator*= (const WeatherPrecition& arg);
|
||||
WeatherPrecision x(void) const { return value[0]; };
|
||||
WeatherPrecision y(void) const { return value[1]; };
|
||||
WeatherPrecision z(void) const { return value[2]; };
|
||||
|
||||
FGTurbulenceItem& operator*= (const WeatherPrecision arg);
|
||||
FGTurbulenceItem& operator+= (const FGTurbulenceItem& arg);
|
||||
FGTurbulenceItem& operator-= (const FGTurbulenceItem& arg);
|
||||
|
||||
friend bool operator<(const FGTurbulenceItem& arg1, const FGTurbulenceItem& arg2 );
|
||||
friend FGTurbulenceItem operator-(const FGTurbulenceItem& arg);
|
||||
|
||||
};
|
||||
|
||||
inline FGTurbulenceItem& FGTurbulenceItem::operator*= (const WeatherPrecition& arg)
|
||||
inline FGTurbulenceItem& FGTurbulenceItem::operator*= (const WeatherPrecision arg)
|
||||
{
|
||||
value *= arg;
|
||||
sgScaleVec3(value, arg);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGTurbulenceItem& FGTurbulenceItem::operator+= (const FGTurbulenceItem& arg)
|
||||
{
|
||||
value += arg.value;
|
||||
sgAddVec3(value, *arg.getValue());
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGTurbulenceItem& FGTurbulenceItem::operator-= (const FGTurbulenceItem& arg)
|
||||
{
|
||||
value -= arg.value;
|
||||
sgSubVec3(value, *arg.getValue());
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGTurbulenceItem operator-(const FGTurbulenceItem& arg)
|
||||
{
|
||||
return FGTurbulenceItem(arg.alt, -arg.value);
|
||||
sgVec3 temp;
|
||||
|
||||
sgNegateVec3(temp, *arg.getValue());
|
||||
|
||||
return FGTurbulenceItem(temp);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -63,20 +63,20 @@ FGVaporPressureItem operator-(const FGVaporPressureItem& arg);
|
|||
class FGVaporPressureItem
|
||||
{
|
||||
private:
|
||||
mutable WeatherPrecition value;
|
||||
WeatherPrecition alt;
|
||||
mutable WeatherPrecision value;
|
||||
WeatherPrecision alt;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
FGVaporPressureItem(const WeatherPrecition& a, const WeatherPrecition& v) {alt = a; value = v;}
|
||||
FGVaporPressureItem(const WeatherPrecition& v) {alt = 0.0; value = v;}
|
||||
FGVaporPressureItem(const WeatherPrecision& a, const WeatherPrecision& v) {alt = a; value = v;}
|
||||
FGVaporPressureItem(const WeatherPrecision& v) {alt = 0.0; value = v;}
|
||||
FGVaporPressureItem() {alt = 0.0; value = FG_WEATHER_DEFAULT_VAPORPRESSURE;}
|
||||
|
||||
WeatherPrecition getValue() const { return value; };
|
||||
WeatherPrecition getAlt() const { return alt; };
|
||||
WeatherPrecision getValue() const { return value; };
|
||||
WeatherPrecision getAlt() const { return alt; };
|
||||
|
||||
FGVaporPressureItem& operator*= (const WeatherPrecition& arg);
|
||||
FGVaporPressureItem& operator*= (const WeatherPrecision& arg);
|
||||
FGVaporPressureItem& operator+= (const FGVaporPressureItem& arg);
|
||||
FGVaporPressureItem& operator-= (const FGVaporPressureItem& arg);
|
||||
|
||||
|
@ -85,7 +85,7 @@ public:
|
|||
|
||||
};
|
||||
|
||||
inline FGVaporPressureItem& FGVaporPressureItem::operator*= (const WeatherPrecition& arg)
|
||||
inline FGVaporPressureItem& FGVaporPressureItem::operator*= (const WeatherPrecision& arg)
|
||||
{
|
||||
value *= arg;
|
||||
return *this;
|
||||
|
|
|
@ -3,9 +3,8 @@
|
|||
Module: FGVoronoi.cpp
|
||||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
Called by: main program
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -38,6 +37,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -67,12 +68,12 @@ FGVoronoiOutputList Voronoiate(const FGVoronoiInputList& input)
|
|||
|
||||
PointList p2ds;
|
||||
|
||||
FGVoronoiInputList::iterator it1;
|
||||
FGVoronoiInputList::const_iterator it1;
|
||||
|
||||
//get the points
|
||||
for (it1 = (FGVoronoiInputList::iterator)input.begin(); it1 != input.end(); it1++)
|
||||
for (it1 = input.begin(); it1 != input.end(); it1++)
|
||||
{
|
||||
p2ds.push_back(VoronoiPoint(it1->position.x(), it1->position.y()));
|
||||
p2ds.push_back(VoronoiPoint(it1->position[0], it1->position[1]));
|
||||
}
|
||||
|
||||
cl.clear(); //make sure that it's empty
|
||||
|
@ -104,28 +105,35 @@ FGVoronoiOutputList Voronoiate(const FGVoronoiInputList& input)
|
|||
PointList::iterator it3 = it2->boundary.begin();
|
||||
|
||||
if (it3->infinity == false)
|
||||
boundary.push_back( *it3 );
|
||||
boundary.push_back( sgVec2Wrap(it3->p) );
|
||||
else
|
||||
{
|
||||
Point2D direction_vector = *it3;
|
||||
sgVec2 direction_vector;
|
||||
sgCopyVec2(direction_vector, it3->p);
|
||||
|
||||
it3++;
|
||||
boundary.push_back( (*it3) + direction_vector);
|
||||
sgAddVec2(direction_vector, it3->p);
|
||||
|
||||
boundary.push_back( direction_vector );
|
||||
}
|
||||
|
||||
for (; it3 != it2->boundary.end(); it3++)
|
||||
{
|
||||
boundary.push_back( *it3 );
|
||||
boundary.push_back( sgVec2Wrap(it3->p) );
|
||||
|
||||
}
|
||||
|
||||
it3--;
|
||||
if (it3->infinity == true)
|
||||
{
|
||||
Point2D direction_vector = *it3;
|
||||
sgVec2 direction_vector;
|
||||
sgCopyVec2(direction_vector, it3->p);
|
||||
|
||||
it3--;
|
||||
Point2D value = *it3;
|
||||
sgAddVec2(direction_vector, it3->p);
|
||||
|
||||
boundary.pop_back();
|
||||
boundary.push_back(value + direction_vector);
|
||||
boundary.push_back(direction_vector);
|
||||
}
|
||||
|
||||
ret_list.push_back(FGVoronoiOutput(boundary, input[it2->ID].value));
|
||||
|
@ -182,8 +190,8 @@ bool readsites(PointList input)
|
|||
|
||||
while(It != input.end())
|
||||
{
|
||||
sites[nsites].coord.x = It->x();
|
||||
sites[nsites].coord.y = It->y();
|
||||
sites[nsites].coord.x = It->p[0];
|
||||
sites[nsites].coord.y = It->p[1];
|
||||
|
||||
sites[nsites].sitenbr = nsites;
|
||||
sites[nsites].refcnt = 0;
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -39,6 +39,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -51,27 +53,32 @@ HISTORY
|
|||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include "compiler.h"
|
||||
#include <vector>
|
||||
#include <set>
|
||||
|
||||
#include <Voronoi/point2d.h>
|
||||
#include <vector>
|
||||
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherVectorWrap.h"
|
||||
#include "FGPhysicalProperties.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
/****************************************************************************/
|
||||
FG_USING_STD(vector);
|
||||
FG_USING_STD(set);
|
||||
FG_USING_NAMESPACE(std);
|
||||
|
||||
typedef vector<Point2D> Point2DList;
|
||||
typedef vector<sgVec2Wrap> Point2DList;
|
||||
|
||||
struct FGVoronoiInput
|
||||
{
|
||||
Point2D position;
|
||||
sgVec2 position;
|
||||
FGPhysicalProperties2D value;
|
||||
|
||||
FGVoronoiInput(const Point2D& p, const FGPhysicalProperties2D& v) { position = p; value = v; }
|
||||
FGVoronoiInput(const sgVec2& p, const FGPhysicalProperties2D& v)
|
||||
{
|
||||
sgCopyVec2(position, p);
|
||||
value = v;
|
||||
}
|
||||
};
|
||||
|
||||
struct FGVoronoiOutput
|
||||
|
@ -79,10 +86,14 @@ struct FGVoronoiOutput
|
|||
Point2DList boundary;
|
||||
FGPhysicalProperties2D value;
|
||||
|
||||
FGVoronoiOutput(const Point2DList& b, const FGPhysicalProperties2D& v) {boundary = b; value = v;};
|
||||
FGVoronoiOutput(const Point2DList& b, const FGPhysicalProperties2D& v)
|
||||
{
|
||||
boundary = b;
|
||||
value = v;
|
||||
};
|
||||
};
|
||||
|
||||
typedef vector<FGVoronoiInput> FGVoronoiInputList;
|
||||
typedef vector<FGVoronoiInput> FGVoronoiInputList;
|
||||
typedef vector<FGVoronoiOutput> FGVoronoiOutputList;
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -34,6 +34,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -49,7 +51,7 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
/****************************************************************************/
|
||||
typedef float WeatherPrecition;
|
||||
typedef float WeatherPrecision;
|
||||
|
||||
//set the minimum visibility to get a at least half way realistic weather
|
||||
#define MINIMUM_WEATHER_VISIBILIY 10.0 /* metres */
|
||||
|
@ -57,10 +59,11 @@ typedef float WeatherPrecition;
|
|||
//prefered way the database is working
|
||||
#define PREFERED_WORKING_TYPE default_mode
|
||||
|
||||
#define FG_WEATHER_DEFAULT_TEMPERATURE (15.0+273.16) /*15°C or 288.16°K*/
|
||||
#define FG_WEATHER_DEFAULT_TEMPERATURE (15.0+273.16) /*15°C or 288.16°K*/
|
||||
#define FG_WEATHER_DEFAULT_VAPORPRESSURE (0.0) /*in Pascal 1 Pa = N/m^2*/
|
||||
#define FG_WEATHER_DEFAULT_AIRPRESSURE (1013.25*100.0) /*in Pascal 1 Pa = N/m^2*/
|
||||
#define FG_WEATHER_DEFAULT_AIRDENSITY (1.22501) /*in kg/m^3*/
|
||||
#define FG_WEATHER_DEFAULT_AIRPRESSURE (1013.25*100.0) /*in Pascal 1 Pa = N/m^2*/
|
||||
#define FG_WEATHER_DEFAULT_AIRDENSITY (1.22501) /*in kg/m^3*/
|
||||
|
||||
/****************************************************************************/
|
||||
/* CLASS DECLARATION */
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -36,6 +36,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -48,11 +50,9 @@ HISTORY
|
|||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include <Include/compiler.h>
|
||||
#include <vector>
|
||||
FG_USING_STD(vector);
|
||||
FG_USING_NAMESPACE(std);
|
||||
|
||||
#include <Math/point3d.hxx>
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -74,15 +74,15 @@ class FGWeatherFeature
|
|||
{
|
||||
private:
|
||||
protected:
|
||||
Point3D position; //middle of the feature in lat/lon/alt
|
||||
WeatherPrecition minSize; //smalest size of the feature
|
||||
sgVec3 position; //middle of the feature in lat/lon/alt
|
||||
WeatherPrecision minSize; //smalest size of the feature
|
||||
//=> a disk is specifies
|
||||
|
||||
LayerType FeatureType;
|
||||
|
||||
public:
|
||||
LayerType getFeature(void) const { return FeatureType; }
|
||||
bool isFeature(const LayerType& f) const {return (f == FeatureType);}
|
||||
LayerType getFeature(void) const { return FeatureType; }
|
||||
bool isFeature(const LayerType& f) const { return (f == FeatureType); }
|
||||
};
|
||||
|
||||
/****************************************************************************/
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -78,7 +80,7 @@ HISTORY
|
|||
#define SAT_VP_CONST2 7.444072452
|
||||
#define SAT_VP_CONST3 235.3120919
|
||||
|
||||
inline WeatherPrecition sat_vp(const WeatherPrecition& temp)
|
||||
inline WeatherPrecision sat_vp(const WeatherPrecision temp)
|
||||
{
|
||||
//old:
|
||||
//return 6.112 * pow( 10, (7.5*dp)/(237.7+dp) ); //in mbar
|
||||
|
@ -90,21 +92,21 @@ inline WeatherPrecition sat_vp(const WeatherPrecition& temp)
|
|||
return SAT_VP_CONST1 * pow( 10, (SAT_VP_CONST2*temp)/(SAT_VP_CONST3+temp) ); //in pascal
|
||||
}
|
||||
|
||||
inline WeatherPrecition rel_hum(const WeatherPrecition& act_vp, const WeatherPrecition& sat_vp)
|
||||
inline WeatherPrecision rel_hum(const WeatherPrecision act_vp, const WeatherPrecision sat_vp)
|
||||
{
|
||||
return (act_vp / sat_vp) * 100; //in %
|
||||
}
|
||||
|
||||
inline WeatherPrecition dp(const WeatherPrecition& sat_vp)
|
||||
inline WeatherPrecision dp(const WeatherPrecision sat_vp)
|
||||
{
|
||||
return (SAT_VP_CONST3*log10(sat_vp/SAT_VP_CONST1))/(SAT_VP_CONST2-log10(sat_vp/SAT_VP_CONST1)); //in °C
|
||||
}
|
||||
|
||||
inline WeatherPrecition wb(const WeatherPrecition& t, const WeatherPrecition& p, const WeatherPrecition& dp)
|
||||
inline WeatherPrecision wb(const WeatherPrecision t, const WeatherPrecision p, const WeatherPrecision dp)
|
||||
{
|
||||
WeatherPrecition e = sat_vp(dp);
|
||||
WeatherPrecition tcur, tcvp, peq, diff;
|
||||
WeatherPrecition tmin, tmax;
|
||||
WeatherPrecision e = sat_vp(dp);
|
||||
WeatherPrecision tcur, tcvp, peq, diff;
|
||||
WeatherPrecision tmin, tmax;
|
||||
|
||||
if (t > dp)
|
||||
{
|
||||
|
@ -137,37 +139,37 @@ inline WeatherPrecition wb(const WeatherPrecition& t, const WeatherPrecition& p,
|
|||
|
||||
}
|
||||
|
||||
inline WeatherPrecition Celsius(const WeatherPrecition& celsius)
|
||||
inline WeatherPrecision Celsius(const WeatherPrecision celsius)
|
||||
{
|
||||
return celsius + 273.16; //Kelvin
|
||||
}
|
||||
|
||||
inline WeatherPrecition Fahrenheit(const WeatherPrecition& fahrenheit)
|
||||
inline WeatherPrecision Fahrenheit(const WeatherPrecision fahrenheit)
|
||||
{
|
||||
return (fahrenheit * 9.0 / 5.0) + 32.0 + 273.16; //Kelvin
|
||||
}
|
||||
|
||||
inline WeatherPrecition Kelvin2Celsius(const WeatherPrecition& kelvin)
|
||||
inline WeatherPrecision Kelvin2Celsius(const WeatherPrecision kelvin)
|
||||
{
|
||||
return kelvin - 273.16; //Celsius
|
||||
}
|
||||
|
||||
inline WeatherPrecition Kelvin2Fahrenheit(const WeatherPrecition& kelvin)
|
||||
inline WeatherPrecision Kelvin2Fahrenheit(const WeatherPrecision kelvin)
|
||||
{
|
||||
return ((kelvin - 273.16) * 9.0 / 5.0) + 32.0; //Fahrenheit
|
||||
}
|
||||
|
||||
inline WeatherPrecition Celsius2Fahrenheit(const WeatherPrecition& celsius)
|
||||
inline WeatherPrecision Celsius2Fahrenheit(const WeatherPrecision celsius)
|
||||
{
|
||||
return (celsius * 9.0 / 5.0) + 32.0; //Fahrenheit
|
||||
}
|
||||
|
||||
inline WeatherPrecition Fahrenheit2Celsius(const WeatherPrecition& fahrenheit)
|
||||
inline WeatherPrecision Fahrenheit2Celsius(const WeatherPrecision fahrenheit)
|
||||
{
|
||||
return (fahrenheit - 32.0) * 5.0 / 9.0; //Celsius
|
||||
}
|
||||
|
||||
inline WeatherPrecition Torr2Pascal(const WeatherPrecition& torr)
|
||||
inline WeatherPrecision Torr2Pascal(const WeatherPrecision torr)
|
||||
{
|
||||
return (101325.0/760.0)*torr;
|
||||
}
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
Date started: 28.05.99
|
||||
Called by: FGMicroWeather
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -35,6 +35,8 @@ HISTORY
|
|||
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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -45,8 +47,4 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/********************************** CODE ************************************/
|
||||
/****************************************************************************/
|
||||
bool operator<(const FGWindItem& arg1, const FGWindItem& arg2)
|
||||
{
|
||||
return arg1.alt < arg2.alt;
|
||||
}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@
|
|||
Author: Christian Mayer
|
||||
Date started: 28.05.99
|
||||
|
||||
---------- Copyright (C) 1999 Christian Mayer (vader@t-online.de) ----------
|
||||
-------- 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
|
||||
|
@ -32,9 +32,10 @@ HISTORY
|
|||
28.05.1999 Christian Mayer Created
|
||||
16.06.1999 Durk Talsma Portability for Linux
|
||||
20.06.1999 Christian Mayer added lots of consts
|
||||
10.10.1999 Christian Mayer added mutable for gcc 2.95 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
|
||||
*****************************************************************************/
|
||||
|
||||
/****************************************************************************/
|
||||
|
@ -46,12 +47,10 @@ HISTORY
|
|||
/****************************************************************************/
|
||||
/* INCLUDES */
|
||||
/****************************************************************************/
|
||||
#include <Math/point3d.hxx>
|
||||
#include "sg.h"
|
||||
|
||||
#include "FGWeatherDefs.h"
|
||||
|
||||
//for the case that mutable isn't supported:
|
||||
#include "Include/compiler.h"
|
||||
|
||||
/****************************************************************************/
|
||||
/* DEFINES */
|
||||
/****************************************************************************/
|
||||
|
@ -64,50 +63,55 @@ FGWindItem operator-(const FGWindItem& arg);
|
|||
class FGWindItem
|
||||
{
|
||||
private:
|
||||
mutable Point3D value;
|
||||
WeatherPrecition alt;
|
||||
sgVec3 value;
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
FGWindItem(const WeatherPrecition& a, const Point3D& v) {alt = a; value = v;}
|
||||
FGWindItem(const Point3D& v) {alt = 0.0; value = v;}
|
||||
FGWindItem() {alt = 0.0; value = Point3D(0.0);}
|
||||
FGWindItem(const sgVec3& v) { sgCopyVec3(value, v); }
|
||||
FGWindItem() { sgZeroVec3(value); }
|
||||
|
||||
Point3D getValue() const { return value; };
|
||||
WeatherPrecition getAlt() const { return alt; };
|
||||
void getValue(sgVec3 ret) const { sgCopyVec3(ret, value); };
|
||||
const sgVec3* getValue(void) const { return &value; };
|
||||
|
||||
FGWindItem& operator*= (const WeatherPrecition& arg);
|
||||
FGWindItem& operator+= (const FGWindItem& arg);
|
||||
FGWindItem& operator-= (const FGWindItem& arg);
|
||||
WeatherPrecision x(void) const { return value[0]; };
|
||||
WeatherPrecision y(void) const { return value[1]; };
|
||||
WeatherPrecision z(void) const { return value[2]; };
|
||||
|
||||
FGWindItem& operator*= (const WeatherPrecision arg);
|
||||
FGWindItem& operator+= (const FGWindItem& arg);
|
||||
FGWindItem& operator-= (const FGWindItem& arg);
|
||||
|
||||
friend bool operator<(const FGWindItem& arg1, const FGWindItem& arg2);
|
||||
friend FGWindItem operator-(const FGWindItem& arg);
|
||||
|
||||
};
|
||||
|
||||
inline FGWindItem& FGWindItem::operator*= (const WeatherPrecition& arg)
|
||||
inline FGWindItem& FGWindItem::operator*= (const WeatherPrecision arg)
|
||||
{
|
||||
value *= arg;
|
||||
sgScaleVec3(value, arg);
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGWindItem& FGWindItem::operator+= (const FGWindItem& arg)
|
||||
{
|
||||
value += arg.value;
|
||||
sgAddVec3(value, *arg.getValue());
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline FGWindItem& FGWindItem::operator-= (const FGWindItem& arg)
|
||||
{
|
||||
value -= arg.value;
|
||||
sgSubVec3(value, *arg.getValue());
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
inline FGWindItem operator-(const FGWindItem& arg)
|
||||
{
|
||||
return FGWindItem(arg.alt, -arg.value);
|
||||
sgVec3 temp;
|
||||
|
||||
sgNegateVec3(temp, *arg.getValue());
|
||||
|
||||
return FGWindItem(temp);
|
||||
}
|
||||
|
||||
/****************************************************************************/
|
||||
#endif /*FGWindItem_H*/
|
||||
|
|
Loading…
Add table
Reference in a new issue