下面是我看这本书中得到的一些比较有用的小技巧,在这里总结一下:
1.检测一个整形数是否为以2为底数的乘方
bool powOfTwo(int num){
return !(num&(num-1));
}
2.判断两条直线是否垂直(m1,m2为两条直线的斜率 斜率=(y2-y1)/(x2-x1))
if( m1 * m2 == –1 ) then 直线垂直
3.判断直线的交点个数(即解两直线组成的方程组的个数)
> 当两直线斜率不同时,有一组解
>当两直线斜率和截距都相同时,有无数组解
>当两直线斜率相同,而截距不同时,方程无解
4.通过VC编译器中的#pragma intrinsic(sqrt,sin,cos,tan…) 指令,可以大大提高这些函数的运行速度
5.检测两个球是否发生碰撞,可以比较两圆圆心之间的距离小于等于两圆半径之和,即检测sqrt((y2-y1)^2+(x2-x1)^2) <= r1+r2
为了提高速度可以写成,(y2-y1)^2 + (x2-x1)^2 <= (r1+r2)^2
6.三角函数使用技巧
>定义宏(const常量),如 const float PI = 3.141592654f
const float RadToDeg = 57.29577951f (弧度乘以这个因子,可以变成角度,如果写成 弧度*180/PI 速度慢,因为乘法比除法快)
const float DegToRad = 0.0017453293f(角度转弧度因子)
>建立三角函数对照表 方便快速查询 因为三角函数在计算机中的运行速度比较慢
float sin_table[360];
for (int i = 0;i<360;++i)
{
sin_table[i] = sin( i * DegToRad);
}
以后使用的时候,可以这样:float value = sin_table[ abs((int)angle) % 360]; 这些三解函数表在程序初使时建立好,
程序运行以后可以大大提高运算速度。
7.记住,电脑进行的每一步计算都会花去一定的时间,所以我们要尽量化简程序中的计算。在三角函数计算方便,可以多利用三角函数的
和差性质,单位圆性质等等
8.利用向量的点积:
>如果A.B = 0 那么A与B垂直 (2D空间中判断两向量垂直,只需要二次乘法和一次加法)
>如果A.B < 0 那么A与B的角度 > 90度
>如果A.B > 0 那么A与B的角度 < 90度
应用:检测物体是否在视野中,计算两向量之间的夹角:A.B = ||A||.||B||.cos@,求向量在另一个向量上的投影(如光源的投影)