|
// 首先我要记下凸多边形的边界坐标 float poly[2][8] = { { 6.0f , 2.0f , 4.0f , 8.0f , 14.0f , 18.0f , 14.0f , 6.0f } , // 所有点的x分量,最后一个点和第一个点重合 { 2.0f , 6.0f , 10.0f , 14.0f , 12.0f , 8.0f , 4.0f , 2.0f } // 所有点的y分量 } ; // 定义一些变量 float x,y ; // 这是质点的位置变量 float vx , vy ; // 质点的速度向量分量
// 好,开始编写碰撞检测函数 bool CollisionTest() { // 当发生碰撞时返回true,否则返回false
float s , t ; // 线段方程的两个参数 // 各个参量 float x_v1 , x_v2 , y_v1 , y_v2 ; float x_v2b , x_v1b , y_v2b , y_v1b ;
for( int i = 0 ; i < 8-1 ; ++i ) { // 循环到倒数第二个点
// 障碍线段 x_v1 = poly[0][i+1]-poly[0][i] ; y_v1 = poly[1][i+1]-poly[1][i] ; // 物体速度向量 x_v2 = vx ; y_v2 = vy ; // 障碍向量初始点 x_v1b = poly[0][i] ; y_v1b = poly[1][i] ; // 物体位置 x_v2b = x ; y_v2b = y ; // 计算d,d1和d2 // | x_v1 -x_v2 | //d = | y_v1 -y_v2 | // | x_v2b-x_v1b -x_v2 | //d1 = | y_v2b-y_v1b -y_v2 | // | x_v1 x_v2b-x_v1b | //d2 = | y_v1 y_v2b-y_v1b |
d = (x_v1*(-y_v2))-((-x_v2)*y_v1) ; d1 = ((x_v2b-x_v1b)*(-y_v2))-((-x_v2)*(y_v2b-y_v1b)) ; d2 = (x_v1*(y_v2b-y_v1b))-((x_v2b-x_v1b)*y_v1) ;
// 判断d是否为零 if( abs(d) < 0.001f ) // 如果等于零做近似处理,abs()用于求绝对值 d = 0.001f ;
// 计算参量s,t s = d1/d ; t = d2/d ; // 判断是否发生碰撞 // 如果发生了就返回true if( 0.0f <= s && 1.0f >= s && 0.0f <= t && 1.0f >= t ) return true ;
} // for( int i = 0 ; i < 8-1 ; ++i )
// 没有发生碰撞,返回false return false ;
} // end of function
// 现在对函数做测试 // 初始化质点 x = 10.0f , y = 8.0f ; vx = vy = (float)(rand()%4+1) ;
// 进入主循环中 // 假设现在已经在主循环中 if( CollisionTest() ) { // 如果物体与质点发生碰撞 x = 10.0f , y = 8.0f ; vx = vy = (float)(rand()%4+1) ; } // 质点移动 x+=vx ; y+=vy ;
|