252 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			252 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "mywin_inc.h"
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/******************队列操作相关函数**********************/
 | 
						||
 | 
						||
 | 
						||
//初始化已实例化的队列
 | 
						||
void QUEUE_Init (QUEUE_Struct *q,int blocksize,int blocknum)
 | 
						||
{
 | 
						||
	q->queueByteSize=blocksize*blocknum;
 | 
						||
	q->blockByteSize=blocksize;
 | 
						||
	q->data=mymalloc (q->queueByteSize);
 | 
						||
	q->inPointer=q->data;
 | 
						||
	q->outPointer=q->data;
 | 
						||
}
 | 
						||
 | 
						||
//销毁队列
 | 
						||
void QUEUE_Delete (QUEUE_Struct *q)
 | 
						||
{
 | 
						||
	myfree(q->data);
 | 
						||
	q->data=0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//出队,如果队列为空,返回0,否则返回1
 | 
						||
int QUEUE_Out (QUEUE_Struct *q,void *buff)
 | 
						||
{
 | 
						||
	int ret=0;
 | 
						||
	if (q->data==0) return ret;
 | 
						||
	if ((q->outPointer!=q->inPointer)||q->fill==1)
 | 
						||
	{
 | 
						||
		ret=1;
 | 
						||
		mymemcpy (buff,q->outPointer,q->blockByteSize);
 | 
						||
		q->outPointer+=q->blockByteSize;
 | 
						||
		if (q->outPointer>=q->data+q->queueByteSize)
 | 
						||
			q->outPointer=q->data;
 | 
						||
		q->fill=0;//队列非满
 | 
						||
	}
 | 
						||
	return ret;
 | 
						||
}
 | 
						||
 | 
						||
//入队,如果队列已满,返回1并且本次入队失败
 | 
						||
int QUEUE_In (QUEUE_Struct *q,void *block)
 | 
						||
{
 | 
						||
	if (q->data==0) return 1;
 | 
						||
	if (q->fill==1) return 1;
 | 
						||
	mymemcpy (q->inPointer,block,q->blockByteSize);
 | 
						||
	q->inPointer+=q->blockByteSize;
 | 
						||
	if (q->inPointer>=q->data+q->queueByteSize)
 | 
						||
		q->inPointer=q->data;
 | 
						||
	if (q->inPointer==q->outPointer)//如果入队指针和出队指针相等,则队列满
 | 
						||
		q->fill=1;
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//查看初始化
 | 
						||
int QUEUE_CheckStart (QUEUE_Struct *q)
 | 
						||
{
 | 
						||
	if (q->data==0) return 1;
 | 
						||
	q->checkPointer=q->checkPointer=q->outPointer;
 | 
						||
	if ((q->checkPointer!=q->inPointer)||q->fill==1)
 | 
						||
		q->checkEnd=0;
 | 
						||
	else q->checkEnd=1;
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
//查看数据,还有数据返回,没有数据返回0
 | 
						||
void *QUEUE_Check (QUEUE_Struct *q) 
 | 
						||
{
 | 
						||
	void *ret=0;
 | 
						||
	if (q->data==0) return ret;
 | 
						||
	if (q->checkEnd==0)
 | 
						||
	{
 | 
						||
		ret=q->checkPointer;
 | 
						||
		q->checkPointer+=q->blockByteSize;
 | 
						||
		if (q->checkPointer>=q->data+q->queueByteSize)
 | 
						||
			q->outPointer=q->data;
 | 
						||
		if (q->checkPointer==q->inPointer) q->checkEnd=1;
 | 
						||
	}
 | 
						||
	return ret;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
/****************坐标计算*************************/
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//判断两个点的距离是否超过了半径,没超过返回0,超过了返回非0
 | 
						||
int POS_RoundPix (int r,int x1,int y1,int x2,int y2)
 | 
						||
{
 | 
						||
	if ((x1-x2>r)||(x2-x1>r))
 | 
						||
		return -1;
 | 
						||
	if ((y1-y2>r)||(y2-y1>r))
 | 
						||
		return -1;
 | 
						||
	return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//判断指定点是否在矩形内,1,在,0,不在
 | 
						||
int POS_InRect (int rect_x,int rect_y,int rect_x_size,int rect_y_size,int x,int y)
 | 
						||
{
 | 
						||
	if (((x>=rect_x)&&(x<=rect_x+rect_x_size-1))&&
 | 
						||
			((y>=rect_y)&&(y<=rect_y+rect_y_size-1)))
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	else
 | 
						||
	{
 | 
						||
		return 0;
 | 
						||
	}
 | 
						||
}	
 | 
						||
 | 
						||
 | 
						||
//两个矩形求交集,有交集返回1
 | 
						||
int POS_RectIntersection (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
 | 
						||
{
 | 
						||
	//取得新矩形的左上角
 | 
						||
	int x_s=r1->x;
 | 
						||
	int y_s=r1->y;
 | 
						||
	if (x_s<r2->x)
 | 
						||
		x_s=r2->x;
 | 
						||
	if (y_s<r2->y)
 | 
						||
		y_s=r2->y;
 | 
						||
	
 | 
						||
	//取得新矩形的右下角
 | 
						||
	int x_e=r1->x+r1->x_size-1;
 | 
						||
	int y_e=r1->y+r1->y_size-1;
 | 
						||
	if (x_e>r2->x+r2->x_size-1)
 | 
						||
		x_e=r2->x+r2->x_size-1;
 | 
						||
	if (y_e>r2->y+r2->y_size-1)
 | 
						||
		y_e=r2->y+r2->y_size-1;
 | 
						||
	out->x=x_s;
 | 
						||
	out->y=y_s;
 | 
						||
	out->x_size=x_e-x_s+1;
 | 
						||
	out->y_size=y_e-y_s+1;
 | 
						||
	
 | 
						||
	if ((y_e>=y_s)&&(x_e>=x_s))
 | 
						||
	{
 | 
						||
		return 1;
 | 
						||
	}
 | 
						||
	else
 | 
						||
	{
 | 
						||
		return 0;
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
//求一个大矩形,包含两个小矩形
 | 
						||
int POS_RectContain (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
 | 
						||
{
 | 
						||
	//取得新矩形的左上角
 | 
						||
	int x_s=r1->x;
 | 
						||
	int y_s=r1->y;
 | 
						||
	if (x_s>r2->x)
 | 
						||
		x_s=r2->x;
 | 
						||
	if (y_s>r2->y)
 | 
						||
		y_s=r2->y;
 | 
						||
 | 
						||
	//取得新矩形的右下角
 | 
						||
	int x_e=r1->x+r1->x_size-1;
 | 
						||
	int y_e=r1->y+r1->y_size-1;
 | 
						||
	if (x_e<r2->x+r2->x_size-1)
 | 
						||
		x_e=r2->x+r2->x_size-1;
 | 
						||
	if (y_e<r2->y+r2->y_size-1)
 | 
						||
		y_e=r2->y+r2->y_size-1;
 | 
						||
	out->x=x_s;
 | 
						||
	out->y=y_s;
 | 
						||
	out->x_size=x_e-x_s+1;
 | 
						||
	out->y_size=y_e-y_s+1;
 | 
						||
	return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//两个矩形相减,如果r2大于r1,则输出为空矩形
 | 
						||
int POS_RectSub (RECT_Struct *out,RECT_Struct *r1,RECT_Struct *r2)
 | 
						||
{
 | 
						||
	RECT_Struct temp={0};
 | 
						||
	out->x=r1->x;
 | 
						||
	out->y=r1->y;
 | 
						||
	out->x_size=r1->x_size;
 | 
						||
	out->y_size=r1->y_size;
 | 
						||
	
 | 
						||
	if(POS_RectIntersection(&temp,r1,r2))
 | 
						||
	{
 | 
						||
		//如果两个矩形有交集
 | 
						||
		if(temp.x_size<r1->x_size&&temp.y_size<r1->y_size)
 | 
						||
		{
 | 
						||
			//新矩形长和宽都小于原矩形,结果不受影响
 | 
						||
			return 1;
 | 
						||
		}
 | 
						||
		else if((temp.x>r1->x&&(temp.x+temp.x_size<r1->x+r1->x_size))||
 | 
						||
			(temp.y>r1->y&&(temp.y+temp.y_size<r1->y+r1->y_size)))
 | 
						||
		{
 | 
						||
			//新矩形在原矩形的中间,结果不受影响
 | 
						||
			return 1;
 | 
						||
		}
 | 
						||
		else if(POS_RectEqual(&temp,r1))
 | 
						||
		{
 | 
						||
			//新矩形与原矩形相等,结果返回0
 | 
						||
			out->x=0;
 | 
						||
			out->x_size=0;
 | 
						||
			out->y=0;
 | 
						||
			out->y_size=0;
 | 
						||
			return 0;
 | 
						||
		}
 | 
						||
		else if(temp.x_size==r1->x_size)
 | 
						||
		{
 | 
						||
			//新矩形与原矩形的宽相等
 | 
						||
			if(r1->y==temp.y)
 | 
						||
				out->y+=temp.y_size;
 | 
						||
			out->y_size-=temp.y_size;
 | 
						||
			return 1;
 | 
						||
		}
 | 
						||
		else if(temp.y_size==r1->y_size)
 | 
						||
		{
 | 
						||
			//新矩形与原矩形的高相等
 | 
						||
			if(r1->x==temp.x)
 | 
						||
				out->x+=temp.x_size;
 | 
						||
			out->x_size-=temp.x_size;
 | 
						||
			return 1;
 | 
						||
		}
 | 
						||
	}
 | 
						||
	
 | 
						||
	//其他情况,结果不受影响
 | 
						||
	return 1;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//判断两个矩形相等,是返回1,不是返回0
 | 
						||
int POS_RectEqual (RECT_Struct *r1,RECT_Struct *r2)
 | 
						||
{
 | 
						||
	if(r1->x==r2->x&&r1->y==r2->y&&r1->x_size==r2->x_size&&r1->y_size==r2->y_size)
 | 
						||
		return 1;
 | 
						||
	else
 | 
						||
		return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 |