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

📄 common.h

📁 用匈牙利算法解决二部图的最优匹配问题,可用于多任务的指派问题的解决.
💻 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 + -