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

📄 gui16.cpp

📁 人工智能遗传算法,经过改进,希望对大家有帮助,常常联系啊.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			xx1=xx3= width;
		if(xx2 < 0)
			xx2=xx4= 0;
		if(xx2 > width)
		{	xx2=xx4= width;
			b1 = false;
		}
		if(xx5 < 0)
		{	xx5=xx7= 0;
			b2 = false;
		}
		if(xx5 > width)
			xx5=xx7= width;
		if(xx6 < 0)
			xx6=xx8= 0;
		if(xx6 > width)
		{	xx6=xx8= width;
			b2 = false;
		}
		if(b1)
		{	if(y1>=0&&y1<=height)
			{	pt = p + pitch*y2 + xx2;
				*pt = color;
				while(xx2<xx1)
				{	pt++;
					*pt = color;
					xx2++;
				}
			}
			if(y3>=0&&y3<=height)
			{	pt = p + pitch*y4 + xx4;
				*pt = color;
				while(xx4<xx3)
				{	pt++;
					*pt = color;
					xx4++;
				}
			}
		}
		if(b2)
		{	if(y5>=0&&y5<=height)
			{	pt = p + pitch*y6 + xx6;
				*pt = color;
				while(xx6<xx5)
				{	pt++;
					*pt = color;
					xx6++;
				}
			}
			if(y7>=0&&y7<=height)
			{	pt = p + pitch*y8 + xx8;
				*pt = color;
				while(xx8<xx7)
				{	pt++;
					*pt = color;
					xx8++;
				}
			}
		}
	}
}

void ellipse(DDSURFACEDESC* ddsd,int xx1,int yy1,int xx2,int yy2,WORD color)
{	int xx,yy,x1,x2,x3,x4,y1,y2,y3,y4,pk;
	int xc,yc,rx,ry,rx2,ry2,tworx2,twory2,px,py;
	xc = (xx1 + xx2) >> 1;
	yc = (yy1 + yy2) >> 1;
	if(xx1 > xx2)
		rx = (xx1 - xx2) >> 1;
	else
		rx = (xx2 - xx1) >> 1;
	if(yy1 > yy2)
		ry = (yy1 - yy2) >> 1;
	else
		ry = (yy2 - yy1) >> 1;
	rx2 = rx * rx;
	ry2 = ry * ry;
	tworx2 = rx2<<1;
	twory2 = ry2<<1;
	xx = 0;
	yy = ry;
	px = 0;
	py = tworx2 * yy;
	pk = ry2 - rx2*ry + rx2>>2; 
	x1 = xc , y1 = yc + ry;
	x2 = xc , y2 = yc + ry;
	x3 = xc , y3 = yc - ry;
	x4 = xc , y4 = yc - ry;
	writePixel(ddsd,x1,y1,color);
	writePixel(ddsd,x2,y2,color);
	writePixel(ddsd,x3,y3,color);
	writePixel(ddsd,x4,y4,color);
	while(px < py)
	{	xx++;
		px+= twory2;
		x1++,x2--,x3++,x4--;
		if(pk < 0)
			pk+= ry2 + px;
		else
		{	yy--;
			y1--,y2--,y3++,y4++;
			py -= tworx2;
			pk+= ry2 + px - py;
		}
		writePixel(ddsd,x1,y1,color);
		writePixel(ddsd,x2,y2,color);
		writePixel(ddsd,x3,y3,color);
		writePixel(ddsd,x4,y4,color);
	}
	pk = (int)sqrt(((ry2*(xx*2+1)*(xx*2+1))>>2) + rx2*(yy-1)*(yy-1) - rx2*ry2);
	while(yy>0)
	{	yy--;
		y1--,y2--,y3++,y4++;
		py-=tworx2;
		if(pk>0)
		{	pk+=rx2 - py;
		}
		else
		{	xx++;
			x1++,x2--,x3++,x4--;
			px+=twory2;
			pk+=rx2-py+px;
		}
		writePixel(ddsd,x1,y1,color);
		writePixel(ddsd,x2,y2,color);
		writePixel(ddsd,x3,y3,color);
		writePixel(ddsd,x4,y4,color);
	}
}

void ellipseFill(DDSURFACEDESC* ddsd,int a1,int b1,int a2,int b2,WORD color)
{	int xx,yy,x1,x2,x3,x4,y1,y2,y3,y4,pk;
	int xc,yc,rx,ry,rx2,ry2,tworx2,twory2,px,py;
	int xx1,xx2,xx3,xx4;
	long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
	long pitch = ddsd->lPitch>>1;
	WORD* p=(WORD*)ddsd->lpSurface,*pt;
	bool b;
	xc = (a1 + a2) >> 1;
	yc = (b1 + b2) >> 1;
	if(a1 > a2)
		rx = (a1 - a2) >> 1;
	else
		rx = (a2 - a1) >> 1;
	if(b1 > b2)
		ry = (b1 - b2) >> 1;
	else
		ry = (b2 - b1) >> 1;
	rx2 = rx * rx;
	ry2 = ry * ry;
	tworx2 = rx2<<1;
	twory2 = ry2<<1;
	xx = 0;
	yy = ry;
	px = 0;
	py = tworx2 * yy;
	pk = ry2 - rx2*ry + rx2>>2; 
	x1 = xc , y1 = yc + ry;
	x2 = xc , y2 = yc + ry;
	x3 = xc , y3 = yc - ry;
	x4 = xc , y4 = yc - ry;
	writePixel(ddsd,x1,y1,color);
	writePixel(ddsd,x3,y3,color);
	while(px < py)
	{	xx++;
		px+= twory2;
		x1++,x2--,x3++,x4--;
		if(pk < 0)
		{	b = false;
			pk+= ry2 + px;
			writePixel(ddsd,x1,y1,color);
			writePixel(ddsd,x2,y2,color);
			writePixel(ddsd,x3,y3,color);
			writePixel(ddsd,x4,y4,color);
		}
		else
		{	yy--;
			b = true;
			y1--,y2--,y3++,y4++;
			py -= tworx2;
			pk+= ry2 + px - py;
		}
		xx1=x1,xx2=x2,xx3=x3,xx4=x4;
		if(xx1 < 0 || xx2 > width)
			b = false;
		if(xx1 > width)
			xx1=xx3=width;
		if(xx2 < 0)
			xx2=xx4=0;
		if(b)
		{	if(y1>=0&&y1<=height)
			{	pt = p + pitch*y2 + xx2;
				*pt = color;
				while(xx2<xx1)
				{	pt++;
					*pt = color;
					xx2++;
				}
			}
			if(y3>=0&&y3<=height)
			{	pt = p + pitch*y4 + xx4;
				*pt = color;
				while(xx4<xx3)
				{	pt++;
					*pt = color;
					xx4++;
				}
			}
		}
	}
	pk = (int)sqrt(((ry2*(xx*2+1)*(xx*2+1))>>2) + rx2*(yy-1)*(yy-1) - rx2*ry2);
	while(yy>0)
	{	b = true;
		yy--;
		y1--,y2--,y3++,y4++;
		py-=tworx2;
		if(pk>0)
		{	pk+=rx2 - py;
		}
		else
		{	xx++;
			x1++,x2--,x3++,x4--;
			px+=twory2;
			pk+=rx2-py+px;
		}
		xx1=x1,xx2=x2,xx3=x3,xx4=x4;
		if(xx1 < 0 || xx2 > width)
			b = false;
		if(xx1 > width)
			xx1=xx3=width;
		if(xx2 < 0)
			xx2=xx4=0;
		if(b)
		{	if(y1>=0&&y1<=height)
			{	pt = p + pitch*y2 + xx2;
				*pt = color;
				while(xx2<xx1)
				{	pt++;
					*pt = color;
					xx2++;
				}
			}
			if(y3>=0&&y3<=height)
			{	pt = p + pitch*y4 + xx4;
				*pt = color;
				while(xx4<xx3)
				{	pt++;
					*pt = color;
					xx4++;
				}
			}
		}
	}
}

void drawRect(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{	int chg,xx1,xx2,yy1,yy2,x,y;
	long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
	long pitch = ddsd->lPitch>>1;
	WORD* p=(WORD*)ddsd->lpSurface,*pt;
	if(x1 > x2)
	{	chg = x1;
		x1 = x2;
		x2 = chg;
	}
	if(y1 > y2)
	{	chg = y1;
		y1 = y2;
		y2 = chg;
	}
	if(x1 > width || x2 < 0 || y1 > height || y2 < 0)
		return;
	xx1 = x1;xx2 = x2;yy1 = y1;yy2 = y2;
	if(x1<0)
		xx1 = 0;
	if(x2>width)
		xx2 = width;
	if(y1<0)
		yy1 = 0;
	if(y2>height)
		yy2 = height;
	if(y1>=0)
	{	pt = p + pitch*y1 + xx1;
		*pt = color;
		x = xx1;
		while(x<xx2)
		{	pt++;
			*pt = color;
			x++;
		}
	}
	if(y2<=height)
	{	pt = p + pitch*y2 + xx1;
		*pt = color;
		x = xx1;
		while(x<xx2)
		{	pt++;
			*pt = color;
			x++;
		}
	}
	if(x1 >= 0)
	{	pt = p + pitch*yy1 + x1;
		*pt = color;
		y = yy1;
		while(y<yy2)
		{	pt+=pitch;
			*pt = color;
			y++;
		}
	}
	if(x2 <= width)
	{	pt = p + pitch*yy1 + x2;
		*pt = color;
		y = yy1;
		while(y<yy2)
		{	pt+=pitch;
			*pt = color;
			y++;
		}
	}
}

void rectFill(DDSURFACEDESC* ddsd,int x1,int y1,int x2,int y2,WORD color)
{	int chg,x;
	long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
	long pitch1,pitch = ddsd->lPitch>>1;
	WORD* p=(WORD*)ddsd->lpSurface;
	if(x1 > x2)
	{	chg = x1;
		x1 = x2;
		x2 = chg;
	}
	if(y1 > y2)
	{	chg = y1;
		y1 = y2;
		y2 = chg;
	}
	if(x1 > width || x2 < 0 || y1 > height || y2 < 0)
		return;
	if(x1<0)
		x1 = 0;
	if(x2>width)
		x2 = width;
	if(y1<0)
		y1 = 0;
	if(y2>height)
		y2 = height;
	p +=pitch*y1 + x1;
	pitch1 = pitch-x2+x1;
	while(y1<=y2)
	{	*p=color;
		x = x1;
		while(x<x2)
		{	p++;
			x++;
			*p=color;
		}
		y1++;
		p+=pitch1;
	}
}

void drawPolygon(DDSURFACEDESC* ddsd,POINT* points,int num,WORD color)
{	int i;
	for(i=0;i<num-1;i++)
		line(ddsd,points[i].x,points[i].y,points[i+1].x,points[i+1].y,color);
	line(ddsd,points[0].x,points[0].y,points[num-1].x,points[num-1].y,color);
}

#define INDEX_FORWORD(index)	index = (index + 1) % num;
#define INDEX_BACKWORD(index)	index = (index - 1 + num) % num;
void polygonFill(DDSURFACEDESC* ddsd,POINT* points,int num,WORD color)
{	int lx1,ly1,lx2,ly2,rx1,ry1,rx2,ry2,ldx,ldy,rdx,rdy;
	int minY,maxY,lindex,rindex,lxinc,rxinc,lxadd,rxadd,lxsgn,rxsgn,lxsum,rxsum;
	int i,x1,x2;
	long width=ddsd->dwWidth-1,height=ddsd->dwHeight-1;
	long pitch = ddsd->lPitch>>1;
	WORD* p=(WORD*)ddsd->lpSurface,*pt;
	if(num < 3)
		return;
	rindex = lindex = 0;
	maxY=minY=points[0].y;
	for(i=0;i<num;i++)
	{	if(points[i].y<minY)
			minY = points[lindex = i].y;
		else if(points[i].y > maxY)
				maxY = points[i].y;
	}
	if(minY == maxY)
		return;
	rindex = lindex;
	while(points[lindex].y == minY)
		//INDEX_BACKWORD(lindex);
		INDEX_FORWORD(lindex);
	INDEX_BACKWORD(lindex);
	//INDEX_FORWORD(lindex);
	while(points[rindex].y == minY)
		//INDEX_FORWORD(rindex);
		INDEX_BACKWORD(rindex);
	//INDEX_BACKWORD(rindex);
	INDEX_FORWORD(rindex);
	lx1 = points[lindex].x;
	ly1 = points[lindex].y;
	INDEX_FORWORD(lindex);
	//INDEX_BACKWORD(lindex);
	lx2 = points[lindex].x;
	ly2 = points[lindex].y;
	ldx = lx2 - lx1;
	ldy = ly2 - ly1;
	lxsgn = (ldx >= 0)?1:-1;
	if(ldy>0)
	{	lxadd = ldx/ldy;
		lxinc = (ldx%ldy)*lxsgn;
	}
	rx1 = points[rindex].x;
	ry1 = points[rindex].y;
	INDEX_BACKWORD(rindex);
	//INDEX_FORWORD(rindex);
	rx2 = points[rindex].x;
	ry2 = points[rindex].y;
	rdx = rx2 - rx1;
	rdy = ry2 - ry1;
	rxsgn = (rdx >= 0)?1:-1;
	if(rdy>0)
	{	rxadd = rdx/rdy;
		rxinc = (rdx%rdy)*rxsgn;
	}
	lxsum = 0;
	rxsum = 0;
	minY++;
	p += pitch*minY;
	while(minY <= maxY)
	{	lxsum+=lxinc;
		lx1+=lxadd;
		if(lxsum >= ldy)
		{	lx1+=lxsgn;
			lxsum -= ldy;
		}
		rxsum+=rxinc;
		rx1+=rxadd;
		if(rxsum >= rdy)
		{	rx1+=rxsgn;
			rxsum -= rdy;
		}
		x1 = lx1,x2 = rx1 - 1;
		if(minY>=0&&minY<=height&&x1<=width&&x2>=0&&x2>=x1)
		{	if(x1<0)
				x1=0;
			if(x2>width)
				x2=width;
			pt = p + x1;	
			*pt = color;
			while(x1<x2)
			{	pt++;
				*pt = color;
				x1++;
			}
		}
		if(minY == ly2)
		{	do{	
				lx1 = points[lindex].x;
				ly1 = points[lindex].y;
				INDEX_FORWORD(lindex);
				//INDEX_BACKWORD(lindex);
				lx2 = points[lindex].x;
				ly2 = points[lindex].y;
			}while(ly2 == ly1);
			ldx = lx2 - lx1;
			ldy = ly2 - ly1;
			lxsgn = (ldx >= 0)?1:-1;
			if(ldy>0)
			{	lxadd = ldx/ldy;
				lxinc = (ldx%ldy)*lxsgn;
			}
		}
		if(minY == ry2)
		{	do{
				rx1 = points[rindex].x;
				ry1 = points[rindex].y;
				INDEX_BACKWORD(rindex);
				//INDEX_FORWORD(rindex);
				rx2 = points[rindex].x;
				ry2 = points[rindex].y;
			}while(ry2 == ry1);
			rdx = rx2 - rx1;
			rdy = ry2 - ry1;
			rxsgn = (rdx >= 0)?1:-1;
			if(rdy>0);
			{	rxadd = rdx/rdy;
				rxinc = (rdx%rdy)*rxsgn;
			}
		}
		minY++;
		p += pitch;
	}
}

bool loadBitmap(LPDIRECTDRAWSURFACE FAR * lpsurface,LPCSTR fileName)
{	BMPHEAD head;
	unsigned long bufLen,width,height;
	unsigned char* buf;
	DDSURFACEDESC       ddsd;
	HRESULT             ddrval;
	ifstream ifs(fileName,ios::binary);
	if(!ifs)
		return FALSE;
	ifs.read((char*)&head,sizeof(BMPHEAD));
	if(!ifs.good())
		return FALSE;
	width = head.width;
	height = head.height;
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS | 
				   DDSD_WIDTH|
				   DDSD_HEIGHT;
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |DDSCAPS_SYSTEMMEMORY ;
	ddsd.dwWidth = width;
	ddsd.dwHeight = height;
	ddrval = lpDD->CreateSurface( &ddsd, lpsurface, NULL );
	if(ddrval != DD_OK)
		return FALSE;
	bufLen = (width*3 + 3) & 0xfffffffc;
	if((buf = new unsigned char[bufLen]) == NULL)
		return FALSE;
	while ((ddrval=(*lpsurface)->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING)
				;
	WORD* p = (WORD*)ddsd.lpSurface + width*height - 1 - width;
	for(UINT i=0;i<height;i++)
	{	ifs.read(buf,bufLen);
		if(ifs.bad())
		{	(*lpsurface)->Unlock(NULL);
			return FALSE;
		}
		for(UINT j=0;j<width;j++)
		{	*p++ = (((WORD)buf[j*3]&0xfff8)>>3) |
				   (((WORD)buf[j*3+1]&0xfffc)<<3)|
				   (((WORD)buf[j*3+2]&0xfff8)<<8);
		}
		p -= width*2;
	}
	(*lpsurface)->Unlock(NULL);
	delete[] buf;
	return TRUE;
}

⌨️ 快捷键说明

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