#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_sx) x_s=r2->x; if (y_sy) 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_ex+r2->x_size-1) x_e=r2->x+r2->x_size-1; if (y_ey+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_sizex_size&&temp.y_sizey_size) { //新矩形长和宽都小于原矩形,结果不受影响 return 1; } else if((temp.x>r1->x&&(temp.x+temp.x_sizex+r1->x_size))|| (temp.y>r1->y&&(temp.y+temp.y_sizey+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; }