static int clip_poly(float src[MAXV][MAXN], float dst[MAXV][MAXN], int len, int n, float val, int isy, int ismax) { float cv1[MAXN]; float cv2[MAXN]; int v1, v2, cp; int r; v1 = len - 1; cp = 0; for (v2 = 0; v2 < len; v2++) { copy_vert(cv1, src[v1], n); copy_vert(cv2, src[v2], n); if (isy) r = clipy(val, ismax, cv1, cv2, n); else r = clipx(val, ismax, cv1, cv2, n); switch (r) { case IN: copy_vert(dst[cp++], cv2, n); break; case OUT: break; case LEAVE: copy_vert(dst[cp++], cv2, n); break; case ENTER: copy_vert(dst[cp++], cv1, n); copy_vert(dst[cp++], cv2, n); break; } v1 = v2; } return cp; }
static int clip_poly(float src[MAXV][MAXN], float dst[MAXV][MAXN], int len, int n, float val, int isy, int ismax) { int v1, v2, cp; v1 = len - 1; cp = 0; if (isy) for (v2 = 0; v2 < len; v2++) { cp += clipy(val, ismax, src[v1], src[v2], n, dst[cp]); v1 = v2; } else for (v2 = 0; v2 < len; v2++) { cp += clipx(val, ismax, src[v1], src[v2], n, dst[cp]); v1 = v2; } return cp; }
long cOBJECT::Clipper2(POLYGON *poly,VECTOR *TVectors, long minx,long maxx,long miny) { long v1,v2; int i; long current=0; v1=poly->NumVectors-1; v2=0; for (i=0;i<poly->NumVectors;i++) { if (TVectors[poly->VectorIndex[v1]].x>minx) { if (TVectors[poly->VectorIndex[v2]].x>minx) { if (TVectors[poly->VectorIndex[v1]].x<maxx) { if (TVectors[poly->VectorIndex[v2]].x<maxx) { poly->ClippedVectorIndex[current]=poly->VectorIndex[v1]; poly->ClippedLightPoints[current]=poly->LightPoints[v1]; current++; } else { poly->ClippedVectorIndex[current]=poly->VectorIndex[v1]; poly->ClippedLightPoints[current]=poly->LightPoints[v1]; current++; clipx(poly,TVectors,v1,v2,current,maxx); current++; } } else { if (TVectors[poly->VectorIndex[v2]].x<maxx) { clipx(poly,TVectors,v1,v2,current,maxx); current++; } } } else { poly->ClippedVectorIndex[current]=poly->VectorIndex[v1]; poly->ClippedLightPoints[current]=poly->LightPoints[v1]; current++; clipx(poly,TVectors,v1,v2,current,0); current++; } } else { if (TVectors[poly->VectorIndex[v2]].x>minx) { if (TVectors[poly->VectorIndex[v2]].x>maxx) { clipx(poly,TVectors,v1,v2,current,maxx); current++; } clipx(poly,TVectors,v1,v2,current,0); current++; } } v1=v2; v2++; } poly->ClippedNumVectors=current; return 0; }