求单色位图上圆的圆心坐标,写了几天了,执行时出错,请各位大大进来帮忙调试看看
问题描述:求单色位图(bmp格式)上圆的圆心坐标,关于位图的部分相关资料以及1.bmp位图文件在附件里面。生成解决方案不会报错,执行时会报错,程序连续写了好几天了,第一次试水,不想打击信心,
请各位大大一定帮忙调试,先谢过了,(50分~
[local]1[/local]
#include
#include
#include
#include
#include
using namespace std;
const int sum=100;
int Pixel(int a,int b,int tpixel);
typedef struct tagitem
{
int leftx; //当前坐标靠左边点的x轴坐标
int rightx; //当前坐标靠右边点的x轴坐标
int bottomy; //当前坐标靠下面点y轴坐标
int topy; //当前坐标靠上面的点x轴坐标
int topxstatic; //用于保存上一个点的x轴
int topystatic; //用于保存上一个点的y轴
}item;
int main()
{
int bmpw;//图像宽度
int bmph;//图像高度
FILE *fp;
fp=fopen("1.bmp","rb");
fseek(fp,18L,0);
fread(&bmpw,sizeof(int),1,fp);
fread(&bmph,sizeof(int),1,fp);
//cout<<BMPW<<"\N";
//cout<<BMPH<<"\N";
item myitem[sum];//用于保存N个圆的最上(下左右)点的坐标
int i=0,j=0,k=0,z=0;
int pixel,temppixel;
int *toppixel=0,*leftpixel=0,*topleftpixel=0,*toprightpixel=0;
for(i=0;i<BMPH;I++) 扫描
{
for(j=0;j<BMPW;J++)
{
int t=54+int((i-1)*bmpw+j)/8;//计算需要指向的第几个字节
fseek(fp,t,0);//查找
fread(&temppixel,1,1,fp);//读出
pixel=Pixel(i,j,temppixel);//计算这个点的值(1或0)
if(pixel=1)//判断是否是白点
{
fseek(fp,(54+int((i-1)*bmpw+j-1)/8),t);//分别算出当前坐标的上、左、左上、右上的值(1或者0)
fread(&temppixel,1,1,fp);
*leftpixel=Pixel(i,j-1,temppixel);
fseek(fp,(54+int((i-2)*bmpw+j)/8),t);
fread(&temppixel,1,1,fp);
*toppixel=Pixel(i-1,j,temppixel);
fseek(fp,(54+int((i-2)*bmpw+j-1)/8),t);
fread(&temppixel,1,1,fp);
*topleftpixel=Pixel(i-1,j-1,temppixel);
fseek(fp,(54+int((i-2)*bmpw+j+1)/8),t);
fread(&temppixel,1,1,fp);
*toprightpixel=Pixel(i-1,j+1,temppixel);
if((*toppixel=1)||(*leftpixel=1)||(*topleftpixel=1)||(*toprightpixel=1))//判断是否是连通域
{
if(*leftpixel=0)//判断左点是不是白或黑
for(int n=0;n<K;N++) 如果为黑,此点则为另一个已经被扫描出来的集合的点,搜索出此集合
{
if(((j=myitem[n].topxstatic-1)||(j=myitem[n].topxstatic+1))&&(i=myitem[n].topystatic+1))
{
myitem[n].topystatic=i;
myitem[n].topxstatic=j;
z=n;
}
}
if(myitem[z].bottomy>i)//即时变动圆最上下左右点的值
myitem[z].bottomy=i;
if(myitem[z].leftx>j)
myitem[z].leftx=j;
if(myitem[z].rightx<J)
myitem[z].rightx=j;
if(myitem[z].topy<I)
myitem[z].topy=i;
}
else //新建并初始化一个圆
k++;
z=k;
myitem[k].topxstatic=j;
myitem[k].topystatic=i;
myitem[k].bottomy=i;
myitem[k].leftx=j;
myitem[k].topy=i;
myitem[k].rightx=j;
}
}
}
for(int n=0;n<K;N++)
{
cout<<"第"<<N<<"个圆的圆心坐标为:";
cout<<"("<<(myitem[n].leftx+myitem[n].rightx)/2<<","<<(myitem[n].bottomy+myitem[n].topy)/2<<")"<<ENDL;
}
fclose(fp);
return 0;
}
int Pixel(int a,int b,int tpixel)//求坐标点的值的函数
{
int pi,f;
pi=tpixel&(f=1)<<((a*b%8)-1);
if(pi!=0)
return 1;
else
return 0;
}