You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 lines
3.5 KiB
C++

2 years ago
#include "stdafx.h"
#include "angle.h"
#include "math.h"
#define _USE_MATH_DEFINES // ʹ<><CAB9>math.h<>е<EFBFBD>M_PI<50><EFBFBD><EAB6A8><EFBFBD><EFBFBD>Ҫ
const double EPSILON=1.0E-12;
const double PI = M_PI;
Angle::Angle(void)
{
}
Angle::~Angle(void)
{
}
//<2F><> ת <20>ȷ<EFBFBD><C8B7><EFBFBD>
void Angle::DegtoDms(double deg, int &d, int &m, double &s)
{
d = int(deg + EPSILON);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
double dTmp = (deg - d) * 60;//С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ɷ<EFBFBD>
m = int(dTmp+ EPSILON);//ȡ<>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
s = (dTmp - m) * 60;//<2F><>ȡ<EFBFBD><C8A1>
}
//<2F>Ƕ<EFBFBD> ת<><D7AA><EFBFBD><EFBFBD>
void Angle::DegtoRad(double deg, double &rad)
{
rad = deg * PI/180;
}
//<2F>Ƕ<EFBFBD> ת ʮ<><CAAE><EFBFBD>ƶ<EFBFBD>
void Angle::DegtodDeg(double deg, int &d, double &m)
{
d = int(deg + EPSILON);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶ<EFBFBD>
m = (deg - d) * 60;//С<><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD>ɷ<EFBFBD>
}
// <20>ȷ<EFBFBD><C8B7><EFBFBD> ת <20><>
void Angle::DmstoDeg(int d, int m, double s, double &deg)
{
deg = d + (m / 60.0) + (s / 3600.0);
}
//<2F>ȷ<EFBFBD><C8B7><EFBFBD> ת ʮ<><CAAE><EFBFBD>ƶ<EFBFBD>
void Angle::DmstodDeg(int d, int m, double s, int &dDeg, double &dm)
{
dDeg = d;
dm = m + s/60;
}
string Angle::DoubleToString(double num,int precision)
{
char tmp[10];
sprintf_s(tmp,"%d",precision);
string str_p = tmp;
string format = "%." + str_p + "f";
char buffer[20];
sprintf_s(buffer,format.data(),num);
string str = buffer;
return str;
}
string Angle::IntToString(int num)
{
char tmp[100];
sprintf_s(tmp,"%d",num);
string str = tmp;
return str;
}
//<2F>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ָ<D6B8><EEBAAF>
vector<string> Angle::split(string str, string pattern)
{
/*
string::size_type pos;
vector<string> result;
str += pattern;//<2F><>չ<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int size = str.size();
for (int i = 0; i < size; i++)
{
pos = str.find(pattern, i);
if (pos < size)
{
string s = str.substr(i, pos - i);
result.push_back(s);
i = pos + pattern.size() - 1;
}
}
return result;*/
char *ptr;
char *buf;
ptr = strtok_s((char*)str.data(),pattern.data(),&buf);
string tmp;
vector<string> vec_str;
while(ptr != NULL)
{
tmp = ptr;
vec_str.push_back(tmp);
ptr = strtok_s(NULL, pattern.data(), &buf);
}
return vec_str;
}
// wstring=>string
std::string Angle::WString2String(const std::wstring &ws)
{
std::string strLocale = setlocale(LC_ALL, "");
const wchar_t *wchSrc = ws.c_str();
size_t nDestSize = wcstombs(NULL, wchSrc, 0) + 1;
char *chDest = new char[nDestSize];
memset(chDest, 0, nDestSize);
wcstombs(chDest, wchSrc, nDestSize);
std::string strResult = chDest;
delete[] chDest;
setlocale(LC_ALL, strLocale.c_str());
return strResult;
}
// string => wstring
std::wstring Angle::String2WString(const std::string &s)
{
std::string strLocale = setlocale(LC_ALL, "");
const char *chSrc = s.c_str();
size_t nDestSize = mbstowcs(NULL, chSrc, 0) + 1;
wchar_t *wchDest = new wchar_t[nDestSize];
wmemset(wchDest, 0, nDestSize);
mbstowcs(wchDest, chSrc, nDestSize);
std::wstring wstrResult = wchDest;
delete[] wchDest;
setlocale(LC_ALL, strLocale.c_str());
return wstrResult;
}
void Angle::getDMSString(double lon,double lat,string &str_lon,string &str_lat)
{
std::string dSymbol = "<EFBFBD><EFBFBD>";
std::string mSymbol = "<EFBFBD><EFBFBD>";
std::string sSymbol = "\"";
int lon_d,lon_m,lat_d,lat_m;
double lon_s,lat_s;
DegtoDms(lon,lon_d,lon_m,lon_s);
DegtoDms(lat,lat_d,lat_m,lat_s);
string str_lat_s = DoubleToString(lat_s,4);
string str_lon_s = DoubleToString(lon_s,4);
str_lon = IntToString(lon_d) + dSymbol + IntToString(lon_m) + mSymbol + str_lon_s + sSymbol;
str_lat = IntToString(lat_d) + dSymbol + IntToString(lat_m) + mSymbol + str_lat_s + sSymbol;
}