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

📄 orddithr.c

📁 Graphics Gems 源码 a collection of algorithms, programs, and mathematical techniques for the computer
💻 C
字号:
/*Ordered Ditheringby Stephen Hawleyfrom "Graphics Gems", Academic Press, 1990*//* Program to generate dithering matrices. * written by Jim Blandy, Oberlin College, jimb@occs.oberlin.edu * Gifted to, documented and revised by Stephen Hawley, * sdh@flash.bellcore.com *  * Generates a dithering matrix from the command line arguments. * The first argument, size, determines the dimensions of the  * matrix: 2^size by 2^size * The optional range argument is the range of values to be  * dithered over. By default, it is (2^size)^2, or simply the * total number of elements in the matrix. * The final output is suitable for inclusion in a C program. * A typical dithering function is something like this: * extern int dm[], size; * * int * dither(x,y, level) * register int x,y, level; * { *	return(level > dm[(x % size) + size * (y % size)]; * } */main(argc, argv)int argc;char **argv;{	register int size, range;	if (argc >= 2) size = atoi(argv[1]);	else size = 2;	if (argc == 3) range = atoi(argv[2]);	else range = (1 << size) * (1 << size);	printdither (size, range);}printdither (size, range)register int size, range;{	register int l = (1 << size), i;     /*      * print a dithering matrix.      * l is the length on a side.      */	range = range / (l * l);	puts("int dm[] = {");	for (i=0; i < l*l; i++) {		if (i % l == 0) /* tab in 4 spaces per row */			printf("    ");		/* print the dither value for this location 		 * scaled to the given range		 */		printf("%4d", range * dithervalue(i / l, i % l, size));		/* commas after all but the last */		if (i + 1 < l * l)			putchar(',');		/* newline at the end of the row */		if ((i + 1) % l == 0)			putchar('\n');	}	puts("\n}; ");}dithervalue(x, y, size)register int x, y, size;{	register int d;	/*	 * calculate the dither value at a particular	 * (x, y) over the size of the matrix.	 */	d=0;	while (size-->0)	{		/* Think of d as the density. At every iteration,		 * d is shifted left one and a new bit is put in the		 * low bit based on x and y. If x is odd and y is even,		 * or x is even and y is odd, a bit is put in. This		 * generates the checkerboard seen in dithering.		 * This quantity is shifted left again and the low bit of		 * y is added in.		 * This whole thing interleaves a checkerboard bit pattern		 * and y's bits, which is the value you want.		 */		d = (d <<1 | (x&1 ^ y&1))<<1 | y&1;		x >>= 1;		y >>= 1;	}	return(d);}

⌨️ 快捷键说明

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