📄 common.h
字号:
#ifndef __COMMON_H__
#define __COMMON_H__
#include <cmath>
#include<windows.h>
class Vector;typedef double AngRad; /*!< Type definition for angles in degrees. */typedef double AngDeg; /*!< Type definition for angles in radians. */#define PI 3.14159265358979323846#define Sqr(x) ((x) * (x))#define round(x) ((x) > 0 ? int((x) + 0.5) : int((x) - 0.5))// auxiliary numeric functions for determining the// maximum and minimum of two given double values and the sign of a valuedouble Max (double x, double y);double Min (double x, double y);int Sign (double x);// auxiliary goniometric functions which enable you to// specify angles in degrees rather than in radiansAngDeg Rad2Deg (AngRad x);AngRad Deg2Rad (AngDeg x);double cosDeg (AngDeg x);double sinDeg (AngDeg x);double tanDeg (AngDeg x);AngDeg acosDeg (double x);AngDeg asinDeg (double x);AngDeg atanDeg (double x);AngDeg atan2Deg (double y, double x);// various goniometric functionsAngDeg angleIn (AngDeg ang, AngDeg angMin = -180, AngDeg angMax = 180);AngDeg bisectorTwoAngles (AngDeg angMin, AngDeg angMax);bool isAngInInterval (AngDeg ang, AngDeg angMin, AngDeg angMax);bool isDataInInterval (double x, double lower, double upper);
bool sameDist (double x, double y);
double constrain (double x, double lower, double upper);
double getDistance (double x, double y);
double getDistance (double x1, double y1, double x2, double y2);
Vector polar2Vector (double dMag, AngDeg ang);
double getSlope (double dDx, double dDy);
void Swap (double &x, double &y);
// 标准化角度(将角度划成0~360之间)
inline double NormalizeAngle360(double ang, double min = 0)//-180)
{
while (ang >= 360 + min)
ang -= 360;
while (ang < min)
ang += 360;
return ang;
}
// 标准化角度(将角度划成0~180之间)
inline double NormalizeAngle180(double ang)
{
while (ang >= 180)
ang -= 180;
while (ang < 0)
ang += 180;
return ang;
}
// 将角度限制在-180~~180之间
inline double angleIn180(double angle)
{
while (angle > 180)
angle -= 360;
while (angle < -180)
angle += 360;
return angle;
}
// 将角度限制在-90~~90之间
inline double angleIn90(double angle)
{
double ang = angleIn180(angle);
if (ang < -90)
ang += 180;
else if (ang > 90)
ang -= 180;
return ang;
}
// 将角度限制在-45~~45之间
inline double angleIn45(double angle)
{
double ang = angleIn90(angle);
if (ang > 45)
ang -= 90;
else if (ang < -45)
ang += 45;
return ang;
}
// Speed UP !!! 加速算法
inline void speedUp(double &pwm1, double &pwm2, double iPower = 127)
{
if(fabs(pwm1) > fabs(pwm2))
{
if(pwm1 > 0)
{
pwm2 = pwm2 * (iPower / pwm1);
pwm1 = iPower;
}
else if(pwm1 < 0)
{
pwm2 = pwm2 * (-iPower / pwm1);
pwm1 = -iPower;
}
}
else if(fabs(pwm1) < fabs(pwm2))
{
if(pwm2 > 0)
{
pwm1 = pwm1 * (iPower / pwm2);
pwm2 = iPower;
}
else if(pwm2 < 0)
{
pwm1 = pwm1 * (-iPower / pwm2);
pwm2 = -iPower;
}
}
else if(fabs(pwm1) == fabs(pwm2))
{
if(pwm1 > 0)
{
if(pwm1 == pwm2)
{
pwm1 = iPower;
pwm2 = iPower;
}
else
{
pwm1 = iPower;
pwm2 = -iPower;
}
}
else
{
if(pwm1 == pwm2)
{
pwm1 = -iPower;
pwm2 = -iPower;
}
else
{
pwm1 = -iPower;
pwm2 = iPower;
}
}
}
}
//用于四舍五入取整
inline int ConvertToInteger(double n)
{
int temp = (int) n;
if(n - temp >= 0.5)
{
return temp + 1;
}
else
{
return temp;
}
}
//用于黄金分割(golden section)取整
inline int CvertToIntegerGS(double n)
{
int temp = (int) n;
if(n - temp >= 0.618)
{
return temp + 1;
}
else
{
return temp;
}
}
//向上取整
inline int ConvertToMaxInteger(double n)
{
int temp = (int) n;
if(n - temp > 0.1)
{
return temp + 1;
}
else
{
return temp;
}
}
//交换两个数
inline void Exchange(int &num1, int &num2)
{
int temp = num1;
num1 = num2;
num2 = temp;
}
inline void Exchange(double &num1, double &num2)
{
double temp = num1;
num1 = num2;
num2 = temp;
}
//比较两个数的大小,并依次排序
inline void CompareTwoNumber(double &min, double &max)
{
if(min > max) Exchange(min, max);
}
inline void CompareTwoNumber(int &min, int &max)
{
if(min > max) Exchange(min, max);
}
inline double AverageRandom(double min, double max) //得到[min,max]中的平均分布随机数,精确到四位有效数字
{
if(fabs(min - max) < 0.0001)
{
return min;
}
CompareTwoNumber(min,max);
int MinInteger = (int) (min * 10000);
int MaxInteger = (int) (max * 10000);
int RandInteger = rand() * rand();
int DiffInteger = MaxInteger - MinInteger;
double ResultInteger = RandInteger % DiffInteger + MinInteger;
return ResultInteger/10000;
}
//将角度转化为[0,360](源自服务器源码)
inline double To360(double a)
{
return a -= (((int)((a-(a>=0?0:360))/360.))*360.);
}
class Timer
{
public:
Timer ();
void Start ();
double GetTime ();
private:
LARGE_INTEGER timerB;
LARGE_INTEGER timerE;
LARGE_INTEGER Frequency;
};
inline Timer::Timer()
{
QueryPerformanceFrequency(&Frequency);
}
inline void Timer::Start()
{
QueryPerformanceCounter(&timerB);
}
inline double Timer::GetTime()
{
QueryPerformanceCounter(&timerE);
return (double)(timerE.QuadPart - timerB.QuadPart) / (double)Frequency.QuadPart * 1000.0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -