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

📄 gui16.cpp

📁 人工智能遗传算法,经过改进,希望对大家有帮助,常常联系啊.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <fstream.h>
#include "gui16.h"

LPDIRECTDRAW            lpDD;           // DirectDraw object

inline WORD RGBto16bit(DDPIXELFORMAT* pixFormat,unsigned char r,unsigned char g,unsigned char b)
{	if(pixFormat->dwGBitMask == 0x07e0)
		return (((WORD)r<<8)&0xf800)|(((WORD)g<<3)&0x07e0)|((WORD)b>>3);
	else
		return (((WORD)r<<7)&0x7c00)|(((WORD)g<<2)&0x03e0)|((WORD)b>>3);
}

inline void writePixel(DDSURFACEDESC* ddsd,int x,int y,WORD color)
{	if(x<0||y<0||x>=ddsd->dwWidth||y>=ddsd->dwHeight)
		return;
	WORD* p = (WORD*)ddsd->lpSurface;
    *(p + (ddsd->lPitch>>1) * y + x) = color;
}

inline void line(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{	int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb;
	WORD* p = (WORD*)ddsd->lpSurface;
	long pitch = ddsd->lPitch>>1;
	long pitchb;
	x = x1;
	y = y1;;
	dx = x2 - x1;
	dy = y2 - y1;
	p += pitch * y + x;
	*p = color;
	if(dx > 0)
		a = 1;
	else if(dx < 0)
			a = -1;
		else
		{	if(dy > 0)
				b = 1;
			else if(dy < 0)
				b = -1;
			else
				return;
			pitchb = pitch * b;
			while(y!=y2)
			{	y += b;
				p += pitchb;
				*p = color;
			}
			return;
		}
	if(dy > 0)
		b = 1;
	else if(dy < 0)
			b = -1;
		else
		{	while(x!=x2)
			{	x+=a;
				p += a;
				*p = color;
			}
			return;
		}
	dxa = dx*a;
	dyb = dy*b;
	twodxa = 2*dxa;
	twodyb = 2*dyb;
	pitchb = pitch * b;
	if(dxa >= dyb)
	{	int twodyb_dxa = twodyb - twodxa;
		pk = twodyb - dxa;
		while(x != x2)
		{	x+=a;
			if(pk<0)
			{	pk+=twodyb;
				p += a;
				*p = color;
			}
			else
			{	pk+=twodyb_dxa;
				p += pitchb + a;
				*p = color;
			}
		}
	}
	else
	{	int twodxa_dyb = twodxa - twodyb;
		pk = twodxa - dyb;
		while(y != y2)
		{	y+=b;
			if(pk<0)
			{	pk+=twodxa;
				p += pitchb;
				*p = color;
			}
			else
			{	pk+= twodxa_dyb;
				p += pitchb + a;
				*p = color;
			}
		}
	}
}

void lineS(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{	int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb,ck,ckd1,ckd2;
	WORD colors[9];
	WORD* p = (WORD*)ddsd->lpSurface;
	long pitch = ddsd->lPitch>>1;
	long pitchb;
	x = x1;
	y = y1;;
	dx = x2 - x1;
	dy = y2 - y1;
	p += pitch * y + x;
	*p = color;
	if(dx > 0)
		a = 1;
	else if(dx < 0)
			a = -1;
		else
		{	if(dy > 0)
				b = 1;
			else if(dy < 0)
				b = -1;
			else
				return;
			pitchb = pitch * b;
			while(y!=y2)
			{	y+=b;
				p += pitchb;
				*p = color;
			}
			return;
		}
	if(dy > 0)
		b = 1;
	else if(dy < 0)
			b = -1;
		else
		{	while(x!=x2)
			{	x+=a;
				p += a;
				*p = color;
			}
			return;
		}
	WORD f8,f4,f2;
	if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
	{	f8 = (color&0xc718)>>3;
		f4 = (color&0xe79c)>>2;
		f2 = (color&0xf7de)>>1;	
	}
	else
	{	f8 = (color&0x6318)>>3;
		f4 = (color&0x739c)>>2;
		f2 = (color&0x7bde)>>1;
	}
	colors[1] = f8;
	colors[2] = f4;
	colors[3] = f2;
	colors[4] = f2;
	colors[5] = f2+f8;
	colors[6] = f2+f4;
	colors[7] = f2+f4+f8;
	colors[0] = f8;
	colors[8] = colors[7];
	dxa = dx*a;
	dyb = dy*b;
	int dx8 = dxa*8;
	int dy8 = dyb*8;
	twodxa = 2*dxa;
	twodyb = 2*dyb;
	pitchb = pitch * b;
	if(dxa >= dyb)
	{	ckd1 = -(dyb*8);
		ckd2 = dxa*8 + ckd1;
		int twodyb_dxa = twodyb - twodxa;
		pk = twodyb - dxa;
		ck = 4*dxa-4*pk;
		while(x != x2)
		{	x+=a;
			if(pk<0)
			{	pk+=twodyb;
				p += a;
				*p = colors[ck/dxa];
				*(p+pitchb) = colors[8-ck/dxa];
				ck += ckd1;
				if(ck < 0)
					ck = 0;
			}
			else
			{	pk+=twodyb_dxa;
				p += a;
				*p = colors[ck/dxa];
				p += pitchb;
				*p = colors[8-ck/dxa];
				ck += ckd2;
				if(ck > dx8)
					ck = dx8;
			}
		}
	}
	else
	{	ckd1 = -(dxa*8);
		ckd2 = dyb*8 + ckd1;
		int twodxa_dyb = twodxa - twodyb;
		pk = twodxa - dyb;
		ck = 4*dyb-4*pk;
		while(y != y2)
		{	y+=b;
			if(pk<0)
			{	pk+=twodxa;
				p += pitchb;
				*p = colors[ck/dyb];
				*(p+a) = colors[8 - ck/dyb];
				ck += ckd1;
				if(ck < 0)
					ck = 0;
			}
			else
			{	pk+=twodxa_dyb;
				p += pitchb;
				*p = colors[ck/dyb];
				p += a;
				*p = colors[8 - ck/dyb];
				ck += ckd2;
				if(ck > dy8)
					ck = dy8;
			}
		}
	}
}

inline void calColor(DDSURFACEDESC* ddsd,WORD* colors,WORD color)
{	WORD f8,f4,f2;
	if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
	{	f8 = (color&0xc718)>>3;
		f4 = (color&0xe79c)>>2;
		f2 = (color&0xf7de)>>1;
	}
	else
	{	f8 = (color&0x6318)>>3;
		f4 = (color&0x739c)>>2;
		f2 = (color&0x7bde)>>1;
	}
	colors[1] = f2+f4+f8;//f8;
	colors[2] = f2+f4;//f4;
	colors[3] = f2;//f2;
	colors[4] = f2;//f2;
	colors[5] = f4+f8;//f2+f8;
	colors[6] = f4;//f2+f4;
	colors[7] = f8;//f2+f4+f8;
	colors[0] = colors[1];//f8;
	colors[8] = colors[7];
}

void lineS2(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{	int a,b,dx,dy,dxa,dyb,x,y,pk,twodxa,twodyb,ck,ckd1,ckd2;
	WORD colors[9];
	WORD colors1[9];
	WORD fixColor = 0;
	WORD* p = (WORD*)ddsd->lpSurface;
	long pitch = ddsd->lPitch>>1;
	long pitchb;
	x = x1;
	y = y1;;
	dx = x2 - x1;
	dy = y2 - y1;
	p += pitch * y + x;
	*p = color;
	if(dx > 0)
		a = 1;
	else if(dx < 0)
			a = -1;
		else
		{	if(dy > 0)
				b = 1;
			else if(dy < 0)
				b = -1;
			else
				return;
			pitchb = pitch * b;
			while(y!=y2)
			{	y+=b;
				p += pitchb;
				*p = color;
			}
			return;
		}
	if(dy > 0)
		b = 1;
	else if(dy < 0)
			b = -1;
		else
		{	while(x!=x2)
			{	x+=a;
				p += a;
				*p = color;
			}
			return;
		}
	WORD f8,f4,f2;
	colors1[0] = 0;
	colors1[1] = 0;
	colors1[2] = 0;
	colors1[3] = 0;
	colors1[4] = 0;
	colors1[5] = 0;
	colors1[6] = 0;
	colors1[7] = 0;
	colors1[8] = 0;
	if(ddsd->ddpfPixelFormat.dwGBitMask == 0x07e0)
	{	f8 = (color&0xc718)>>3;
		f4 = (color&0xe79c)>>2;
		f2 = (color&0xf7de)>>1;
	}
	else
	{	f8 = (color&0x6318)>>3;
		f4 = (color&0x739c)>>2;
		f2 = (color&0x7bde)>>1;
	}
	colors[1] = f8;
	colors[2] = f4;
	colors[3] = f2;
	colors[4] = f2;
	colors[5] = f2+f8;
	colors[6] = f2+f4;
	colors[7] = f2+f4+f8;
	colors[0] = f8;
	colors[8] = colors[7];
	dxa = dx*a;
	dyb = dy*b;
	int dx8 = dxa*8;
	int dy8 = dyb*8;
	int idx1,idx2;
	twodxa = 2*dxa;
	twodyb = 2*dyb;
	pitchb = pitch * b;
	if(dxa >= dyb)
	{	ckd1 = -(dyb*8);
		ckd2 = dxa*8 + ckd1;
		int twodyb_dxa = twodyb - twodxa;
		pk = twodyb - dxa;
		ck = 4*dxa-4*pk;
		while(x != x2)
		{	x+=a;
			if(pk<0)
			{	pk+=twodyb;
				p += a;
				idx1 = ck/dxa;
				idx2 = 8 - idx1;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}	
				*p = colors[idx1] + colors1[idx1];
				if(fixColor != *(p+pitchb));
				{	fixColor = *(p+pitchb);
					calColor(ddsd,colors1,fixColor);
				}	
				*(p+pitchb) = colors[idx2] + colors1[idx2];
				ck += ckd1;
				if(ck < 0)
					ck = 0;
			}
			else
			{	pk+=twodyb_dxa;
				p += a;
				idx1 = ck/dxa;
				idx2 = 8 - idx1;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}
				*p = colors[idx1] + colors1[idx1];
				p += pitchb;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}
				*p = colors[idx2] + colors1[idx2];;
				ck += ckd2;
				if(ck > dx8)
					ck = dx8;
			}
		}
	}
	else
	{	ckd1 = -(dxa*8);
		ckd2 = dyb*8 + ckd1;
		pk = twodxa - dyb;
		int twodxa_dyb = twodxa - twodyb;
		ck = 4*dyb-4*pk;
		while(y != y2)
		{	y+=b;
			if(pk<0)
			{	pk+=twodxa;
				p += pitchb;
				idx1 = ck/dyb;
				idx2 = 8 - idx1;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}	
				*p = colors[idx1] + colors1[idx1];
				if(fixColor != *(p+a));
				{	fixColor = *(p+a);
					calColor(ddsd,colors1,fixColor);
				}
				*(p+a) = colors[idx2] + colors1[idx2];
				ck += ckd1;
				if(ck < 0)
					ck = 0;
			}
			else
			{	pk+=twodxa_dyb;
				p += pitchb;
				idx1 = ck/dyb;
				idx2 = 8 - idx1;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}
				*p = colors[idx1] + colors1[idx1];
				p += a;
				if(fixColor != *p);
				{	fixColor = *p;
					calColor(ddsd,colors1,fixColor);
				}
				*p = colors[idx2] + colors1[idx2];
				ck += ckd2;
				if(ck > dy8)
					ck = dy8;
			}
		}
	}
}

void circle(DDSURFACEDESC* ddsd,int x,int y,int r,WORD color)
{	int xx,yy,x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,pk;
	xx = 0;
	yy = r;
	x1 = x , y1 = y + r;
	x2 = x , y2 = y + r;
	x3 = x , y3 = y - r;
	x4 = x , y4 = y - r;
	x5 = x + r , y5 = y;
	x6 = x - r , y6 = y;
	x7 = x + r , y7 = y;
	x8 = x - r , y8 = y;
	pk = 1 - r;
	writePixel(ddsd,x1,y1,color);
	writePixel(ddsd,x2,y2,color);
	writePixel(ddsd,x3,y3,color);
	writePixel(ddsd,x4,y4,color);
	writePixel(ddsd,x5,y5,color);
	writePixel(ddsd,x6,y6,color);
	writePixel(ddsd,x7,y7,color);
	writePixel(ddsd,x8,y8,color);
	while(xx < yy)
	{	xx++;
		x1++,x2--,x3++,x4--;
		y5++,y6++,y7--,y8--;
		if(pk < 0)
			pk+= 2*xx + 1;
		else
		{	yy--;
			y1--,y2--,y3++,y4++;
			x5--,x6++,x7--,x8++;
			pk+= 2*(xx - yy) + 1;
		}
		writePixel(ddsd,x1,y1,color);
		writePixel(ddsd,x2,y2,color);
		writePixel(ddsd,x3,y3,color);
		writePixel(ddsd,x4,y4,color);
		writePixel(ddsd,x5,y5,color);
		writePixel(ddsd,x6,y6,color);
		writePixel(ddsd,x7,y7,color);
		writePixel(ddsd,x8,y8,color);
	}
}

void circleFill(DDSURFACEDESC* ddsd,int x,int y,int r,WORD color)
{	int xx,yy,x1,x2,x3,x4,x5,x6,x7,x8,y1,y2,y3,y4,y5,y6,y7,y8,pk;
	int xx1,xx2,xx3,xx4,xx5,xx6,xx7,xx8;
	long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
	WORD* p=(WORD*)ddsd->lpSurface,*pt;
	long pitch = ddsd->lPitch>>1;
	xx = 0;
	yy = r;
	x1 = x , y1 = y + r;
	x2 = x , y2 = y + r;
	x3 = x , y3 = y - r;
	x4 = x , y4 = y - r;
	x5 = x + r , y5 = y;
	x6 = x - r , y6 = y;
	x7 = x + r , y7 = y;
	x8 = x - r , y8 = y;
	pk = 1 - r;
	writePixel(ddsd,x1,y1,color);
	writePixel(ddsd,x2,y2,color);
	writePixel(ddsd,x3,y3,color);
	writePixel(ddsd,x4,y4,color);
	xx5 = x5;
	xx6 = x6;
	if(xx5 >= 0 && x6 <= width)
	{	if(xx5 > width)
			xx5=xx7= width;
		if(xx6 < 0)
			xx6=xx8= 0;
		if(y5>=0&&y5<=height)
		{	pt = p + pitch*y6 + xx6;
			*pt = color;
			while(xx6<xx5)
			{	pt++;
				*pt = color;
				xx6++;
			}
		}
	}
	bool b1,b2;
	while(xx < yy)
	{	xx++;
		x1++,x2--,x3++,x4--;
		y5++,y6++,y7--,y8--;
		b2 = true;
		if(pk < 0)
		{	b1 = false;
			pk+= 2*xx + 1;
			writePixel(ddsd,x1,y1,color);
			writePixel(ddsd,x2,y2,color);
			writePixel(ddsd,x3,y3,color);
			writePixel(ddsd,x4,y4,color);
		}
		else
		{	yy--;
			b1 = true;
			y1--,y2--,y3++,y4++;
			x5--,x6++,x7--,x8++;
			pk+= 2*(xx - yy) + 1;
		}
		xx1=x1,xx2=x2,xx3=x3,xx4=x4,xx5=x5,xx6=x6,xx7=x7,xx8=x8;
		if(xx1 < 0)
		{	xx1=xx3= 0;
			b1 = false;
		}
		if(xx1 > width)

⌨️ 快捷键说明

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