Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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;
}