⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bio.c

📁 Graphics Gems 源码 a collection of algorithms, programs, and mathematical techniques for the computer
💻 C
字号:
/* * file  bio.c *	contains the basic operations * */#include	<stdio.h>#include	"GGems.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<n; 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;		}	}} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -