bountinbox 检测 呵呵,从没有写过这么经典的代码

#include <iostream> #include <stdio.h> using namespace std; typedef struct { float x,y,z; }VECTOR3; typedef struct { VECTOR3 vmin; VECTOR3 vmax; }Box; int Cross_X ( Box * A, Box * B ); int Cross_Y ( Box * A, Box * B ); int Cross_Z ( Box * A, Box * B ); int Cross_Y_Z ( Box * A, Box * B ); int collision_BoundingBox(Box * A, Box * B) { cout << "A: "<<A->vmax .x << " " <<A->vmax .y << " " << A->vmax .z << "/t"<<A->vmin .x << " " <<A->vmin .y << " " << A->vmin .z <<endl; cout << "B: "<<B->vmax .x << " " <<B->vmax .y << " " << B->vmax .z << "/t"<<B->vmin .x << " " <<B->vmin .y << " " << B->vmin .z <<endl; switch( Cross_X (A,B) )//x 轴 { case 10://X 交叉 switch ( Cross_Y_Z(A,B) ) { case 1: cout <<" 方叉 "<< endl; return 1; case 2: cout <<" 方叉 "<< endl; return 1; case 3: cout <<" 方叉 "<< endl; return 1; case 4: cout <<" 方叉 "<< endl; return 1; case 5: cout <<" 没有碰撞 "<< endl; return 5; } break; case 20: switch ( Cross_Y_Z (A,B) ) { case 1: cout <<" 方叉 "<< endl; return 1; case 2: cout <<" X-Y-Z:A 在 B 的里面 "<< endl; return 2; case 3: cout <<" X-Y-Z:B 方叉 "<< endl; return 1; case 4: cout <<" X-Y-Z:表面 "<< endl; return 1; case 5: cout <<" 没有碰撞 "<< endl; return 5; } break; case 30: switch ( Cross_Y_Z (A,B) ) { case 1: cout <<" 方叉 "<< endl; return 1; case 2: cout <<" 方叉 "<< endl; return 1; case 3: cout <<" X-Y-Z:B 在 A 的里面 "<< endl; return 3; case 4: cout <<" 方叉 "<< endl; return 1; case 5: cout <<" 没有碰撞 "<< endl; return 5; } break; case 40: switch ( Cross_Y_Z (A,B) ) { case 1: cout <<" X-Y-Z: 表面碰撞 "<< endl; return 4; case 2: cout <<" X-Y-Z: 表面碰撞 "<< endl; return 4; case 3: cout <<" X-Y-Z: 表面碰撞 "<< endl; return 4; case 4: cout <<" X-Y-Z: 表面碰撞"<< endl; return 4; case 5: cout <<" X-Y-Z:没有碰撞 "<< endl; return 5; } break; case 50: switch ( Cross_Y_Z (A,B) ) { case 1: cout <<" 表面碰撞 "<< endl; return 5; case 2: cout <<" 表面碰撞 "<< endl; return 5; case 3: cout <<" 表面碰撞 "<< endl; return 5; case 4: cout <<" 表面碰撞 "<< endl; return 5; case 5: cout <<" 没有碰撞 "<< endl; return 5; } break; } } int Cross_X ( Box * A, Box * B ) { float A_X_min = ::min (A->vmax .x ,A->vmin .x); float A_X_max = ::max (A->vmax .x ,A->vmin .x); float A_Y_min = ::min (A->vmax .y ,A->vmin .y); float A_Y_max = ::max (A->vmax .y ,A->vmin .y); float A_Z_min = ::min (A->vmax .z ,A->vmin .z); float A_Z_max = ::max (A->vmax .z ,A->vmin .z); float B_X_min = ::min (B->vmax .x ,B->vmin .x); float B_X_max = ::max (B->vmax .x ,B->vmin .x); float B_Y_min = ::min (B->vmax .y ,B->vmin .y); float B_Y_max = ::max (B->vmax .y ,B->vmin .y); float B_Z_min = ::min (B->vmax .z ,B->vmin .z); float B_Z_max = ::max (B->vmax .z ,B->vmin .z); if ( A_X_max > B_X_min && A_X_min < B_X_min ) //交叉 { cout << " X: 交叉 " << endl; return 10; }else if ( A_X_max > B_X_max && A_X_min < B_X_min ) //交叉 { cout << " X: 交叉 " << endl; return 10; }else if ( A_X_min >= B_X_min && A_X_max <= B_X_max )//A 在 B 的里面 { cout << " X: A 在 B 里面 " << endl; return 20; } if ( A_X_min <= B_X_min && A_X_max >= B_X_max ) //B 在 A 的里面 { cout << " X: B 在 A 里面 " << endl; return 30; } if ( A_X_min == B_X_max ) //刚好碰撞 { return 40; } if ( A_X_max == B_X_min ) //刚好碰撞 { return 40; } if ( A_X_max < B_X_min || A_X_min > B_X_max ) //不存在交叉 { return 50; } } //在Y轴检测 int Cross_Y ( Box * A, Box * B ) { float A_X_min = ::min (A->vmax .x ,A->vmin .x); float A_X_max = ::max (A->vmax .x ,A->vmin .x); float A_Y_min = ::min (A->vmax .y ,A->vmin .y); float A_Y_max = ::max (A->vmax .y ,A->vmin .y); float A_Z_min = ::min (A->vmax .z ,A->vmin .z); float A_Z_max = ::max (A->vmax .z ,A->vmin .z); float B_X_min = ::min (B->vmax .x ,B->vmin .x); float B_X_max = ::max (B->vmax .x ,B->vmin .x); float B_Y_min = ::min (B->vmax .y ,B->vmin .y); float B_Y_max = ::max (B->vmax .y ,B->vmin .y); float B_Z_min = ::min (B->vmax .z ,B->vmin .z); float B_Z_max = ::max (B->vmax .z ,B->vmin .z); if ( A_Y_max > B_Y_min && A_Y_min < B_Y_min ) //交叉 { return 10; }else if ( A_Y_max > B_Y_max && A_Y_min < B_Y_min ) //交叉 { return 10; }else if ( A_Y_min >= B_Y_min && A_Y_max <= B_Y_max )//A 在 B 的里面 { return 21; } if ( A_Y_min <= B_Y_min && A_Y_max >= B_Y_max ) //B 在 A 的里面 { cout << " Y: B 在 A 里面 " << endl; return 31; } if ( A_Y_min == B_Y_max ) //刚好碰撞 { return 41; } if ( A_Y_max == B_Y_min ) //刚好碰撞 { return 41; } if ( A_Y_max < B_Y_min || A_Y_min > B_Y_max ) //不存在交叉 { return 51; } } int Cross_Z ( Box * A, Box * B ) { float A_X_min = ::min (A->vmax .x ,A->vmin .x); float A_X_max = ::max (A->vmax .x ,A->vmin .x); float A_Y_min = ::min (A->vmax .y ,A->vmin .y); float A_Y_max = ::max (A->vmax .y ,A->vmin .y); float A_Z_min = ::min (A->vmax .z ,A->vmin .z); float A_Z_max = ::max (A->vmax .z ,A->vmin .z); float B_X_min = ::min (B->vmax .x ,B->vmin .x); float B_X_max = ::max (B->vmax .x ,B->vmin .x); float B_Y_min = ::min (B->vmax .y ,B->vmin .y); float B_Y_max = ::max (B->vmax .y ,B->vmin .y); float B_Z_min = ::min (B->vmax .z ,B->vmin .z); float B_Z_max = ::max (B->vmax .z ,B->vmin .z); if ( A_Z_max > B_Z_min && A_Z_min < B_Z_min ) //交叉 { return 12; }else if ( A_Z_max > B_Z_max && A_Z_min < B_Z_min ) //交叉 { return 12; }else if ( A_Z_min >= B_Z_min && A_Z_max <= B_Z_max )//A 在 B 的里面 { return 22; } if ( A_Z_min <= B_Z_min && A_Z_max >= B_Z_max ) //B 在 A 的里面 { cout << " Z: B 在 A 里面 " << endl; return 32; } if ( A_Z_min == B_Z_max ) //刚好碰撞 { return 42; } if ( A_Z_max == B_Z_min ) //刚好碰撞 { return 42; } if ( A_Z_max < B_Z_min || A_Z_min > B_Z_max ) //不存在交叉 { return 52; } } int Cross_Y_Z ( Box * A, Box * B )//在X _ Y 平面投影 { switch( Cross_Y (A,B) ) { case 11: switch( Cross_Z (A,B)) { case 12: cout << " Y_Z面投影 :交叉 "<<endl; return 1; // Y_Z 现y z 投影交叉 case 22: cout << " Y_Z面投影 : A 在 B 里面"<<endl; return 1;// Y_Z 现y z 投影交叉 case 32: cout << " Y_Z面投影 :B 在 A 里面 "<<endl; return 1;// Y_Z 现y z 投影交叉 case 42: cout << " Y_Z面投影 :交叉 "<<endl; return 1;//立方体存在交叉 case 52: cout << " Y_Z面投影 :没有碰撞 "<<endl; return 5;//立方体存在交叉 } break; case 21: switch( Cross_Z (A,B)) { case 12: cout << " Y_Z面投影 :交叉 "<<endl; return 1; // Y_Z 现y z 投影交叉 case 22: cout << " Y_Z面投影 :A 在 B 里面 "<<endl; return 2;// A 在 B 的里面 case 32: cout << " Y_Z面投影 :交叉 "<<endl; return 1;// Y_Z 现y z 投影交叉 case 42: cout << " Y_Z面投影 :交叉 "<<endl; return 1;//立方体存在交叉 case 52: cout << " Y_Z面投影 :没有碰撞 "<<endl; return 5;//立方体存在交叉 } break; case 31: switch( Cross_Z (A,B)) { case 12: cout << " 交叉 "<<endl; return 1; // Y_Z 现y z 投影交叉 case 22: cout << " 交叉 "<<endl; return 1;// Y_Z 现y z 投影交叉 case 32: cout << " Y_Z面投影: A 在 B 里面 "<<endl; return 3;// B 在 A 的里面 case 42: cout << " Y_Z面投影: B 在 A 里面 "<<endl; return 1 ;//立方体存在交叉 case 52: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 } break; case 41: switch( Cross_Z (A,B)) { case 12: cout << " 交叉 "<<endl; return 1; // Y_Z 现y z 投影交叉 case 22: cout << " 交叉 "<<endl; return 1;// Y_Z 现y z 投影交叉 case 32: cout << " 交叉 "<<endl; return 1;// B 在 A 的里面 case 42: cout << " 交叉 "<<endl; return 4;//立方体存在交叉 case 52: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 } break; case 51: switch( Cross_Z (A,B)) { case 12: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 case 22: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 case 32: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 case 42: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 case 52: cout << " 没有碰撞 "<<endl; return 5;//立方体存在交叉 break; } break; } } int main() { Box * a , *b; a = new Box; b = new Box; int g ; g = 2; switch(g) { case 0: //A 在 B 里面 a->vmax.x = 2; a->vmax.y = 2; a->vmax.z = 2; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 1: //B 在 A 里面 a->vmax.x = 4; a->vmax.y = 4; a->vmax.z = 5; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 2: //X 轴 表面 A 左 B 右 a->vmax.x = 2; a->vmax.y = 2; a->vmax.z = 2; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 6; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 2; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 3: //X 轴 表面 A 右 B 左 a->vmax.x = 5; a->vmax.y = 2; a->vmax.z = 2; a->vmin.x = 4; a->vmin.y = 1; a->vmin.z = 3; b->vmax.x = 4; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 4: //在 Y 轴 刚好碰到 A 上 B 在 下 a->vmax.x = 12; a->vmax.y = 4; a->vmax.z = 5; a->vmin.x = 5; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 5; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = -1 ; b->vmin.z = -1 ; break; case 5: a->vmax.x = 2; a->vmax.y = 2; a->vmax.z = 2; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 6: a->vmax.x = 4; a->vmax.y = 4; a->vmax.z = 5; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 7: a->vmax.x = 2; a->vmax.y = 2; a->vmax.z = 2; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; case 8: a->vmax.x = 4; a->vmax.y = 4; a->vmax.z = 5; a->vmin.x = 1; a->vmin.y = 1; a->vmin.z = 1; b->vmax.x = 3; b->vmax.y = 3; b->vmax.z = 3; b->vmin.x = 1; b->vmin.y = 1 ; b->vmin.z = 1 ; break; } switch (collision_BoundingBox(a,b)) { case 1: cout << " BoundingBox:交叉 "<<endl; break; case 2: cout << " BoundingBox:A 在 B 里面 "<<endl; break; case 3: cout << " BoundingBox:B 在 A 的里面 "<<endl; break; case 4: cout << " BoundingBox:表面碰撞"<<endl; break; case 5: cout << " BoundingBox:没有碰撞"<<endl; break; } ::getchar (); } 

你可能感兴趣的:(bountinbox 检测 呵呵,从没有写过这么经典的代码)