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

📄 peano.c

📁 [Game.Programming].Academic - Graphics Gems (6 books source code)
💻 C
字号:
/* peano.c *//* copyright Ken Musgrave *//* June 1986 *//* * space-filling peano curve algorithm. * fills n-space with a 1-D peano curve. *  * the algorithm is utterly incomprehensible, * so expect a paucity of sensible comments in this code. * it consists largely of bit-wise logical operations, * and is therefore quite impenetrable. * but it works. */#include "types.h"/* * determine the n-space coordinate of "point" on the peano curve */peano(coord, point)vector          coord;int             point;{	int             i;	zero(sigma);		/* initialize necessary arrays */	zero(tilde_sigma);	zero(tilde_tau);	build_rho(point);	for (i=0; i<precision; i++)		J[i] = principal_pos(rho[i]);	build_sigma();	build_tau();	build_tilde_sigma();	build_tilde_tau();	build_omega();	build_alpha();	v_convert(alpha, coord);} /* peano() *//* * build "rho" array */build_rho(point)int             point;{	int	i, mask=bytemask;	for (i=0; i<precision; i++) {		rho[precision - i - 1] = (point & mask) >> (i * dimensions);		mask <<= dimensions;	}} /* build_rho() *//* * find principal position of "a_byte"  */principal_pos(a_byte)byte            a_byte;{	int             nth_bit, i=1;	nth_bit = a_byte & 0x01;	for (i=1; i<dimensions; i++) {		if (((a_byte & bitmask[dimensions - i - 1]) >> i) != nth_bit)			return (dimensions - i);	}	return (dimensions);	/* all bits are the same */} /* principal_pos() *//* * build "sigma" array */build_sigma(){	int             i, bit;	for (i=0; i<precision; i++) {		sigma[i] |= rho[i] & bitmask[0];		for (bit=1; bit<dimensions; bit++) {			sigma[i] |= (rho[i] & bitmask[bit])				^ ((rho[i] & bitmask[bit - 1]) >> 1);		}	}} /* build_sigma() *//* * build "tau" array  */build_tau(){	int             parity, bit, i, j;	byte            temp_byte;	for (i=0; i<precision; i++) {		parity = 0;						/* complement nth bit */		if (sigma[i] & bitmask[dimensions - 1])			tau[i] = sigma[i] - 1;	/* nth bit was 1 */		else			tau[i] = sigma[i] + 1;	/* nth bit was 0 */		for (j=0; j<dimensions; j++)	/* find parity */			if (tau[i] & bitmask[j])				parity++;		if (ODD(parity)) {	/* complement principal bit */			bit = J[i] - 1;	/* get index of principal bit */					/* get bit in question */			temp_byte = tau[i] & bitmask[bit];			tau[i] |= bitmask[bit];	/* set the bit to 1 */			tau[i] &= ~temp_byte;	/* assign complement */		}	}} /* build_tau() *//* * build "tilde_sigma" array  */build_tilde_sigma(){	int             i, shift=0;	tilde_sigma[0] = sigma[0];	for (i=1; i<precision; i++) {		shift += J[i - 1] - 1;		shift %= dimensions;		tilde_sigma[i]= RT_CSHFT(sigma[i], shift, dimensions, bytemask);	}} /* build_tilde_sigma() *//* * build "tilde_tau" array  */build_tilde_tau(){	int             i, shift=0;	tilde_tau[0] = tau[0];	for (i=1; i<precision; i++) {		shift += J[i - 1] - 1;		shift %= dimensions;		tilde_tau[i] = RT_CSHFT(tau[i], shift, dimensions, bytemask);	}} /* build_tilde_tau() *//* * build "omega" array  */build_omega(){	int             i;	omega[0] = 0;	for (i=1; i<precision; i++)		omega[i] = omega[i - 1] ^ tilde_tau[i - 1];} /* build_omega() *//* * build "alpha" array  */build_alpha(){	int             i;	for (i=0; i<precision; i++)		alpha[i] = omega[i] ^ tilde_sigma[i];} /* build_alpha() *//* * initialize "array" to zeros  */zero(array)	r_array         array;{	int             i;	for (i=0; i<precision; i++)		array[i] = 0;} /* zero() *//* * convert "alpha" array into n_space coordinate vector  */v_convert(alph, coord)r_array         alph;vector          coord;{	int             i, j, bit, a_bitmask=1;	for (i=0; i<dimensions; i++) {		coord[i] = 0;		bit = precision;		for (j=0; j<precision; j++)	/* extract each bit of coord						 * i */			coord[i] |= ((alph[j] & a_bitmask) << --bit) >> i;		a_bitmask <<= 1;	}} /* v_convert() */

⌨️ 快捷键说明

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