参数为线段2断点坐标 //线段裁剪 int Clip_Line(int &iX1,int &iY1,int &iX2, int &iY2) { //点所在区域位标识 #define CLIP_CODE_C 0x0000 #define CLIP_CODE_N 0x0008 #define CLIP_CODE_S 0x0004 #define CLIP_CODE_E 0x0002 #define CLIP_CODE_W 0x0001 #define CLIP_CODE_NE 0x000a #define CLIP_CODE_SE 0x0006 #define CLIP_CODE_NW 0x0009 #define CLIP_CODE_SW 0x0005 int iXc1=iX1, iYc1=iY1, iXc2=iX2, iYc2=iY2; int p1_code=0, p2_code=0; //判断点所在位置并生成标识代码 if (iY1 < min_clip_y) p1_code|=CLIP_CODE_N; else if (iY1 > max_clip_y) p1_code|=CLIP_CODE_S; if (iX1 < min_clip_x) p1_code|=CLIP_CODE_W; else if (iX1 > max_clip_x) p1_code|=CLIP_CODE_E; if (iY2 < min_clip_y) p2_code|=CLIP_CODE_N; else if (iY2 > max_clip_y) p2_code|=CLIP_CODE_S; if (iX2 < min_clip_x) p2_code|=CLIP_CODE_W; else if (iX2 > max_clip_x) p2_code|=CLIP_CODE_E; //如果两个点的某个同一坐标分量所在的区间相同,直接返回。这里剔除了部分完全处在裁剪区域外的线段 if ((p1_code & p2_code)) return(0); //两点完全在裁剪区域内,不需要裁剪 if (p1_code==0 && p2_code==0) return(1); //根据点所在的区间重新计算裁剪后点的坐标 switch(p1_code) { case CLIP_CODE_C: break; case CLIP_CODE_N: { iYc1 = min_clip_y; iXc1 = ( int )( iX1 + 0.5+(min_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); } break; case CLIP_CODE_S: { iYc1 = max_clip_y; iXc1 = ( int )( iX1 + 0.5+(max_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); } break; case CLIP_CODE_W: { iXc1 = min_clip_x; iYc1 = ( int )( iY1 + 0.5+(min_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } break; case CLIP_CODE_E: { iXc1 = max_clip_x; iYc1 = ( int )( iY1 + 0.5+(max_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } break; case CLIP_CODE_NE: { iYc1 = min_clip_y; iXc1 = ( int )( iX1 + 0.5+(min_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); if (iXc1 < min_clip_x || iXc1 > max_clip_x) { iXc1 = max_clip_x; iYc1 = ( int )( iY1 + 0.5+(max_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } } break; case CLIP_CODE_SE: { iYc1 = max_clip_y; iXc1 = ( int )( iX1 + 0.5+(max_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); if (iXc1 < min_clip_x || iXc1 > max_clip_x) { iXc1 = max_clip_x; iYc1 = ( int )( iY1 + 0.5+(max_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } } break; case CLIP_CODE_NW: { iYc1 = min_clip_y; iXc1 = ( int )( iX1 + 0.5+(min_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); if (iXc1 < min_clip_x || iXc1 > max_clip_x) { iXc1 = min_clip_x; iYc1 = ( int )( iY1 + 0.5+(min_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } } break; case CLIP_CODE_SW: { iYc1 = max_clip_y; iXc1 = ( int )( iX1 + 0.5+(max_clip_y-iY1)*(iX2-iX1)/(iY2-iY1) ); if (iXc1 < min_clip_x || iXc1 > max_clip_x) { iXc1 = min_clip_x; iYc1 = ( int )( iY1 + 0.5+(min_clip_x-iX1)*(iY2-iY1)/(iX2-iX1) ); } } break; default:break; } switch(p2_code) { case CLIP_CODE_C: break; case CLIP_CODE_N: { iYc2 = min_clip_y; iXc2 = ( int )( iX2 + (min_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); } break; case CLIP_CODE_S: { iYc2 = max_clip_y; iXc2 = ( int )( iX2 + (max_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); } break; case CLIP_CODE_W: { iXc2 = min_clip_x; iYc2 = ( int )( iY2 + (min_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } break; case CLIP_CODE_E: { iXc2 = max_clip_x; iYc2 = ( int )( iY2 + (max_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } break; case CLIP_CODE_NE: { iYc2 = min_clip_y; iXc2 = ( int )( iX2 + 0.5+(min_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); if (iXc2 < min_clip_x || iXc2 > max_clip_x) { iXc2 = max_clip_x; iYc2 = ( int )( iY2 + 0.5+(max_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } } break; case CLIP_CODE_SE: { iYc2 = max_clip_y; iXc2 = ( int )( iX2 + 0.5+(max_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); if (iXc2 < min_clip_x || iXc2 > max_clip_x) { iXc2 = max_clip_x; iYc2 = ( int )( iY2 + 0.5+(max_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } } break; case CLIP_CODE_NW: { iYc2 = min_clip_y; iXc2 = ( int )( iX2 + 0.5+(min_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); if (iXc2 < min_clip_x || iXc2 > max_clip_x) { iXc2 = min_clip_x; iYc2 = ( int )( iY2 + 0.5+(min_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } } break; case CLIP_CODE_SW: { iYc2 = max_clip_y; iXc2 = ( int )( iX2 + 0.5+(max_clip_y-iY2)*(iX1-iX2)/(iY1-iY2) ); if (iXc2 < min_clip_x || iXc2 > max_clip_x) { iXc2 = min_clip_x; iYc2 = ( int )( iY2 + 0.5+(min_clip_x-iX2)*(iY1-iY2)/(iX1-iX2) ); } } break; default:break; } //还有部分完全不在裁剪区域内的线段在这里剔除 if ((iXc1 < min_clip_x) || (iXc1 > max_clip_x) || (iYc1 < min_clip_y) || (iYc1 > max_clip_y) || (iXc2 < min_clip_x) || (iXc2 > max_clip_x) || (iYc2 < min_clip_y) || (iYc2 > max_clip_y) ) { return(0); } iX1 = iXc1; iY1 = iYc1; iX2 = iXc2; iY2 = iYc2; return(1); }