#include "contrast.h"
void CheckPoint();
Position PosBmp(PicBack Tp)
{
int temx=0,temy=0;//格子移动位置
int Mpstate=1;//格子指向(默认指向东)
int temxm=0,temym=0;//存放黑块最大xy值
int temxmin=0,temymin=0;//存放黑块最小xy值
int Msteps=0;//格子移动步数
int Rtime=0;//黑块消除运行次数
int BMove=1;
int MAddx=1;
int Delxmin;
int Delxmax;
int Delymin;
int Delymax;
Position orixy;//存放角点
Position xy;//函数返回点坐标
orixy.x=0;
orixy.y=0;//初始化角点
int Temorix;
int Temoriy;
//检测角点
for(int y=0;y<Tp.bmpHeight;y++)
{
for(int x=0;x<Tp.bmpWidth;x++)
{
if(*(Tp.pBmpBufPictemp+y*Tp.lineByte+x*3)==0)//该点为角点
{
orixy.x=x;//保存角点
orixy.y=y;
x=Tp.bmpWidth-1;
y=Tp.bmpHeight-1;
}
}
}
//角点副本
Temorix=temxmin=temx=orixy.x;
Temoriy=temymin=temy=orixy.y;
//处理角点特殊情况
if(*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx-1)*3)==255
&&*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==255)
Mpstate=2;
//cout<<"角点坐标X:"<<orixy.x<<" Y:"<<285-orixy.y<<endl;
//******************************************
//1.东 2.北 3.西 4.南
while(BMove)//判定角点是否取得最优值
{
do//*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==0
{
switch (Mpstate )
{
case 1:
if(temy==0)//当角点在底边时
{
if(*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==0)//前方为黑色则前进
{
temx+=1;
Msteps++;
if(temx>=temxm)
temxm=temx;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temx==Tp.bmpWidth-1)
{
Mpstate=2;//格子朝北
//cout<<"格子原地朝北转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==255)//前方为白色则朝北转向
{
Mpstate=2;//格子朝北
//cout<<"格子原地朝北转向"<<endl;
}
}
else//不在边缘时
{
if(temx==Tp.bmpWidth-1)
{
Mpstate=2;//格子朝北
//cout<<"格子原地朝北转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==255)//前方为白色则朝北转向
{
Mpstate=2;//格子朝北
//cout<<"格子原地朝北转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+temy*Tp.lineByte+(temx+1)*3)==0
&& *(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==255 )//前方为黑色则前进
{
temx+=1;
Msteps++;
if(temx>=temxm)
temxm=temx;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temx==Tp.bmpWidth-1)
{
Mpstate=2;//格子朝北
//cout<<"格子原地朝北转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==0)//格子下方为黑色则朝南进一
{
Mpstate=4;
temy-=1;
Msteps++;
if(temy<=temymin)
temymin=temy;
//cout<<"格子原地朝南转向"<<endl;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
break;
}
}//else结束
break;
case 2:
if(temx==Tp.bmpWidth-1)//当角点在右边时
{
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==0)//前方为黑色则前进
{
temy+=1;
Msteps++;
if(temy>=temym)
temym=temy;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temy==Tp.bmpHeight-1)
{
Mpstate=3;//格子朝西
//cout<<"格子原地朝西转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==255)//前方为白色则朝西转向
{
Mpstate=3;//格子朝西
//cout<<"格子原地朝西转向"<<endl;
}
}
else//不在边缘时
{
if(temy==Tp.bmpHeight-1)
{
Mpstate=3;//格子朝西
//cout<<"格子原地朝西转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==255)//前方为白色则朝西转向
{
Mpstate=3;//格子朝北
//cout<<"格子原地朝西转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==0
&& *(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx+1)*3)==255 )//前方为黑色则前进
{
temy+=1;
Msteps++;
if(temy>=temym)
temym=temy;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temy==Tp.bmpHeight-1)
{
Mpstate=3;//格子朝西
//cout<<"格子原地朝西转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx+1)*3)==0)//格子下方为黑色则朝南进一
{
Mpstate=1;
temx+=1;
Msteps++;
if(temx>=temxm)
temxm=temx;
//cout<<"格子朝东转向进一格"<<endl;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
break;
}
}//else结束
break;
case 3:
if(temy==0)
{
if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==0)//前方为黑色则前进
{
temx-=1;
Msteps++;
if(temx<=temxmin)
temxmin=temx;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
break;
}
}
if(temy==Tp.bmpHeight-1)//当角点在右边时
{
if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==0)//前方为黑色则前进
{
temx-=1;
Msteps++;
if(temx<=temxmin)
temxmin=temx;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temx==0)
{
Mpstate=4;//格子朝南
//cout<<"格子原地朝南转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==255)//前方为白色则朝西转向
{
Mpstate=4;//格子朝北
//cout<<"格子原地朝南转向"<<endl;
}
}
else//不在边缘时
{
if(temx==0)
{
Mpstate=4;//格子朝南
//cout<<"格子原地朝南转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==255)//前方为白色则朝西转向
{
Mpstate=4;//格子朝南
//cout<<"格子原地朝南转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==255
&& *(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==0 )//前方为黑色则前进
{
temx-=1;
Msteps++;
if(temx<=temxmin)
temxmin=temx;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temx==0)
{
Mpstate=4;//格子朝南
//cout<<"格子原地朝南转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy+1)*Tp.lineByte+(temx)*3)==0)//格子下方为黑色则朝南进一
{
Mpstate=1;
temy+=1;
Msteps++;
if(temy>=temym)
temym=temy;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
break;
}
}//else结束
break;
case 4:
if(temx==0)//当角点在左边界时
{
if(*(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==0)//前方为黑色则前进
{
temy-=1;
Msteps++;
if(temy<=temymin)
temymin=temy;
//cout<<"格子坐标X:"<<temx<<" Y:"<<285-temy<<endl;
}
if(temy==0)
{
Mpstate=1;//格子朝南
//cout<<"格子原地朝南转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==255)//前方为白色则朝东转向
{
Mpstate=1;//格子朝北
//cout<<"格子原地朝南转向"<<endl;
}
}
else//不在边缘时
{ if(temy==0 )
{if(*(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==255)
{ Mpstate=1;//格子朝东
//cout<<"格子原地朝东转向"<<endl;
break;}
else
{
Mpstate=3;//格子朝东
//cout<<"格子原地朝西转向"<<endl;
break;}
}
if(*(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==255)//前方为白色则朝东转向
{
Mpstate=1;//格子朝东
//cout<<"格子原地朝东转向"<<endl;
break;
}
if(*(Tp.pBmpBufPictemp+(temy-1)*Tp.lineByte+(temx)*3)==0
&& *(Tp.pBmpBufPictemp+(temy)*Tp.lineByte+(temx-1)*3)==255 )//前方为黑色则前进
{
temy-=1;
Msteps++;
if(temy<=temymin)
temymin=temy;
//cout<<"格子坐标
QQ找茬位置识别(C++标准)
4星 · 超过85%的资源 需积分: 9 198 浏览量
2010-06-06
10:15:11
上传
评论
收藏 2.53MB ZIP 举报
neekychan
- 粉丝: 7
- 资源: 3