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

📄 image.cc

📁 蒙特卡洛仿真源代码很有参考价值要按照步骤进行操作
💻 CC
📖 第 1 页 / 共 5 页
字号:
#ifdef    INTERLACE	} else {		// faked interlacing effect		unsigned char channel, channel2;		for (yt = ytable, y = 0; y < height; y++, yt += 3) {			for (xt = xtable, x = 0; x < width; x++) {				if (y & 1) {					channel = *(xt++) + *(yt);					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pr++) = channel2;					channel = *(xt++) + *(yt + 1);					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pg++) = channel2;					channel = *(xt++) + *(yt + 2);					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pb++) = channel2;				} else {					channel = *(xt++) + *(yt);					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pr++) = channel2;					channel = *(xt++) + *(yt + 1);					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pg++) = channel2;					channel = *(xt++) + *(yt + 2);					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pb++) = channel2;				}			}		}	}#endif // INTERLACE}void BImage::hgradient(void) {	float drx, dgx, dbx,	xr = (float) from->getRed(),	     xg = (float) from->getGreen(),	          xb = (float) from->getBlue();	unsigned char *pr = red, *pg = green, *pb = blue;	register unsigned int x, y;	drx = (float) (to->getRed() - from->getRed());	dgx = (float) (to->getGreen() - from->getGreen());	dbx = (float) (to->getBlue() - from->getBlue());	drx /= width;	dgx /= width;	dbx /= width;#ifdef    INTERLACE	if (interlaced && height > 2) {		// faked interlacing effect		unsigned char channel, channel2;		for (x = 0; x < width; x++, pr++, pg++, pb++) {			channel = (unsigned char) xr;			channel2 = (channel >> 1) + (channel >> 2);			if (channel2 > channel) channel2 = 0;			*pr = channel2;			channel = (unsigned char) xg;			channel2 = (channel >> 1) + (channel >> 2);			if (channel2 > channel) channel2 = 0;			*pg = channel2;			channel = (unsigned char) xb;			channel2 = (channel >> 1) + (channel >> 2);			if (channel2 > channel) channel2 = 0;			*pb = channel2;			channel = (unsigned char) xr;			channel2 = channel + (channel >> 3);			if (channel2 < channel) channel2 = ~0;			*(pr + width) = channel2;			channel = (unsigned char) xg;			channel2 = channel + (channel >> 3);			if (channel2 < channel) channel2 = ~0;			*(pg + width) = channel2;			channel = (unsigned char) xb;			channel2 = channel + (channel >> 3);			if (channel2 < channel) channel2 = ~0;			*(pb + width) = channel2;			xr += drx;			xg += dgx;			xb += dbx;		}		pr += width;		pg += width;		pb += width;		int offset;		for (y = 2; y < height; y++, pr += width, pg += width, pb += width) {			if (y & 1) offset = width;			else offset = 0;			memcpy(pr, (red + offset), width);			memcpy(pg, (green + offset), width);			memcpy(pb, (blue + offset), width);		}	} else {#endif // INTERLACE		// normal hgradient		for (x = 0; x < width; x++) {			*(pr++) = (unsigned char) (xr);			*(pg++) = (unsigned char) (xg);			*(pb++) = (unsigned char) (xb);			xr += drx;			xg += dgx;			xb += dbx;		}		for (y = 1; y < height; y++, pr += width, pg += width, pb += width) {			memcpy(pr, red, width);			memcpy(pg, green, width);			memcpy(pb, blue, width);		}#ifdef    INTERLACE	}#endif // INTERLACE}void BImage::vgradient(void) {	float dry, dgy, dby,	yr = (float) from->getRed(),	     yg = (float) from->getGreen(),	          yb = (float) from->getBlue();	unsigned char *pr = red, *pg = green, *pb = blue;	register unsigned int y;	dry = (float) (to->getRed() - from->getRed());	dgy = (float) (to->getGreen() - from->getGreen());	dby = (float) (to->getBlue() - from->getBlue());	dry /= height;	dgy /= height;	dby /= height;#ifdef    INTERLACE	if (interlaced) {		// faked interlacing effect		unsigned char channel, channel2;		for (y = 0; y < height; y++, pr += width, pg += width, pb += width) {			if (y & 1) {				channel = (unsigned char) yr;				channel2 = (channel >> 1) + (channel >> 2);				if (channel2 > channel) channel2 = 0;				memset(pr, channel2, width);				channel = (unsigned char) yg;				channel2 = (channel >> 1) + (channel >> 2);				if (channel2 > channel) channel2 = 0;				memset(pg, channel2, width);				channel = (unsigned char) yb;				channel2 = (channel >> 1) + (channel >> 2);				if (channel2 > channel) channel2 = 0;				memset(pb, channel2, width);			} else {				channel = (unsigned char) yr;				channel2 = channel + (channel >> 3);				if (channel2 < channel) channel2 = ~0;				memset(pr, channel2, width);				channel = (unsigned char) yg;				channel2 = channel + (channel >> 3);				if (channel2 < channel) channel2 = ~0;				memset(pg, channel2, width);				channel = (unsigned char) yb;				channel2 = channel + (channel >> 3);				if (channel2 < channel) channel2 = ~0;				memset(pb, channel2, width);			}			yr += dry;			yg += dgy;			yb += dby;		}	} else {#endif // INTERLACE		// normal vgradient		for (y = 0; y < height; y++, pr += width, pg += width, pb += width) {			memset(pr, (unsigned char) yr, width);			memset(pg, (unsigned char) yg, width);			memset(pb, (unsigned char) yb, width);			yr += dry;			yg += dgy;			yb += dby;		}#ifdef    INTERLACE	}#endif // INTERLACE}void BImage::pgradient(void) {	// pyramid gradient -  based on original dgradient, written by	// Mosfet (mosfet@kde.org)	// adapted from kde sources for Blackbox by Brad Hughes	float yr, yg, yb, drx, dgx, dbx, dry, dgy, dby,	xr, xg, xb;	int rsign, gsign, bsign;	unsigned char *pr = red, *pg = green, *pb = blue;	unsigned int tr = to->getRed(), tg = to->getGreen(), tb = to->getBlue(),	                                     *xt = xtable, *yt = ytable;	register unsigned int x, y;	dry = drx = (float) (to->getRed() - from->getRed());	dgy = dgx = (float) (to->getGreen() - from->getGreen());	dby = dbx = (float) (to->getBlue() - from->getBlue());	rsign = (drx < 0) ? -1 : 1;	gsign = (dgx < 0) ? -1 : 1;	bsign = (dbx < 0) ? -1 : 1;	xr = yr = (drx / 2);	xg = yg = (dgx / 2);	xb = yb = (dbx / 2);	// Create X table	drx /= width;	dgx /= width;	dbx /= width;	for (x = 0; x < width; x++) {		*(xt++) = (unsigned char) ((xr < 0) ? -xr : xr);		*(xt++) = (unsigned char) ((xg < 0) ? -xg : xg);		*(xt++) = (unsigned char) ((xb < 0) ? -xb : xb);		xr -= drx;		xg -= dgx;		xb -= dbx;	}	// Create Y table	dry /= height;	dgy /= height;	dby /= height;	for (y = 0; y < height; y++) {		*(yt++) = ((unsigned char) ((yr < 0) ? -yr : yr));		*(yt++) = ((unsigned char) ((yg < 0) ? -yg : yg));		*(yt++) = ((unsigned char) ((yb < 0) ? -yb : yb));		yr -= dry;		yg -= dgy;		yb -= dby;	}	// Combine tables to create gradient#ifdef    INTERLACE	if (! interlaced) {#endif // INTERLACE		// normal pgradient		for (yt = ytable, y = 0; y < height; y++, yt += 3) {			for (xt = xtable, x = 0; x < width; x++) {				*(pr++) = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));				*(pg++) = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));				*(pb++) = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));			}		}#ifdef    INTERLACE	} else {		// faked interlacing effect		unsigned char channel, channel2;		for (yt = ytable, y = 0; y < height; y++, yt += 3) {			for (xt = xtable, x = 0; x < width; x++) {				if (y & 1) {					channel = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pr++) = channel2;					channel = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pg++) = channel2;					channel = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pb++) = channel2;				} else {					channel = (unsigned char) (tr - (rsign * (*(xt++) + *(yt))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pr++) = channel2;					channel = (unsigned char) (tg - (gsign * (*(xt++) + *(yt + 1))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pg++) = channel2;					channel = (unsigned char) (tb - (bsign * (*(xt++) + *(yt + 2))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pb++) = channel2;				}			}		}	}#endif // INTERLACE}void BImage::rgradient(void) {	// rectangle gradient -  based on original dgradient, written by	// Mosfet (mosfet@kde.org)	// adapted from kde sources for Blackbox by Brad Hughes	float drx, dgx, dbx, dry, dgy, dby, xr, xg, xb, yr, yg, yb;	int rsign, gsign, bsign;	unsigned char *pr = red, *pg = green, *pb = blue;	unsigned int tr = to->getRed(), tg = to->getGreen(), tb = to->getBlue(),	                                     *xt = xtable, *yt = ytable;	register unsigned int x, y;	dry = drx = (float) (to->getRed() - from->getRed());	dgy = dgx = (float) (to->getGreen() - from->getGreen());	dby = dbx = (float) (to->getBlue() - from->getBlue());	rsign = (drx < 0) ? -2 : 2;	gsign = (dgx < 0) ? -2 : 2;	bsign = (dbx < 0) ? -2 : 2;	xr = yr = (drx / 2);	xg = yg = (dgx / 2);	xb = yb = (dbx / 2);	// Create X table	drx /= width;	dgx /= width;	dbx /= width;	for (x = 0; x < width; x++) {		*(xt++) = (unsigned char) ((xr < 0) ? -xr : xr);		*(xt++) = (unsigned char) ((xg < 0) ? -xg : xg);		*(xt++) = (unsigned char) ((xb < 0) ? -xb : xb);		xr -= drx;		xg -= dgx;		xb -= dbx;	}	// Create Y table	dry /= height;	dgy /= height;	dby /= height;	for (y = 0; y < height; y++) {		*(yt++) = ((unsigned char) ((yr < 0) ? -yr : yr));		*(yt++) = ((unsigned char) ((yg < 0) ? -yg : yg));		*(yt++) = ((unsigned char) ((yb < 0) ? -yb : yb));		yr -= dry;		yg -= dgy;		yb -= dby;	}	// Combine tables to create gradient#ifdef    INTERLACE	if (! interlaced) {#endif // INTERLACE		// normal rgradient		for (yt = ytable, y = 0; y < height; y++, yt += 3) {			for (xt = xtable, x = 0; x < width; x++) {				*(pr++) = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));				*(pg++) = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));				*(pb++) = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));			}		}#ifdef    INTERLACE	} else {		// faked interlacing effect		unsigned char channel, channel2;		for (yt = ytable, y = 0; y < height; y++, yt += 3) {			for (xt = xtable, x = 0; x < width; x++) {				if (y & 1) {					channel = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pr++) = channel2;					channel = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pg++) = channel2;					channel = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));					channel2 = (channel >> 1) + (channel >> 2);					if (channel2 > channel) channel2 = 0;					*(pb++) = channel2;				} else {					channel = (unsigned char) (tr - (rsign * max(*(xt++), *(yt))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pr++) = channel2;					channel = (unsigned char) (tg - (gsign * max(*(xt++), *(yt + 1))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pg++) = channel2;					channel = (unsigned char) (tb - (bsign * max(*(xt++), *(yt + 2))));					channel2 = channel + (channel >> 3);					if (channel2 < channel) channel2 = ~0;					*(pb++) = channel2;				}			}		}	}#endif // INTERLACE}void BImage::egradient(void) {	// elliptic gradient -  based on original dgradient, written by	// Mosfet (mosfet@kde.org)	// adapted from kde sources for Blackbox by Brad Hughes	float drx, dgx, dbx, dry, dgy, dby, yr, yg, yb, xr, xg, xb;	int rsign, gsign, bsign;	unsigned char *pr = red, *pg = green, *pb = blue;	unsigned int *xt = xtable, *yt = ytable,	                                 tr = (unsigned long) to->getRed(),	                                      tg = (unsigned long) to->getGreen(),	                                           tb = (unsigned long) to->getBlue();	register unsigned int x, y;	dry = drx = (float) (to->getRed() - from->getRed());	dgy = dgx = (float) (to->getGreen() - from->getGreen());	dby = dbx = (float) (to->getBlue() - from->getBlue());	rsign = (drx < 0) ? -1 : 1;	gsign = (dgx < 0) ? -1 : 1;	bsign = (dbx < 0) ? -1 : 1;	xr = yr = (drx / 2);	xg = yg = (dgx / 2);	xb = yb = (dbx / 2);	// Create X table	drx /= width;	dgx /= width;	dbx /= width;	for (x = 0; x < width; x++) {		*(xt++) = (unsigned long) (xr * xr);		*(xt++) = (unsigned long) (xg * xg);		*(xt++) = (unsigned long) (xb * xb);		xr -= drx;		xg -= dgx;		xb -= dbx;	}	// Create Y table	dry /= height;	dgy /= height;	dby /= height;	for (y = 0; y < height; y++) {		*(yt++) = (unsigned long) (yr * yr);

⌨️ 快捷键说明

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