doGroundAltitude();
//cerr << " Actual altitude " << altitude << endl;
// Transform();
- pos.setelev(altitude * SG_FEET_TO_METER);
+ pos.setElevationFt(altitude);
}
return;
}
* speed * 1.686 / ft_per_deg_lon;
// set new position
- pos.setlat( pos.lat() + speed_north_deg_sec * dt);
- pos.setlon( pos.lon() + speed_east_deg_sec * dt);
+ pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
+ pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
//if (!(finite(pos.lat()) && finite(pos.lon())))
// {
// cerr << "Position is not finite" << endl;
// adjust altitude (meters) based on current vertical speed (fpm)
altitude += vs / 60.0 * dt;
- pos.setelev(altitude * SG_FEET_TO_METER);
+ pos.setElevationFt(altitude);
double altitude_ft = altitude;
// adjust target Altitude, based on ground elevation when on ground
if (curr->crossat > -1000.0) { //use a calculated descent/climb rate
use_perf_vs = false;
tgt_vs = (curr->crossat - prev->altitude)
- / (fp->getDistanceToGo(pos.lat(), pos.lon(), curr)
+ / (fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr)
/ 6076.0 / prev->speed*60.0);
tgt_altitude = curr->crossat;
} else {
dt_count = 0;
}
// check to see if we've reached the lead point for our next turn
- double dist_to_go = fp->getDistanceToGo(pos.lat(), pos.lon(), curr);
+ double dist_to_go = fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
//cerr << "2" << endl;
double lead_dist = fp->getLeadDistance();
double userLatitude = fgGetDouble("/position/latitude-deg");
double userLongitude = fgGetDouble("/position/longitude-deg");
double course, distance;
- SGWayPoint current (pos.lon(), pos.lat(), 0);
+ SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
SGWayPoint user (userLongitude, userLatitude, 0);
user.CourseAndDistance(current, &course, &distance);
if ((distance * SG_METER_TO_NM) > TRAFFICTOAIDIST) {
if (curr->crossat > -1000.0) {
//cerr << "5.1a" << endl;
use_perf_vs = false;
- tgt_vs = (curr->crossat - altitude) / (fp->getDistanceToGo(pos.lat(), pos.lon(), curr)
+ tgt_vs = (curr->crossat - altitude) / (fp->getDistanceToGo(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr)
/ 6076.0 / speed*60.0);
//cerr << "5.1b" << endl;
tgt_altitude = curr->crossat;
//cout << " Target heading: " << tgt_heading << endl << endl;
} else {
- double calc_bearing = fp->getBearing(pos.lat(), pos.lon(), curr);
+ double calc_bearing = fp->getBearing(pos.getLatitudeDeg(), pos.getLongitudeDeg(), curr);
//cerr << "Bearing = " << calc_bearing << endl;
if (speed < 0) {
calc_bearing +=180;
} else {
cerr << "calc_bearing is not a finite number : "
<< "Speed " << speed
- << "pos : " << pos.lat() << ", " << pos.lon()
+ << "pos : " << pos.getLatitudeDeg() << ", " << pos.getLongitudeDeg()
<< "waypoint " << curr->latitude << ", " << curr->longitude << endl;
cerr << "waypoint name " << curr->name;
exit(1); // FIXME
//Point3D currView(vw->getLongitude_deg(),
// vw->getLatitude_deg(), 0.0);
- SGWayPoint current (pos.lon(), pos.lat(), 0);
+ SGWayPoint current(pos.getLongitudeDeg(), pos.getLatitudeDeg(), 0);
SGWayPoint view (vw->getLongitude_deg(), vw->getLatitude_deg(), 0);
view.CourseAndDistance(current, &course, &distance);
if(distance > visibility_meters) {
// FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double range = 500.0;
- if (!globals->get_tile_mgr()->scenery_available(pos.lat(), pos.lon(), range)) {
+ if (!globals->get_tile_mgr()->scenery_available(pos.getLatitudeDeg(), pos.getLongitudeDeg(), range)) {
// Try to shedule tiles for that position.
globals->get_tile_mgr()->update( aip.getSGLocation(), range );
}
// FIXME: make sure the pos.lat/pos.lon values are in degrees ...
double alt;
- if (globals->get_scenery()->get_elevation_m(pos.lat(), pos.lon(), 20000.0, alt, 0))
+ if (globals->get_scenery()->get_elevation_m(pos.getLatitudeDeg(), pos.getLongitudeDeg(), 20000.0, alt, 0))
tgt_altitude = alt * SG_METER_TO_FEET;
//cerr << "Target altitude : " << tgt_altitude << endl;
// calculate vertical and horizontal speed components
vs = sin( pitch * SG_DEGREES_TO_RADIANS ) * speed;
- hs = cos( pitch * SG_DEGREES_TO_RADIANS ) * speed;
+ double hs = cos( pitch * SG_DEGREES_TO_RADIANS ) * speed;
// convert horizontal speed (fps) to degrees per second
speed_north_deg_sec = cos(hdg / SG_RADIANS_TO_DEGREES) * hs / ft_per_deg_lat;
wind_speed_from_east_deg_sec = wind_from_east / ft_per_deg_lon;
// set new position
- pos.setlat( pos.lat() + (speed_north_deg_sec - wind_speed_from_north_deg_sec) * dt );
- pos.setlon( pos.lon() + (speed_east_deg_sec - wind_speed_from_east_deg_sec) * dt );
+ pos.setLatitudeDeg( pos.getLatitudeDeg() + (speed_north_deg_sec - wind_speed_from_north_deg_sec) * dt );
+ pos.setLongitudeDeg( pos.getLongitudeDeg() + (speed_east_deg_sec - wind_speed_from_east_deg_sec) * dt );
// adjust vertical speed for acceleration of gravity and buoyancy
vs -= (gravity - buoyancy) * dt;
// adjust altitude (feet)
altitude += vs * dt;
- pos.setelev(altitude * SG_FEET_TO_METER);
+ pos.setElevationFt(altitude);
// recalculate pitch (velocity vector) if aerostabilized
// cout << "aero_stabilised " << aero_stabilised << endl ;
double azimuth; // degrees true
double elevation; // degrees
double rotation; // degrees
- double hs; // horizontal speed (fps)
bool aero_stabilised; // if true, object will align wit trajectory
double drag_area; // equivalent drag area in ft2
double life_timer; // seconds
if (_otype == otBallistic)
CalculateMach();
- ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
- ft_per_deg_lon = 365228.16 * cos(pos.lat()*SGD_DEGREES_TO_RADIANS);
+ ft_per_deg_lat = 366468.96 - 3717.12 * cos(pos.getLatitudeRad());
+ ft_per_deg_lon = 365228.16 * cos(pos.getLatitudeRad());
}
void FGAIBase::Transform() {
if (!invisible) {
- aip.setPosition(pos.lon(), pos.lat(), pos.elev() * SG_METER_TO_FEET);
+ aip.setPosition(pos);
if (no_roll) {
aip.setOrientation(0.0, pitch, hdg);
} else {
double user_latitude = manager->get_user_latitude();
double user_longitude = manager->get_user_longitude();
- double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
- double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
+ double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
+ double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft2 = lat_range*lat_range + lon_range*lon_range;
//
range = range_ft / 6076.11549;
// calculate bearing to target
- if (pos.lat() >= user_latitude) {
+ if (pos.getLatitudeDeg() >= user_latitude) {
bearing = atan2(lat_range, lon_range) * SG_RADIANS_TO_DEGREES;
- if (pos.lon() >= user_longitude) {
+ if (pos.getLongitudeDeg() >= user_longitude) {
bearing = 90.0 - bearing;
} else {
bearing = 270.0 + bearing;
}
} else {
bearing = atan2(lon_range, lat_range) * SG_RADIANS_TO_DEGREES;
- if (pos.lon() >= user_longitude) {
+ if (pos.getLongitudeDeg() >= user_longitude) {
bearing = 180.0 - bearing;
} else {
bearing = 180.0 + bearing;
FGAIBase::getCartPosAt(const SGVec3d& _off) const
{
// Transform that one to the horizontal local coordinate system.
- SGQuatd hlTrans = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
+
+ SGQuatd hlTrans = SGQuatd::fromLonLat(pos);
// and postrotate the orientation of the AIModel wrt the horizontal
// local frame
hlTrans *= SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
SGVec3d off = hlTrans.backTransform(_off);
// Add the position offset of the AIModel to gain the earth centered position
- SGVec3d cartPos = SGGeod::fromDegFt(pos.lon(), pos.lat(), pos.elev());
+ SGVec3d cartPos = SGVec3d::fromGeod(pos);
return cartPos + off;
}
* getters and Setters
*/
void FGAIBase::_setLongitude( double longitude ) {
- pos.setlon(longitude);
+ pos.setLongitudeDeg(longitude);
}
void FGAIBase::_setLatitude ( double latitude ) {
- pos.setlat(latitude);
+ pos.setLatitudeDeg(latitude);
}
double FGAIBase::_getLongitude() const {
- return pos.lon();
+ return pos.getLongitudeDeg();
}
double FGAIBase::_getLatitude () const {
- return pos.lat();
+ return pos.getLatitudeDeg();
}
double FGAIBase::_getRdot() const {
return rdot;
FGAIBase(object_type ot);
virtual ~FGAIBase();
- inline const Point3D& GetPos() const { return(pos); }
virtual void readFromScenario(SGPropertyNode* scFileNode);
FGAIManager* manager;
// these describe the model's actual state
- Point3D pos; // WGS84 lat & lon in degrees, elev above sea-level in meters
+ SGGeod pos; // WGS84 lat & lon in degrees, elev above sea-level in meters
double hdg; // True heading in degrees
double roll; // degrees, left is negative
double pitch; // degrees, nose-down is negative
inline void FGAIBase::setAltitude( double altitude_ft ) {
altitude = tgt_altitude = altitude_ft;
- pos.setelev(altitude * SG_FEET_TO_METER);
+ pos.setElevationFt(altitude);
}
inline void FGAIBase::setBank( double bank ) {
}
inline void FGAIBase::setLongitude( double longitude ) {
- pos.setlon( longitude );
+ pos.setLongitudeDeg( longitude );
}
inline void FGAIBase::setLatitude ( double latitude ) {
- pos.setlat( latitude );
+ pos.setLatitudeDeg( latitude );
}
inline void FGAIBase::setDie( bool die ) { delete_me = die; }
// but by just apply discrete changes at its velocity variables.
// Update the velocity information stored in those nodes.
// Transform that one to the horizontal local coordinate system.
- SGQuatd ec2hl = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
+ SGQuatd ec2hl = SGQuatd::fromLonLat(pos);
// The orientation of the carrier wrt the horizontal local frame
SGQuatd hl2body = SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
// and postrotate the orientation of the AIModel wrt the horizontal
// local frame
SGQuatd ec2body = ec2hl*hl2body;
// The cartesian position of the carrier in the wgs84 world
- SGVec3d cartPos = SGGeod::fromDegFt(pos.lon(), pos.lat(), pos.elev());
+ SGVec3d cartPos = SGVec3d::fromGeod(pos);
// Store for later use by the groundcache
rot_pivot_wrt_earth = cartPos;
// Now here is the finite difference ...
// Transform that one to the horizontal local coordinate system.
- SGQuatd ec2hlNew = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat());
+ SGQuatd ec2hlNew = SGQuatd::fromLonLat(pos);
// compute the new orientation
SGQuatd hl2bodyNew = SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll);
// The rotation difference
turn_to_launch_hdg = false;
returning = false;
- initialpos = pos;
+ mOpBoxPos = pos;
base_course = hdg;
base_speed = speed;
props->tie("controls/base-speed-kts",
SGRawValuePointer<double>(&base_speed));
props->tie("controls/start-pos-lat-deg",
- SGRawValuePointer<double>(&initialpos[1]));
+ SGRawValueMethods<SGGeod,double>(pos, &SGGeod::getLatitudeDeg));
props->tie("controls/start-pos-long-deg",
- SGRawValuePointer<double>(&initialpos[0]));
+ SGRawValueMethods<SGGeod,double>(pos, &SGGeod::getLongitudeDeg));
props->tie("velocities/speed-kts",
SGRawValuePointer<double>(&speed));
props->tie("environment/surface-wind-speed-true-kts",
if ((*it).name == id || id.empty()) {
ParkPosition ppos = *it;
SGVec3d cartPos = getCartPosAt(ppos.offset);
- geodPos = cartPos;
+ geodPos = SGGeod::fromCart(cartPos);
hdng = hdg + ppos.heading_deg;
double shdng = sin(ppos.heading_deg * SGD_DEGREES_TO_RADIANS);
double chdng = cos(ppos.heading_deg * SGD_DEGREES_TO_RADIANS);
// care for transforms ...
short v[2];
l->getLine(0, v, v+1 );
- sgVec3 ends[2];
+ SGVec3f ends[2];
for (int k=0; k<2; ++k)
- sgCopyVec3( ends[k], l->getVertex( v[k] ) );
+ sgCopyVec3( ends[k].sg(), l->getVertex( v[k] ) );
// When the 1 end is behind the 0 end, swap the coordinates.
if (ends[0][0] < ends[1][0]) {
- sgCopyVec3( l->getVertex( v[0] ), ends[1] );
- sgCopyVec3( l->getVertex( v[1] ), ends[0] );
+ sgCopyVec3( l->getVertex( v[0] ), ends[1].sg() );
+ sgCopyVec3( l->getVertex( v[1] ), ends[0].sg() );
}
found = true;
}
void FGAICarrier::ReturnToBox(){
double course, distance, az2;
- //get the carrier position
- carrierpos = pos;
-
- //cout << "lat: " << carrierpos[1] << " lon: " << carrierpos[0] << endl;
-
//calculate the bearing and range of the initial position from the carrier
- geo_inverse_wgs_84(carrierpos[2],
- carrierpos[1],
- carrierpos[0],
- initialpos[1],
- initialpos[0],
- &course, &az2, &distance);
+ geo_inverse_wgs_84(pos, mOpBoxPos, &course, &az2, &distance);
distance *= SG_METER_TO_NM;
return false;
}
- if (initialpos[1] >= 0) { //northern hemisphere
- if (pos[1] >= initialpos[1] + max_lat)
+ if (mOpBoxPos.getLatitudeDeg() >= 0) { //northern hemisphere
+ if (pos.getLatitudeDeg() >= mOpBoxPos.getLatitudeDeg() + max_lat)
return true;
- if (pos[1] <= initialpos[1] - min_lat)
+ if (pos.getLatitudeDeg() <= mOpBoxPos.getLatitudeDeg() - min_lat)
return true;
} else { //southern hemisphere
- if (pos[1] <= initialpos[1] - max_lat)
+ if (pos.getLatitudeDeg() <= mOpBoxPos.getLatitudeDeg() - max_lat)
return true;
- if (pos[1] >= initialpos[1] + min_lat)
+ if (pos.getLatitudeDeg() >= mOpBoxPos.getLatitudeDeg() + min_lat)
return true;
}
- if (initialpos[0] >=0) { //eastern hemisphere
- if (pos[0] >= initialpos[0] + max_long)
+ if (mOpBoxPos.getLongitudeDeg() >=0) { //eastern hemisphere
+ if (pos.getLongitudeDeg() >= mOpBoxPos.getLongitudeDeg() + max_long)
return true;
- if (pos[0] <= initialpos[0] - min_long)
+ if (pos.getLongitudeDeg() <= mOpBoxPos.getLongitudeDeg() - min_long)
return true;
} else { //western hemisphere
- if (pos[0] <= initialpos[0] - max_long)
+ if (pos.getLongitudeDeg() <= mOpBoxPos.getLongitudeDeg() - max_long)
return true;
- if (pos[0] >= initialpos[0] + min_long)
+ if (pos.getLongitudeDeg() >= mOpBoxPos.getLongitudeDeg() + min_long)
return true;
}
bool wave_off_lights;
// these are for maneuvering the carrier
- Point3D carrierpos;
- Point3D initialpos;
+ SGGeod mOpBoxPos;
double wind_speed_from_north_kts ;
double wind_speed_from_east_kts ;
}
// extract the position
- SGGeod geod = ecPos;
- pos.setlat(geod.getLatitudeDeg());
- pos.setlon(geod.getLongitudeDeg());
- pos.setelev(geod.getElevationM());
+ pos = SGGeod::fromCart(ecPos);
// The quaternion rotating from the earth centered frame to the
// horizontal local frame
- SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)geod.getLongitudeRad(),
- (float)geod.getLatitudeRad());
+ SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)pos.getLongitudeRad(),
+ (float)pos.getLatitudeRad());
// The orientation wrt the horizontal local frame
SGQuatf hlOr = conj(qEc2Hl)*ecOrient;
float hDeg, pDeg, rDeg;
pitch = pDeg;
SG_LOG(SG_GENERAL, SG_DEBUG, "Multiplayer position and orientation: "
- << geod << ", " << hlOr);
+ << ecPos << ", " << hlOr);
//###########################//
// do calculations for radar //
* speed * 1.686 / ft_per_deg_lon;
// set new position
- pos.setlat( pos.lat() + speed_north_deg_sec * dt);
- pos.setlon( pos.lon() + speed_east_deg_sec * dt);
+ pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
+ pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
// adjust heading based on current rudder angle
* speed * 1.686 / ft_per_deg_lon;
// set new position
- pos.setlat( pos.lat() + speed_north_deg_sec * dt);
- pos.setlon( pos.lon() + speed_east_deg_sec * dt);
+ pos.setLatitudeDeg( pos.getLatitudeDeg() + speed_north_deg_sec * dt);
+ pos.setLongitudeDeg( pos.getLongitudeDeg() + speed_east_deg_sec * dt);
// do calculations for weather radar display
UpdateRadar(manager);
double user_altitude = manager->get_user_altitude();
// calculate range to target in feet and nautical miles
- double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
- double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
+ double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
+ double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft = sqrt(lat_range*lat_range + lon_range*lon_range);
range = range_ft / 6076.11549;
double user_altitude = manager->get_user_altitude();
// calculate range to target in feet and nautical miles
- double lat_range = fabs(pos.lat() - user_latitude) * ft_per_deg_lat;
- double lon_range = fabs(pos.lon() - user_longitude) * ft_per_deg_lon;
+ double lat_range = fabs(pos.getLatitudeDeg() - user_latitude) * ft_per_deg_lat;
+ double lon_range = fabs(pos.getLongitudeDeg() - user_longitude) * ft_per_deg_lon;
double range_ft = sqrt(lat_range*lat_range + lon_range*lon_range);
range = range_ft / 6076.11549;
# include <config.h>
#endif
+#include <simgear/math/SGMath.hxx>
#include <simgear/math/sg_geodesy.hxx>
#include <Main/fg_props.hxx>
double acc_down = _acc_down->getDoubleValue();
_set_Accels_Local( acc_lon, acc_lat, acc_down );
- sgVec3 accel_ned;
- sgSetVec3(accel_ned, acc_lon, acc_lat, acc_down);
- double accel = sgLengthVec3 (accel_ned) * SG_FEET_TO_METER;
+ double accel = norm(SGVec3d(acc_lon, acc_lat, acc_down)) * SG_FEET_TO_METER;
double velocity = (_speed->getDoubleValue() * SG_KT_TO_MPS) + accel * dt;
double dist = cos (pitch) * velocity * dt;
_set_V_calibrated_kts( kts );
_set_V_ground_speed( kts );
+ SGGeod pos = SGGeod::fromDegM(get_Longitude(), get_Latitude(), get_Altitude());
// update (lon/lat) position
- double lat2, lon2, az2;
- geo_direct_wgs_84 ( get_Altitude(),
- get_Latitude() * SGD_RADIANS_TO_DEGREES,
- get_Longitude() * SGD_RADIANS_TO_DEGREES,
- heading * SGD_RADIANS_TO_DEGREES,
- dist, &lat2, &lon2, &az2 );
-
- _set_Longitude( lon2 * SGD_DEGREES_TO_RADIANS );
- _set_Latitude( lat2 * SGD_DEGREES_TO_RADIANS );
+ SGGeod pos2;
+ double az2;
+ geo_direct_wgs_84 ( pos, heading * SGD_RADIANS_TO_DEGREES,
+ dist, pos2, &az2 );
+
+ _set_Longitude( pos2.getLongitudeRad() );
+ _set_Latitude( pos2.getLatitudeRad() );
double sl_radius, lat_geoc;
sgGeodToGeoc( get_Latitude(), get_Altitude(), &sl_radius, &lat_geoc );
// first the aprioriate structure for the geodetic one
SGGeod geod = SGGeod::fromRadFt(lon, lat, ifce->get_Altitude());
// Convert to cartesion coordinate
- motionInfo.position = geod;
+ motionInfo.position = SGVec3d::fromGeod(geod);
// The quaternion rotating from the earth centered frame to the
// horizontal local frame