1
0
Fork 0

Change runway object routine. Do elevation calculation and model write out in one loop

This commit is contained in:
Christian Schmitt 2012-10-29 21:03:47 +01:00
parent 707e939337
commit e9c3f3065c
6 changed files with 67 additions and 124 deletions

View file

@ -194,6 +194,16 @@ static tgContour calc_elevations( TGAptSurface &surf,
return result;
}
static double calc_elevation( TGAptSurface &surf,
const SGGeod& node,
double offset )
{
double elev = surf.query( node.getLongitudeDeg(), node.getLatitudeDeg() );
elev += offset;
return elev;
}
// Determine node elevations of each node of a TGPolygon based on the
// provided TGAptSurface. Offset is added to the final elevation
@ -992,51 +1002,6 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
SG_LOG(SG_GENERAL, SG_DEBUG, "Done with base calc_elevations()");
#if 0 // TODO
SG_LOG(SG_GENERAL, SG_INFO, "Computing tower node elevations");
point_list tower_nodes = calc_elevations( apt_surf, towers, 0.0 );
#endif
// calc windsock elevations:
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing windsock node elevations");
point_list ws_nodes;
ws_nodes.clear();
for ( unsigned int i = 0; i < windsocks.size(); ++i )
{
p = windsocks[i]->GetLoc();
ws_nodes.push_back( p );
}
point_list windsock_nodes = calc_elevations( apt_surf, ws_nodes, 0.0 );
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing beacon node elevations");
point_list b_nodes;
b_nodes.clear();
for ( unsigned int i = 0; i < beacons.size(); ++i )
{
p = beacons[i]->GetLoc();
b_nodes.push_back( p );
}
point_list beacon_nodes = calc_elevations( apt_surf, b_nodes, 0.0 );
// calc taxiway sign elevations:
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing taxiway sign node elevations");
point_list ts_nodes;
ts_nodes.clear();
for ( unsigned int i = 0; i < signs.size(); ++i )
{
p = signs[i]->GetLoc();
ts_nodes.push_back( p );
}
point_list taxisigns_nodes = calc_elevations( apt_surf, ts_nodes, 0.0 );
// calc water runway buoys elevations:
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing water buoy elevations");
point_list buoy_nodes;
for ( unsigned int i = 0; i < waterrunways.size(); ++i )
{
buoy_nodes = waterrunways[i]->TempGetAsPointList();
}
point_list water_buoys_nodes = calc_elevations( apt_surf, buoy_nodes, 0.0 );
// add base skirt (to hide potential cracks)
// this has to happen after we've calculated the node elevations
@ -1318,46 +1283,62 @@ void Airport::BuildBtg(const string& root, const string_list& elev_src )
}
#endif
// write out windsock references : TODO - save elevation data in the windsock object
for ( unsigned int i = 0; i < windsock_nodes.size(); ++i )
SGGeod ref_geod;
// calc elevations and write out windsock references
SG_LOG(SG_GENERAL, SG_DEBUG, "Computing windsock node elevations");
for ( unsigned int i = 0; i < windsocks.size(); ++i )
{
if ( windsocks[i]->IsLit() )
SGGeod ref_geod = windsocks[i]->GetLoc();
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
if ( windsocks[i]->IsLit() )
{
write_index_shared( objpath, b, windsock_nodes[i],
"Models/Airport/windsock_lit.xml",
0.0 );
write_index_shared( objpath, b, ref_geod,
"Models/Airport/windsock_lit.xml", 0.0 );
}
else
{
write_index_shared( objpath, b, windsock_nodes[i],
"Models/Airport/windsock.xml",
0.0 );
}
write_index_shared( objpath, b, ref_geod,
"Models/Airport/windsock.xml", 0.0 );
}
}
// write out beacon references
for ( unsigned int i = 0; i < beacon_nodes.size(); ++i )
for ( unsigned int i = 0; i < beacons.size(); ++i )
{
write_index_shared( objpath, b, beacon_nodes[i],
ref_geod = beacons[i]->GetLoc();
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
write_index_shared( objpath, b, ref_geod,
"Models/Airport/beacon.xml",
0.0 );
}
// write out taxiway signs references
for ( unsigned int i = 0; i < taxisigns_nodes.size(); ++i )
for ( unsigned int i = 0; i < signs.size(); ++i )
{
write_object_sign( objpath, b, taxisigns_nodes[i],
ref_geod = signs[i]->GetLoc();
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
write_object_sign( objpath, b, ref_geod,
signs[i]->GetDefinition(),
signs[i]->GetHeading(),
signs[i]->GetSize() );
}
// write out water buoys
for ( unsigned int i = 0; i < water_buoys_nodes.size(); ++i )
for ( unsigned int i = 0; i < waterrunways.size(); ++i )
{
write_index_shared( objpath, b, water_buoys_nodes[i],
"Models/Airport/water_rw_buoy.xml",
0.0 );
tgContour buoys = waterrunways[i]->GetBuoys();
for ( unsigned int j = 0; j < buoys.GetSize(); ++j )
{
ref_geod = buoys.GetNode(j);
ref_geod.setElevationM( calc_elevation( apt_surf, ref_geod, 0.0 ) );
write_index_shared( objpath, b, ref_geod,
"Models/Airport/water_rw_buoy.xml",
0.0 );
}
}
string holepath = root + "/AirportArea";

View file

@ -5,10 +5,6 @@
#include <stdlib.h>
#include <Polygon/polygon.hxx>
#include <Polygon/superpoly.hxx>
#include <Polygon/texparams.hxx>
#include <Geometry/point3d.hxx>
using std::string;
@ -21,9 +17,9 @@ public:
double lon;
int lit;
Point3D GetLoc()
SGGeod GetLoc()
{
return Point3D( lon, lat, 0.0f );
return SGGeod::fromDeg(lon, lat);
}
bool IsLit()
@ -44,9 +40,9 @@ public:
double lon;
int code;
Point3D GetLoc()
SGGeod GetLoc()
{
return Point3D( lon, lat, 0.0f );
return SGGeod::fromDeg(lon, lat);
}
int GetCode()
@ -69,9 +65,9 @@ public:
int size;
string sgn_def;
Point3D GetLoc()
SGGeod GetLoc()
{
return Point3D( lon, lat, 0.0f );
return SGGeod::fromDeg(lon, lat);
}
double GetHeading()

View file

@ -60,7 +60,7 @@ WaterRunway::WaterRunway(char* definition)
SG_LOG(SG_GENERAL, SG_DEBUG, "Read water runway: (" << lon[0] << "," << lat[0] << ") to (" << lon[1] << "," << lat[1] << ") width: " << width << " buoys = " << buoys );
}
tgContour WaterRunway::GetNodes()
tgContour WaterRunway::GetBuoys()
{
tgContour buoys_nodes;
@ -69,48 +69,18 @@ tgContour WaterRunway::GetNodes()
// calculate runway heading and length
SGGeodesy::inverse(GetStart(), GetEnd(), heading, az2, length);
// create a polygon for the outline and use it to calculate the point list
int divs = (int)(length / 100.0);
// create a contour with points every 100m
tgContour area = gen_wgs84_area(GetStart(), GetEnd(),
0, 0, 0, width, heading, false);
Point3D pt, inc;
for ( unsigned int i = 0; i < area.GetSize(); ++i ) {
pt = Point3D::fromSGGeod( area.GetNode(i) );
inc = ( Point3D::fromSGGeod( area.GetNode(i==3 ? 0 : i+1) ) -
Point3D::fromSGGeod( area.GetNode(i)) ) / divs;
for ( int j = 0; j < divs; ++j) {
buoys_nodes.AddNode( pt.toSGGeod() );
pt += inc;
}
}
}
return buoys_nodes;
}
point_list WaterRunway::TempGetAsPointList()
{
point_list buoys_nodes;
if (buoys){
double heading, az2, length;
// calculate runway heading and length
SGGeodesy::inverse(GetStart(), GetEnd(), heading, az2, length);
// create a polygon for the outline and use it to calculate the point list
int divs = (int)(length / 100.0);
tgContour area = gen_wgs84_area(GetStart(), GetEnd(),
0, 0, 0, width, heading, false);
Point3D pt, inc;
for ( unsigned int i = 0; i < area.GetSize(); ++i ) {
pt = Point3D::fromSGGeod( area.GetNode( i ) );
inc = ( Point3D::fromSGGeod( area.GetNode(i==3 ? 0 : i+1) ) -
Point3D::fromSGGeod( area.GetNode(i)) ) / divs;
for ( int j = 0; j < divs; ++j) {
buoys_nodes.push_back( pt );
pt += inc;
double dist, course, cs;
SGGeodesy::inverse(area.GetNode(i), area.GetNode(i==3 ? 0 : i+1), course, cs, dist );
int divs = (int)(dist / 100.0);
double step = dist/divs;
SGGeod pt = area.GetNode(i);
for (int j = 0; j < divs; ++j) {
pt = SGGeodesy::direct(pt, course, step );
buoys_nodes.AddNode( pt );
}
}
}

View file

@ -5,9 +5,6 @@
#include <stdlib.h>
#include <Polygon/polygon.hxx>
#include <Polygon/superpoly.hxx>
#include <Polygon/texparams.hxx>
#include <Geometry/point3d.hxx>
#include "apt_math.hxx"
@ -188,8 +185,7 @@ class WaterRunway
public:
WaterRunway(char* def);
tgContour GetNodes();
point_list TempGetAsPointList();
tgContour GetBuoys();
SGGeod GetStart(void)
{

View file

@ -92,7 +92,7 @@ void write_index( const string& base, const SGBucket& b, const string& name )
// update index file (list of shared objects to be included in final
// scenery build)
void write_index_shared( const string &base, const SGBucket &b,
const Point3D &p, const string& name,
const SGGeod &p, const string& name,
const double &heading )
{
string dir = base + "/" + b.gen_base_path();
@ -111,12 +111,12 @@ void write_index_shared( const string &base, const SGBucket &b,
}
fprintf( fp, "OBJECT_SHARED %s %.6f %.6f %.1f %.2f\n", name.c_str(),
p.lon(), p.lat(), p.elev(), heading );
p.getLongitudeDeg(), p.getLatitudeDeg(), p.getElevationM(), heading );
fclose( fp );
}
void write_object_sign( const string &base, const SGBucket &b,
const Point3D &p, const string& sign,
const SGGeod &p, const string& sign,
const double &heading, const int &size)
{
string dir = base + "/" + b.gen_base_path();
@ -135,7 +135,7 @@ void write_object_sign( const string &base, const SGBucket &b,
}
fprintf( fp, "OBJECT_SIGN %s %.6f %.6f %.1f %.2f %u\n", sign.c_str(),
p.lon(), p.lat(), p.elev(), heading, size );
p.getLongitudeDeg(), p.getLatitudeDeg(), p.getElevationM(), heading, size );
fclose( fp );
}

View file

@ -50,13 +50,13 @@ void write_index( const std::string& base, const SGBucket& b, const std::string&
// update index file (list of shared objects to be included in final
// scenery build)
void write_index_shared( const std::string &base, const SGBucket &b,
const Point3D &p, const std::string& name,
const SGGeod &p, const std::string& name,
const double &heading );
// update index file (list of shared objects to be included in final
// scenery build)
void write_object_sign( const std::string &base, const SGBucket &b,
const Point3D &p, const std::string& sign,
const SGGeod &p, const std::string& sign,
const double &heading, const int &size );
void write_boundary( const std::string& base, const SGBucket& b,