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

📄 imath.cpp

📁 liu7788414
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/*

int GetYOrient(const Vector4s *Src,const Vector4s *Dest)
{
  return Atan2i(Dest->z - Src->z, Dest->x - Src->x);
}

int GetXOrient(const Vector4s *Src,const Vector4s *Dest)
{
    Vector4s distVector = *Dest - *Src;
    int nXZLength= FSqrt(distVector.x * distVector.x + distVector.z * distVector.z);
    return Atan2i(nXZLength, distVector.y);
}*/

int AngleDiff(int SrcAngle, int TargetAngle)
{
  int Delta = (TargetAngle - SrcAngle) & ANGLEMASK;
  if (Delta > (ANGLE2PI/2))
    Delta -= ANGLE2PI;
  return Delta;
}

// return B with (1 << B) == A
int Log2(int a)
{
  int b = 0;
  while ((1<<b) <= a)
    b++;
  return b;
}


// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
int GetFovFromXAngle(int in_nXAngle)
{
    in_nXAngle>>=1;
    SYS_ASSERT(0 < in_nXAngle && in_nXAngle < PGL_PI);
    // tan
    int nTan = (Sinus(in_nXAngle)<<COS_SIN_SHIFT)/Cosinus(in_nXAngle);
    return ((RENDER_WIDTH>>1)<<COS_SIN_SHIFT)/nTan;
}

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
int GetFovFromYAngle(int in_nYAngle)
{
    in_nYAngle>>=1;
    SYS_ASSERT(0 < in_nYAngle && in_nYAngle < PGL_PI);
    // tan
    int nTan = (Sinus(in_nYAngle)<<COS_SIN_SHIFT)/Cosinus(in_nYAngle);
    return ((RENDER_HEIGHT>>1)<<COS_SIN_SHIFT)/nTan;
}

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
int GetXAngleFromFov(int in_nFov)
{
    return Atan2i(in_nFov, RENDER_WIDTH>>1)<<1;
}

// ---------------------------------------------------------------------------
//
// ---------------------------------------------------------------------------
int GetYAngleFromFov(int in_nFov)
{
    return Atan2i(in_nFov, RENDER_HEIGHT>>1)<<1;
}






#if CHECK_MATH

#include <limits.h>
#include <assert.h>

volatile static bool _disable = false;

// ---------------------------------------------------------------------------
//	Used bu debug macros CHK_MULT and CHK_LIMITS; see Defines.h
// ---------------------------------------------------------------------------
void _Check_Int_Limit(double x)
{

	if(!_disable)
	{
		SYS_ASSERT(x <= double(INT_MAX) && x >= double(INT_MIN));
	}

}


void _Check_Short_Limit(double x)
{
	if(!_disable)
	{
		SYS_ASSERT(x <= double(SHRT_MAX) && x >= double(SHRT_MIN));
	}
}





void _Check_Precision(double fResult, int nResult, double fTolerancePercentage)
{
    double fError = fResult - nResult;
    if (fError < 0) fError = -fError;
    double fTolerance = fTolerancePercentage*fResult/100;
    if (fTolerance < 0) fTolerance = -fTolerance;
    SYS_ASSERT(int(fError) <= int(fTolerance)); // always tolerate decimal error
}

#endif //#if CHECK_MATH









int fMul( int a, int b ) 
{
    if ( a >= 0 )
        return ( (a >> 12) * b ) + ( ((a & 0xfff) * b) >> 12 );
    else
        return  -( ((-a) >> 12) * b + ((((-a) & 0xfff) * b) >> 12) );
}

int fDiv( int a, int b ) 
{
    int         t, s;

    s = 1;
    if ( a < 0 ) {
        a = -a;
        s = -s;
    }
    if ( b < 0 ) {
        b = -b;
        s = -s;
    }

    if ( ( (b) >> 6 ) == 0 ) {
        t = FP_MAX_VALUE;
    } else {
        t = ( (a) << 6 ) / ( (b) >> 6 );
    }

    t *= s;

    return t;
}


int convertInto2048(int x, int y, int angle)
{
    if(x==0&&y==0)
    	angle = 0;
    if(x<=0&&y>=0)
    	angle = 1024 - angle;
    if(x<=0&&y<=0)
    	angle = 1024 + angle;
    if(x>=0&&y<=0)
    	angle = 2048 - angle;
    return angle;
}



int sqrt(int value)
{
	int  a, b;

    if ( value == 0 )
      return 0;

    a = value / 2;
    do
    {
      if(a==0)
      	return 1;
      b = ( value / a - a ) / 2;
      a = a + b;
    } while ( ( b > 1 ) || ( b < -1 ) );

    return a;
}

int getSign(int value)
{
    int b = 0;
    if(value<0)
    	b = -1;
    if(value>0)
    	b = 1;
    return b;
}

int _rand(int min, int max)
{
	
	int random=rand();
	if( random < 0 )
		random = -random;
	return ((random%(max - min + 1)) + min);
}

int getRandomNumber(int range ) 
{
	return _rand(0, range);
}

int distanceP2P(int x1, int y1, int x2, int y2)
{
  	int dx = x2-x1;
	int dx2 = dx*dx;
  	int dy = y2-y1;
	int dy2 = dy*dy;
	int d2 = dx2+dy2;
  	int dis;

	if(dx2<0 || dy2<0 || d2<0)
	{
		d2 = (int)((unsigned int)(dx2) >> 2)+(int)((unsigned int)(dy2) >> 2);
		dis = sqrt(d2)<<1;
	}
	else
		dis = sqrt(d2);
  	return dis;
}

int distanceP2P(int x1, int y1, int z1, int x2, int y2, int z2) {
	int dx = x2 - x1;
	int dy = y2 - y1;
	int dz = z2 - z1;
	int dis = sqrt( (long) dx * dx + dy * dy + dz * dz);
	return dis;
}

int distanceP2L(int x1, int y1, int x2, int y2, int xp, int yp)
{
  	int dis;
	int d2  = distanceP2P(x1,y1,x2,y2);
	if(d2==0){
		dis = distanceP2P(x1,y1,xp,yp);
	}
	else{
  	 	dis = Abs((x2-x1)*(yp-y1)-(y2-y1)*(xp-x1))/d2;
	}
  	return dis;
}

⌨️ 快捷键说明

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