www.pudn.com > 医学算法.rar > radon.c


#
/*
	radon - plot radon space

	carl crawford
	purdue university
	w. lafayette, in 47907

	july 1980
*/

#include	

int	nfl =	100;	/* number of flashes */
int	n =	20;	/* number of detectors */
int	k =	11;	/* number of transverses */
int	sd;		/* 1 = specific detector mode */
int	n1 =	0;	/* range for specific detector mode */
int	n2 =	0;	/* range for specific detector mode */
int	print =	1;	/* 1=print program info */
char	*ifn =	"radon";/* input file */
char	*ofn =	"pic";/* output file */
int	min,max;	/* min and max of pic */
int	pic[16384];	/* quantized radon space */
int	*p;		/* pointer to pic */
float	sca,sct,scp;	/* scale factors */
float	pi =	3.141592654;
int	quad;		/* 1 = quadrant only */
int	pos;		/* 1 = positive l only */
float	pi2;		/* related to pi */
int	m =	128;	/* size of pic */
int	m2 =	16384;	/* size of pic */
int	m5 =	64;
char	buf[128];	/* line of mapped pic */
float   sin(),cos(),atof(),fabs();
float	rdt[100];	/* flash radon coordinate */
float	rda[100];	/* flash radon coordinate */
FILE	*ifd;		/* input file descriptor */
FILE	*ofd;		/* output file descriptor */
float	r =	1.0;	/* radius of scan circle */
int     zero;           /* 1 = zero outside of radius */

char	*table[] = {
		"nfl",
		"n",
		"k",
		"if",
		"of",
		"r",
		"sd",
		0
	};

main(argc,argv)
	int	argc;
	char	**argv;
{
	char	cc;
	register i,j;
	int	la,lt;

	while(++argv,--argc){
		if(**argv == '-')while(cc = *++*argv)switch(cc){

		case 'p':	/* don't print program info */
			print = 0;
			break;
		case 'q':	/* quadrant only */
			quad = 1;
			break;
		case 'n':	/* negative only */
			pos = 1;
			break;
		case 'z':       /* zero outside of radius */
			zero = 1;
			break;
		case 's':	/* specific detector mode */
			sd = 1;
			break;
		default:
			fprintf(stderr,"bad flag: -%c\n",cc);
			exit(1);
		}else	switch(comm(*argv)){

		case 1:		/* nfl */
			nfl = atoi(*argv + 4);
			break;
		case 2:		/* n */
			n = atoi(*argv + 2);
			break;
		case 3:		/* k */
			k = atoi(*argv + 2);
			break;
		case 4:		/* ifn */
			ifn = *argv + 3;
			break;
		case 5:		/* ofn */
			ofn = *argv + 3;
			break;
		case 6:		/* radius */
			r = atof(*argv + 2);
			zero = 1;
			break;
		case 7:		/* specific detector */
			n1 =  atoi(*argv + 3);
			n2 = n1 + 1;
			sd = 1;
			break;
		}
	}

	if((ifd = fopen(ifn,"r")) == NULL){
		fprintf(stderr,"can't open: %s\n",ifn);
		exit(1);
	}
	if((ofd = fopen(ofn,"w")) == NULL){
		fprintf(stderr,"can't create: %s\n",ofn);
		exit(1);
	}
	if(print){
		printf("RADON DATA\n\n");
		printf("nfl = %d\n",nfl);
		printf("n = %d\n",n);
		printf("k = %d\n",k);
		printf("r = %f\n",r);
		printf("input file: %s\n",ifn);
		printf("output file: %s\n",ofn);
		if(quad)printf("quadrant display\n");
		if(zero)printf("zero outside radius\n");
		if(pos)printf("half data only\n");
		if(sd)printf("specific detector: %d\n",n1);
	}

	if(!sd){
		n1 = 0;
		n2 = n;
	}
	k *= nfl;
	pi2 = pi + pi;
	sct = m / (r + r);
	if(quad){
		sct *= 2.0;
		m5 = m;
	}

	for(i=0;i= 0 && la >= 0)
					pic[(la<<7) + lt]++;
			}
		}
	}

	min = 10000000.;
	max = -min;
	for(i=0;i max)max = pic[i];
	}
	scp = 255. / (max - min);
	for(p=pic,i=0;i