⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dgpslistener.h

📁 Gps 数据采集
💻 H
📖 第 1 页 / 共 3 页
字号:
  {
    result = -result;
  }
  
  return result; 
}

static inline double NMEAParserGetMinutesFromNMEALon(const char lon[11])
{
  char buf[8];

  buf[0] = lon[3];
  buf[1] = lon[4];  
  buf[2] = lon[5];
  buf[3] = lon[6];
  buf[4] = lon[7];
  buf[5] = lon[8];
  buf[6] = lon[9];
  buf[7] = '\0';

  return(atof(buf)); 
}

// Geodesy Foundation Classes (Sam Blackburn)

class CMath
{
  // This class encapsulates all of the math functions. It is here to allow you
  // to replace the C Runtime functions with your home-grown (and maybe better
  // implementation) routines

public:

  static inline double AbsoluteValue( const double& value );
  static inline double ArcCosine( const double& value );
  static inline double ArcSine( const double& value );
  static inline double ArcTangent( const double& value );
  static inline double ArcTangentOfYOverX( const double& y, const double& x );
  static inline double Ceiling( const double& value );
  static inline double ConvertDegreesToRadians( const double& degrees );
  static inline double ConvertRadiansToDegrees( const double& radians );
  static inline void   ConvertDecimalDegreesToDegreesMinutesSeconds( double decimal_degrees, double& degrees, double& minutes, double& seconds );
  // West is negative, East is positive, North is positive, south is negative
  static inline double ConvertDegreesMinutesSecondsCoordinateToDecimalDegrees( double degrees, double minutes, double seconds );
  static inline double Cosine( const double& value );
  static inline double HyperbolicCosine( const double& value );
  static inline double Pi( void );
  static inline double Sine( const double& value );
  static inline double SquareRoot( const double& value );
};

// This is Blackburn's inline functions implementation (original "CMath.inl") 

inline double CMath::AbsoluteValue(const double& value)
{
  return(::fabs(value));
}

inline double CMath::ArcCosine(const double& value)
{
  return(::acos(value));
}

inline double CMath::ArcSine(const double& value)
{
  return(::asin(value));
}

inline double CMath::ArcTangent(const double& value)
{
  return(::atan(value));
}

inline double CMath::ArcTangentOfYOverX( const double& y, const double& x)
{
  return(::atan2(y,x));
}

inline double CMath::Ceiling(const double& value)
{
  return(::ceil(value));
}

inline void CMath::ConvertDecimalDegreesToDegreesMinutesSeconds(double decimal_degrees,
                                                                double& degrees,
                                                                double& minutes,
                                                                double& seconds)
{
  double fractional_part = 0.0;

  double integer_part = 0;

  fractional_part = ::modf(decimal_degrees,&integer_part);

  degrees = integer_part;

  if (decimal_degrees < 0.0)
  {
    fractional_part *= (-1.0);
  }

  minutes = fractional_part * 60.0;

  fractional_part = ::modf(minutes,&integer_part);

  minutes = integer_part;

  seconds = fractional_part * 60.0;
}

inline double CMath::ConvertDegreesMinutesSecondsCoordinateToDecimalDegrees(double degrees, 
                                                                            double minutes, 
                                                                            double seconds)
{
  double decimal_degrees = 0.0;

  decimal_degrees = degrees;

  if (decimal_degrees < 0.0)
  {
    decimal_degrees *= (-1.0);
  }

  decimal_degrees += (double) (minutes / 60.0);
  decimal_degrees += (double) (seconds / 3600.0);

  if ( degrees < 0.0 )
  {
    decimal_degrees *= (-1.0);
  }

  return(decimal_degrees);
}

inline double CMath::ConvertDegreesToRadians(const double& degrees)
{
  double radians = 0.0;
  double pi_divided_by_180 = CMath::Pi() / 180.0;
   
  radians = degrees * pi_divided_by_180;

  return( radians );
}

inline double CMath::ConvertRadiansToDegrees(const double& radians)
{
  double degrees = 0.0;

  double conversion_factor = 180.0 / CMath::Pi();

  degrees = radians * conversion_factor;

  return( degrees );
}

inline double CMath::Cosine(const double& value)
{
  return(::cos(value));
}

inline double CMath::HyperbolicCosine(const double& value)
{
  return(::cosh(value));
}

inline double CMath::Pi(void)
{
  return( 3.1415926535897932384626433832795028841971693993751058209749445923078164 );
}

inline double CMath::Sine(const double& value)
{
  return(::sin(value));
}

inline double CMath::SquareRoot(const double& value)
{
  return(::sqrt(value));
}

// End of the inline functions

class CEarthCoordinate
{
  // This is a Cartesian coordinate (Earth Centered, Earth Fixed)

protected:

  double m_X_CoordinateInMeters; // Positive points to intersection of the Prime Meridian and the equator
  double m_Y_CoordinateInMeters; // Positive points to the intersection of 90 degrees east of Prime Meridian and the equator
  double m_Z_CoordinateInMeters; // Positive points to the North Pole, Negative towards the South Pole

public:

  CEarthCoordinate();
  CEarthCoordinate(const CEarthCoordinate& source);
  ~CEarthCoordinate();

  void   Copy(const CEarthCoordinate& source);
  void   Get(double& x_coordinate,double& y_coordinate,double& z_coordinate) const;
  double GetXCoordinateInMeters(void) const;
  double GetYCoordinateInMeters(void) const;
  double GetZCoordinateInMeters(void) const;
  void   Set(double x_coordinate,double y_coordinate,double z_coordinate);
  void   SetXCoordinateInMeters(double x_coordinate);
  void   SetYCoordinateInMeters(double y_coordinate);
  void   SetZCoordinateInMeters(double z_coordinate);

  CEarthCoordinate& operator = (const CEarthCoordinate& source);
};

class CPolarCoordinate
{
protected:

  double m_UpDownAngleInDegrees; // Polar Angle, Phi
  double m_LeftRightAngleInDegrees; // Equatorial Angle, Theta
  double m_DistanceFromSurfaceInMeters;

public:

  CPolarCoordinate();
  CPolarCoordinate(const CPolarCoordinate& source);
  ~CPolarCoordinate();

  void   Copy(const CPolarCoordinate& source);
  void   Get(double& up_down_angle,double& left_right_angle,double& distance_from_surface) const;
  double GetUpDownAngleInDegrees(void) const;
  double GetLeftRightAngleInDegrees(void) const;
  double GetDistanceFromSurfaceInMeters(void) const;
  void   Set(double up_down_angle,double left_right_angle,double distance_from_surface);
  void   SetUpDownAngleInDegrees(double up_down_angle);
  void   SetLeftRightAngleInDegrees(double left_right_angle);
  void   SetDistanceFromSurfaceInMeters(double distance_from_surface);

  CPolarCoordinate& operator = (const CPolarCoordinate& source);
};

class CEarth
{
protected:

  // These are the magic numbers. They are the "real" data. They are facts,
  // measurements. Everything else about an ellipse is derived (or computed from)
  // these two data items.

  double m_PolarRadiusInMeters;
  double m_EquatorialRadiusInMeters;

  // Here be the things that can be derived from our hard data.
  // We compute these values using the two pieces of data that we
  // know about the ellipse.

  double m_Flattening;
  double m_EccentricitySquared;

  // Here's stuff specific to the C++ class

  int m_EllipsoidID;

  void m_ComputeFlattening( void );
  void m_ComputeEccentricitySquared( void );
  void m_Initialize( void );
      
public:

  enum _EllipsoidType
  {
    Unknown,
    Perfect_Sphere,
    Airy,
    Austrailian_National,
    Bessell_1841,
    Bessel_1841_Nambia,
    Clarke_1866,
    Clarke_1880,
    Everest,
    Fischer_1960_Mercury,
    Fischer_1968,
    GRS_1967,
    GRS_1980,
    Helmert_1906,
    Hough,
    International,
    Krassovsky,
    Modified_Airy,
    Modified_Everest,
    Modified_Fischer_1960,
    South_American_1969,
    Topex_Poseidon_Pathfinder_ITRF,
    WGS_60,
    WGS_66,
    WGS_72,
    WGS_84,
    Custom
  }
  ELLIPSOIDS;

  enum _DatumTypes
  {
    NAD_27 = Clarke_1866,
    Tokyo  = Bessell_1841,
  }
  DATUMS;

  CEarth(int ellipsoid = WGS_84); // Default constructor sets WGS 84 model
  ~CEarth();

  virtual void   AddLineOfSightDistanceAndDirectionToCoordinate(const CPolarCoordinate& point_1,double distance,double direction,CPolarCoordinate& point_2,double height_above_surface_of_point_2 = 0.0);
  virtual void   AddSurfaceDistanceAndDirectionToCoordinate(const CEarthCoordinate& point_1,double distance,double direction,CEarthCoordinate& point_2);
  virtual void   AddSurfaceDistanceAndDirectionToCoordinate(const CEarthCoordinate& point_1,double distance,double direction,CPolarCoordinate& point_2);
  virtual void   AddSurfaceDistanceAndDirectionToCoordinate(const CPolarCoordinate& point_1,double distance,double direction,CEarthCoordinate& point_2);
  virtual void   AddSurfaceDistanceAndDirectionToCoordinate(const CPolarCoordinate& point_1,double distance,double direction,CPolarCoordinate& point_2);
  virtual void   Convert(const CEarthCoordinate& cartesian_coordinate,CPolarCoordinate& polar_coordinate) const;
  virtual void   Convert(const CPolarCoordinate& polar_coordinate,CEarthCoordinate& cartesian_coordinate) const;
  virtual double GetDistanceToHorizon(const CEarthCoordinate& point_1) const;
  virtual double GetDistanceToHorizon(const CPolarCoordinate& point_1) const;
  virtual double GetEquatorialRadiusInMeters(void) const;
  virtual double GetPolarRadiusInMeters(void) const;
  virtual double GetLineOfSightDistanceFromCourse(const CEarthCoordinate& current_location,const CEarthCoordinate& point_a,const CEarthCoordinate& point_b) const;
  virtual double GetLineOfSightDistance(const CEarthCoordinate& point_1,const CEarthCoordinate& point_2) const;
  virtual double GetLineOfSightDistance(const CPolarCoordinate& point_1,const CEarthCoordinate& point_2) const;
  virtual double GetLineOfSightDistance(const CEarthCoordinate& point_1,const CPolarCoordinate& point_2) const;
  virtual double GetLineOfSightDistance(const CPolarCoordinate& point_1,const CPolarCoordinate& point_2) const;
  virtual double GetSurfaceDistance(const CEarthCoordinate& point_1,const CEarthCoordinate& point_2,double * heading_from_point_1_to_point_2 = 0,double * heading_from_point_2_to_point_1 = 0) const;
  virtual double GetSurfaceDistance(const CEarthCoordinate& point_1,const CPolarCoordinate& point_2,double * heading_from_point_1_to_point_2 = 0,double * heading_from_point_2_to_point_1 = 0) const;
  virtual double GetSurfaceDistance(const CPolarCoordinate& point_1,const CEarthCoordinate& point_2,double * heading_from_point_1_to_point_2 = 0,double * heading_from_point_2_to_point_1 = 0) const;
  virtual double GetSurfaceDistance(const CPolarCoordinate& point_1,const CPolarCoordinate& point_2,double * heading_from_point_1_to_point_2 = 0,double * heading_from_point_2_to_point_1 = 0) const;
  virtual void   SetEllipsoid(int ellipsoid );
  virtual void   SetEllipsoidByRadii(double equatorial_radius,double polar_radius);
  virtual void   SetEllipsoidByEquatorialRadiusAndFlattening(double equatorial_radius,double flattening);
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -