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

📄 ran_ramp.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* copyright Ken Musgrave *//* March 1985 *//* ran_ramp.c *//*************************************************************************   Usage: ran_ramp [-g] [-z]**   Performs random continuous changes to the color map of a frame buffer.**   The idea is to use three DDA's with endpoint input from a random* number generator.  The three DDA's generate random sawtooth waves* of values for red, green, and blue.  These waves of values are pushed* through the lookup table from entry 254 down to entry 0.**   NOTE:  Entry 255 remains black, as this was designed for animating* the Mandelbrot set, whose center should remain black.************************************************************************/#include <stdio.h>#include <ctype.h>#include <signal.h>#define TRUE  1#define FALSE 0#define MAXENTRY	256#define MAXINDEX	255#define DELAY		8	/* kludge to modulate speed of animation */				/* you may want/need to change this value *//* * pseudo-random number generator; period 65536; requires seed between 0 and * 65535; returns random numbers between 0 and 65536. */#define MULTIPLIER 25173#define INCREMENT  13849#define MODULUS    65535#define RANDOM(x)  (MULTIPLIER * x + INCREMENT) & MODULUSint             quit = FALSE;	/* signal variables */int             stop = FALSE;	/* used in trapping <ctrl-C> and <ctrl-Z> */int             seed, maxsteps; /* user input variables */				/* arrays for color lookup table values */unsigned char   r[MAXENTRY], g[MAXENTRY], b[MAXENTRY];main(argc, argv)int             argc;char           *argv[];{	register int    i;	int             reply, delay;	int             inter();	 /* signal functions, see below */	int             suspend();	signal(SIGINT, inter);		 /* traps <ctrl-C> */	signal(SIGTSTP, suspend);	 /* traps <ctrl-Z> */	printf("Please enter seed: ");	scanf("%d", &seed);					/* "(10-100)" is just a suggestion... */	printf("\nPlease enter maximum length of color ramp:  (10-100)");	scanf("%d", &maxsteps);	printf("\n");	fb_init();			/* generic frame buffer init routine */			/* if specified, set initial map option */	if (argc == 2) {			/* "-g" option for gray scale */		if (argv[1][0] == '-' && argv[1][1] == 'g') {			for (i=0; i<MAXINDEX; i++)				r[i] = g[i] = b[i] = i;			r[MAXINDEX] = g[MAXINDEX] = b[MAXINDEX] = 0;		}			/* "-z" option for zebra scale */		else if (argv[1][0] == '-' && argv[1][1] == 'z') {			for (i=0; i<MAXINDEX; i+=4) {				r[i]=r[i+1]=g[i]=g[i+1]=b[i]=b[i+1]=i * 4 / 5;				r[i+2]=r[i+3]=g[i+2]=g[i+3]=b[i+2]=b[i+3]=					i * 4/5 + 51;			}			r[MAXINDEX] = g[MAXINDEX] = b[MAXINDEX] = 0;		}	} else {			/* initialize the color map to black */		for (i=0; i<MAXINDEX; i++)			r[i] = g[i] = b[i] = 0;	}			/* generic routine to write frame buffer color map */	fb_setmap(r, g, b);			/* loop until <ctrl-C> is trapped */	while (!quit) {			/* trapped <crtl-Z> */		if (stop) {			fb_done();	/* release frame buffer */			printf("\nSave lookup table? (y/n) ");			while (isspace(reply = getchar()));			if (reply == 'y')				save_lut();					/* returns when job running again */			kill(getpid(), SIGSTOP);			stop = FALSE;			fb_init();	/* get back in action */		}		/*		 * main animation loop:		 *		 * move each entry in color map arrays down one place		 */		for (i=0; i<(MAXINDEX-1); i++) {			r[i] = r[i+1];			g[i] = g[i+1];			b[i] = b[i+1];		}		/* 		 * get new high color map entries 		 */		r[MAXINDEX-1] = dda_red();		g[MAXINDEX-1] = dda_green();		b[MAXINDEX-1] = dda_blue();		/*		 * send new color maps to the frame buffer		 * NOTE: we may do this several times (the value of		 * "DELAY") to slow down the animation		 */		for (delay=0; delay<DELAY; delay++)			fb_setmap(0, MAXINDEX, r, g, b);	}	fb_done();	/* release the frame buffer */} /* main() *//* * function for trapping <ctrl-C> * NOTE: the only reason to use this is so that * we can call fb_done() before exiting - this  * may or may not be necessary */inter(){	quit = TRUE;}/* * function for trapping <ctrl-Z> * NOTE: this is used so that the user may stop the * animation at any time and dump the color map to  * a file */suspend(){	stop = TRUE;}/* * produces linear ramps in intensity for the red portion of the color * lookup table */dda_red(){	register int    temp;	static float	ry1, ry2=0., rinc, r_xsteps=0.;	static int 	r_xcount=0;	/* if at end of ramp... */	if (r_xcount >= (int) r_xsteps) {		/*		 * make the end of last ramp the beginning of next ramp		 */		ry1 = ry2;			/* define end of next ramp */		seed = RANDOM(seed);			/* assign a new (scaled) end point */		ry2 = MAXINDEX * (seed / 65535.0);		seed = RANDOM(seed);			/* get a new ramp length */		r_xsteps = (maxsteps * (seed / 65535.0));			/* find the intensity increment per step */		if (r_xsteps != 0)			rinc = (ry2 - ry1) / r_xsteps;		else			rinc = 0;		r_xcount = 0;	}	temp = (int) ry1;	ry1 += rinc;	r_xcount++;	return temp;} /* dda_red() *//* * produces linear ramps in intensity for the green portion of the color * lookup table */dda_green(){	register int    temp;	static float	gy1, gy2=0., ginc, g_xsteps=0.;	static int 	g_xcount=0;	if (g_xcount >= (int) g_xsteps) {		/*		 * make the end of last ramp the beginning of next ramp		 */		gy1 = gy2;			/* define end of next ramp */		seed = RANDOM(seed);		gy2 = MAXINDEX * (seed / 65535.0);		seed = RANDOM(seed);		g_xsteps = (maxsteps * (seed / 65535.0));			/* find the intensity increment per step */		if (g_xsteps != 0)			ginc = (gy2 - gy1) / g_xsteps;		else			ginc = 0;		g_xcount = 0;	}	temp = (int) gy1;	gy1 += ginc;	g_xcount++;	return temp;}  /* dda_green() *//* * produces linear ramps in intensity for the blue portion of the color * lookup table */dda_blue(){	register int    temp;	static float	by1, by2=0., binc, b_xsteps=0.;	static int 	b_xcount=0;	if (b_xcount >= (int) b_xsteps) {		/*		 * make the end of last ramp the beginning of next ramp		 */		by1 = by2;			/* define end of next ramp */		seed = RANDOM(seed);		by2 = MAXINDEX * (seed / 65535.0);		seed = RANDOM(seed);		b_xsteps = (maxsteps * (seed / 65535.0));			/* find the intensity increment per step */		if (b_xsteps != 0)			binc = (by2 - by1) / b_xsteps;		else			binc = 0;		b_xcount = 0;	}	temp = (int) by1;	by1 += binc;	b_xcount++;	return temp;}  /* dda_blue() *//*  * save the lookup table to a file */save_lut(){	FILE           *fp, *fopen();	char            filename[40];	int             i;	getchar();		/* read leading newline char */	printf("Enter filename for lookup table:  ");	gets(filename);	fp = fopen(filename, "w");	for (i=0; i<MAXINDEX; i++)		fprintf(fp, "%3d %3d %3d\n", r[i], g[i], b[i]);	fclose(fp);} /* save_lut() */

⌨️ 快捷键说明

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