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

📄 common_math.h

📁 matlab一些常用的处理模块
💻 H
字号:
/****************************************************************************** * 光学字符识别程序 * 文件名:common_math.h * 功能  :通用的数学函数 * modified by PRTsinghua@hotmail.com******************************************************************************/#ifndef COMMON_MATH_H#define COMMON_MATH_H#include <math.h>#include <limits.h>#include <float.h>#include <complex>using std::min;using std::complex;// 检查两个浮点数是否相等inline bool is_equal( float x, float y ){	return fabs( x - y ) < 100.0 * FLT_EPSILON;}// 检验一个浮点数是否为0inline bool is_null( float x ){	return is_equal( x, 0 );}// 考虑机器精度inline bool specify( float &x, float y ){	if ( is_equal( x, y ) ) 	{		x = y;		return true;	}	return false;}// 转换弧度为角度inline double radtodeg( double rad ){	return 180*rad / M_PI;}// 转换角度到弧度inline double degtorad( double deg ){	return M_PI * deg/180;}// 归一化角度inline double normalize_angle_2pi( double rad ){	register double res = fmod( rad, 2*M_PI );		if( res < 0 )		res += 2*M_PI;		return res;}// 归一化角度inline double normalize_angle_pi( double rad ){	register double res = fmod( rad, 2*M_PI );		if( res < -M_PI )		res += 2*M_PI;	else if( res > M_PI )		res -= 2*M_PI;	return res;}// 归一化角度inline double normalize_line_angle( double rad ){	register double res = fmod( rad, M_PI );		if( res < -M_PI/2 )		res += M_PI;	else if( res > M_PI/2 )		res -= M_PI;	return res;}// 归一化角度inline double normalize_inner_angle( double rad ){	register double inner_angle = normalize_angle_2pi( rad );		if( inner_angle > M_PI )		inner_angle = 2*M_PI-inner_angle;		return inner_angle;}// 归一化角度inline double normalize_straight_line_angle( double rad ){	register double inner_angle = normalize_angle_2pi( rad );		if( inner_angle >= M_PI )		inner_angle -= M_PI;		return inner_angle;}// 计算角度差inline float min_angle_between( float angle1, float angle2, float periodicity ){	return angle2 > angle1 ? min( angle2 - angle1, angle1 - angle2 + periodicity)			       : min( angle1 - angle2, angle2 - angle1 + periodicity);}// 计算线性方程的参数inline void straight_line_params( float x1, float y1, float x2, float y2, float &A, float &B, float &C ){	A = y1 - y2;	B = x2 - x1;	C = -x1*A - y1*B;}// 计算线性方差参数 (Ax+By+C=0)inline int intersect_lines( float x1,  float y1, float x2, float y2,			    float X1,  float Y1, float X2, float Y2,			    float &x0, float &y0){	float A1, B1, C1, A2, B2, C2;	straight_line_params( x1, y1, x2, y2, A1, B1, C1 );	straight_line_params( X1, Y1, X2, Y2, A2, B2, C2 );		float divisor = A1*B2 - A2*B1;		if( is_null( divisor ) )		return -1;	if( is_null( A1*X1 + B1*Y1 + C1 ) && is_null( A1*X2 + B1*Y2 + C1 ) )		return 1;		x0 = static_cast<float>( B1*C2 - B2*C1 ) / divisor;	y0 = static_cast<float>( C1*A2 - C2*A1 ) / divisor;	return 0;}// 返回x的signumtemplate<class T> inline int signum( T x ){	if( x < 0 )		return -1;		else if( x > 0 )		return 1;		return 0;}// 强制数值到某个范围中inline bool assure_range( float lower_boundary, float upper_boundary, float &value ){	if( value > upper_boundary )		value = upper_boundary;		else if( value < lower_boundary )		value = lower_boundary;		else		return true;		return false;}// 保证范围inline bool assure_range( int lower_boundary, int upper_boundary, int &value ){	float fvalue = static_cast<float>( value );		bool retval = assure_range( static_cast<float>( lower_boundary ), static_cast<float>( upper_boundary ), fvalue );	value = static_cast<int>( fvalue );		return retval;}// 计算点 (x1,y1) 到点 (x2,y2) 的欧几里得距离,T为实数或浮点数template<class T> inline float euklidian_distance( T x1, T y1, T x2, T y2 ){	register T dx = x1 - x2;	register T dy = y1 - y2;	return sqrt( dx*dx + dy*dy );}// 判断点 (x,y) 是否在线段 (p1_x,p1_y) - (p2_x,p2_y) 上template<class T> inline bool is_part_of( T p1_x,T p1_y, T p2_x,T p2_y, T x,T y ){	return	euklidian_distance( p1_x, p1_y, x, y ) + euklidian_distance( p2_x, p2_y, x, y ) <		euklidian_distance( p1_x, p1_y, p2_x, p2_y ) + FLT_EPSILON*10.0;}	// 计算线段 ((x1,y1),(x2,y2)) 与 ((x2,y2),(x3,y3))之间的角度template<class T> float angle_between( T x1, T y1, T x2, T y2, T x3, T y3 ){	complex<float> v1( x3-x2, y3-y2 ), v2( x1-x2, y1-y2 );	return normalize_angle_pi( arg( v2 ) - arg( v1 ) );}#endif

⌨️ 快捷键说明

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