www.pudn.com > LightTrack.rar > Clipp2D.cpp
/** 3DGPL *************************************************\
* () *
* 2D line and polygon clipping. *
* *
* Defines: *
* C_init_clipping Setting bounds; *
* C_get_bounds Clipping window; *
* C_set_bounds Impose another condition; *
* *
* C_line_x_clipping Clipping a line horizontally;*
* C_line_y_clipping Clipping a line vertically; *
* *
* C_polygon_x_clipping Horizontal polygon cliping. *
* *
* (c) 1995-98 Sergei Savchenko, (savs@cs.mcgill.ca) *
\**********************************************************/
//Clipp2D.cpp
#include "LightTrack.h" /* hardware specific stuff */
#include "Clipper.h" /* 2D macros */
int C_2D_clipping; /* type of performed clipping */
int C_x_clipping_min=C_X_CLIPPING_MIN; /* clipping bounds */
int C_x_clipping_max=C_X_CLIPPING_MAX; /* default values */
int C_y_clipping_min=C_Y_CLIPPING_MIN;
int C_y_clipping_max=C_Y_CLIPPING_MAX;
/**********************************************************\
* Setting bounds for 2D clipping. *
* *
* SETS: C_x_clipping_min,...,C_y_clipping_max *
* ----- *
\**********************************************************/
void C_init_clipping(int minx,int miny,int maxx,int maxy)
{
C_x_clipping_min=minx; /* no error checking... */
C_y_clipping_min=miny;
C_x_clipping_max=maxx;
C_y_clipping_max=maxy;
}
/**********************************************************\
* Getting current state of bounds for 2D clipping. *
\**********************************************************/
void C_get_bounds(int *minx,int *miny,int *maxx,int *maxy)
{
*minx=C_x_clipping_min;
*miny=C_y_clipping_min;
*maxx=C_x_clipping_max;
*maxy=C_y_clipping_max;
}
/**********************************************************\
* Imposing extra set of bounds for 2D clipping. *
* *
* RETURNS: 0 when no clipping window exist; *
* -------- 1 when it does exist. *
* *
* +--------+ merging two sets of conditions *
* | +-------+ old and new. Getting an intersection *
* | |////| | where both old and new conditions *
* +---|----+ | are valid. *
* +-------+ *
* *
* SETS: C_x_clipping_min,...,C_y_clipping_max *
* ----- *
\**********************************************************/
int C_set_bounds(int minx,int miny,int maxx,int maxy)
{
if(minx>C_x_clipping_min) C_x_clipping_min=minx;
if(maxxC_y_clipping_min) C_y_clipping_min=miny;
if(maxy=C_x_clipping_max)||
(C_y_clipping_min>=C_y_clipping_max)
) return(0); /* invalid bounds, can't clip */
else return(1); /* clipping is possible */
}
/**********************************************************\
* Line clipping using binary search technique. *
* *
* RETUNRNS: 0 when line is compleately outside; *
* --------- 1 otherwise. *
* *
* SETS: C_2D_clipping to 1 when first or both points *
* ----- were changed, 0 otherwise. *
\**********************************************************/
int C_line_x_clipping(int **vertex1,int **vertex2,int dimension)
{
register int i;
register int whereto;
register int *l,*r,*m,*t; /* left right midle and tmp */
static int g_store0[C_MAX_DIMENSIONS]; /* static stores for clipped vxes */
static int g_store1[C_MAX_DIMENSIONS];
static int g_store2[C_MAX_DIMENSIONS];
static int g_store3[C_MAX_DIMENSIONS];
static int g_store4[C_MAX_DIMENSIONS];
static int g_store5[C_MAX_DIMENSIONS];
int **vmn,**vmx; /* so that *vmn[0] < *vmx[0] */
int swap; /* were coordinates swaped? */
C_2D_clipping=0; /* default no clipping yet */
if((*vertex1)[0]<(*vertex2)[0])
{ swap=0; vmn=vertex1; vmx=vertex2; } /* so that *vmn[0] < *vmx[0] */
else
{ swap=1; vmn=vertex2; vmx=vertex1; }
if(((*vmn)[0]>=C_x_clipping_max)||((*vmx)[0]<=C_x_clipping_min)) return(0);
else
{
if((*vmn)[0]<=C_x_clipping_min) /* clipping */
{
HW_copy_int(*vmn,m=g_store0,dimension); /* copying old vertices */
HW_copy_int(*vmx,r=g_store1,dimension);
l=g_store2;
whereto=1;
while(m[0]!=C_x_clipping_min)
{
if(whereto==1) { t=l; l=m; m=t; }
else { t=r; r=m; m=t; }
for(i=0;i>1;
whereto=m[0]=C_x_clipping_max) /* clipping */
{
HW_copy_int(*vmn,l=g_store3,dimension); /* copying old vertices */
HW_copy_int(*vmx,m=g_store4,dimension);
r=g_store5;
whereto=0;
while(m[0]!=C_x_clipping_max)
{
if(whereto==1) { t=l; l=m; m=t; }
else { t=r; r=m; m=t; }
for(i=0;i>1;
whereto=m[0]=C_y_clipping_max)||((*vmx)[1]<=C_y_clipping_min)) return(0);
else
{
if((*vmn)[1]<=C_y_clipping_min) /* clipping */
{
HW_copy_int(*vmn,m=g_store0,dimension); /* copying old vertices */
HW_copy_int(*vmx,r=g_store1,dimension);
l=g_store2;
whereto=1;
while(m[1]!=C_y_clipping_min)
{
if(whereto==1) { t=l; l=m; m=t; }
else { t=r; r=m; m=t; }
for(i=0;i>1;
whereto=m[1]=C_y_clipping_max) /* clipping */
{
HW_copy_int(*vmn,l=g_store3,dimension); /* copying old vertices */
HW_copy_int(*vmx,m=g_store4,dimension);
r=g_store5;
whereto=0;
while(m[1]!=C_y_clipping_max)
{
if(whereto==1) { t=l; l=m; m=t; }
else { t=r; r=m; m=t; }
for(i=0;i>1;
whereto=m[1] 2'-3'-5'-6' *
* |5' |6' *
* 5*-*----*-*6 If first vertex in the line is *
* / | | \ being clipped both vertices are *
* 4* | | *1 copyed.If no clipping or second *
* \ | | / one is clipped then only second *
* 3*-*----*-*2 one is copyed. If both vertices *
* |3' |2' are clipped, neither is copyed. *
* *
\**********************************************************/
int C_polygon_x_clipping(int *from,register int *to,int dimension,int length)
{
register int i;
int *v1,*v2,new_lng=0;
int *first_vrtx=to; /* begining of the source */
for(i=0;i