Category : C Source Code
Archive   : GRAFGEM1.ZIP
Filename : BIO.C

 
Output of file : BIO.C contained in archive : GRAFGEM1.ZIP

/*
* file bio.c
* contains the basic operations
*
*/
#include
#include "GraphicsGems.h"
#include "line.h"

/*
* def_contour
*
* Purpose:
* add a contour to the list
* NOTE: coordinates must already be converted into longs!
*
* x x coordinates of the end points of segments
* y y coordinates of the end points of segments
* n number of coordinate pairs
* no contour number (id), does no have to be unique!
* type type of clip operation desired CLIP_NORMAL means
* clip everything inside the contour
*/
def_contour(x, y, n, no, type)
long x[], y[];
int n, no, type;
{
short i;
long dx1, dx2, dy1, dy2;
long minx, miny, maxx, maxy;
CONTOUR *cp;
SEGMENT *sp, *spp;

if((cp = CL) == (CONTOUR *)NULL) {
cp = CL = NEWTYPE(CONTOUR);
}
else {
while(cp->_next != (CONTOUR *)NULL)
cp = cp->_next;
i = cp->_no;
cp = cp->_next = NEWTYPE(CONTOUR);
}

cp->_next = (CONTOUR *)NULL;
cp->_no = no;
SET_ON(cp);
if(type == CLIP_NORMAL)
SET_INVERSE(cp);
else
SET_NORMAL(cp);
minx = miny = 1000000;
maxx = maxy = -1;
for(i=0; i if(i == 0) {
cp->_s = sp = NEWTYPE(SEGMENT);
sp->_from._x = x[0];
sp->_from._y = y[0];
sp->_to._x = x[1];
sp->_to._y = y[1];
}
else {
/*
* if necessary stretch the contour
* and skip the point
*/
dx1 = sp->_to._x - sp->_from._x;
dy1 = sp->_to._y - sp->_from._y;
dx2 = x[(i == n-1) ? 0 : i+1] - sp->_to._x;
dy2 = y[(i == n-1) ? 0 : i+1] - sp->_to._y;
if(dy2*dx1 == dy1*dx2) {
sp->_to._x = x[(i == n-1) ? 0 : i+1];
sp->_to._y = y[(i == n-1) ? 0 : i+1];
}
else {
spp = sp;
sp = sp->_next = NEWTYPE(SEGMENT);
sp->_prev = spp;
sp->_from._x = x[i];
sp->_from._y = y[i];
sp->_to._x = x[(i == n-1) ? 0 : i+1];
sp->_to._y = y[(i == n-1) ? 0 : i+1];
}
}

/*
* calculate the enclosing box
*/
if(x[i] < minx)
minx = x[i];
if(x[i] > maxx)
maxx = x[i];
if(y[i] < miny)
miny = y[i];
if(y[i] > maxy)
maxy = y[i];

}
cp->_minx = minx;
cp->_maxx = maxx;
cp->_miny = miny;
cp->_maxy = maxy;
sp->_next = cp->_s;
cp->_s->_prev = sp;
cp->_next = (CONTOUR *)NULL;
}

/*
* get_contour_ptr
*
* PURPOSE
* get the pointer to a contour given its id
* with multiple id's first fit algorithm is
* used. Returns NULL in case of error.
*
* no id of contour
*/
CONTOUR *get_contour_ptr(no)
int no;
{
CONTOUR *cp;

if((cp = CL) == (CONTOUR *)NULL)
return((CONTOUR *)NULL);
else {
while(cp != (CONTOUR *)NULL) {
if(cp->_no == no)
return(cp);
else
cp = cp->_next;
}
return((CONTOUR *)NULL);
}
}


/*
* del_contour
*
* PURPOSE
* delete contour(s) from the list with id
* no
*/
del_contour(no)
int no;
{
CONTOUR *cp, *cpp;
CONTOUR *qp = (CONTOUR *)NULL;
SEGMENT *sp, *spp;

if((cp = CL) == (CONTOUR *)NULL)
return;
while(cp != (CONTOUR *)NULL) {
if(cp->_no == no) {
sp = cp->_s;
do {
spp = sp->_next;
free(sp);
sp = spp;
} while(sp != cp->_s);
cpp = cp->_next;
free(cp);
if(qp)
qp->_next = cpp;
else
CL = cpp;
cp = cpp;
}
else {
qp = cp;
cp = cp->_next;
}
}
}




  3 Responses to “Category : C Source Code
Archive   : GRAFGEM1.ZIP
Filename : BIO.C

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/