- /*
- *=====================================================================================
- *
- *Filename:Picture1.cpp
- *
- *Description:图像处理,第一次实现
- *
- *Version:1.0
- *Created:2009年01月08日12时56分35秒
- *Revision:none
- *Compiler:gcc
- *
- *Author:LiWeiJian(mn),lwj1396@163.com
- *Company:hunanuniversity
- *
- *=====================================================================================
- */
- #include<iostream>
- usingnamespacestd;
- classPicture
- {
- friendostream&operator<<(ostream&,constPicture&);
- friendPictureframe(constPicture&);
- friendPictureoperator&(constPicture&,constPicture&);
- friendPictureoperator|(constPicture&,constPicture&);
- public:
- Picture();
- Picture(constchar*const*,int);
- Picture(constPicture&);
- ~Picture();
- Picture&operator=(constPicture&);
- intHeight()const{returnthis->height;}
- intWidth()const{returnthis->width;}
- private:
- intheight,width;
- char*data;
- voidcopyblock(int,int,constPicture&);
- voidclear(int,int,int,int);
- char&position(introw,intcol){returndata[row*width+col];}
- charposition(introw,intcol)const{returndata[row*width+col];}
- voidinit(inth,intw){height=h;width=w;data=newchar[height*width];}
- staticintmax(intn,intm){returnm>n?m:n;}
- };
- Picture::
- Picture():height(0),width(0),data(0)
- {}
- Picture::
- Picture(constchar*const*array,intn)//n为列数
- {
- intw=0;
- for(inti=0;i<n;i++)
- w=max(w,strlen(array[i]));
- init(n,w);
- for(inti=0;i<n;i++)
- {
- constchar*src=array[i];
- intlen=strlen(src);
- intj=0;
- while(j<len)
- {
- position(i,j)=src[j];
- j++;
- }
- while(j<width)
- {
- position(i,j)='';
- j++;
- }
- }
- }
- Picture::
- Picture(constPicture&p):
- height(p.Height()),width(p.Width()),data(newchar[p.Height()*p.Width()])
- {
- copyblock(0,0,p);
- }
- Picture&
- Picture::operator=(constPicture&p)
- {
- if(this!=&p)//IMPORTANT
- {
- delete[]data;
- init(p.Height(),p.Width());
- copyblock(0,0,p);
- }
- return*this;
- }
- Picture::
- ~Picture()
- {
- delete[]data;
- }
- voidPicture::
- copyblock(introw,intcol,constPicture&p)
- {
- inth=p.Height();
- intw=p.Width();
- for(inti=0;i<h;i++)
- for(intj=0;j<w;j++)
- position(i+row,j+col)=p.position(i,j);
- }
- voidPicture::
- clear(intr1,intc1,intr2,intc2)
- {
- for(intr=r1;r<r2;++r)
- for(intc=c1;c<c2;c++)
- position(r,c)='';
- }
- ostream&operator<<(ostream&o,constPicture&p)
- {
- inth=p.Height();
- intw=p.Width();
- for(inti=0;i<h;i++)
- {
- for(intj=0;j<w;j++)
- o<<p.position(i,j);
- o<<endl;
- }
- returno;
- }
- Pictureframe(constPicture&p)
- {
- Picturer;
- r.init(p.Height()+2,p.Width()+2);
- for(inti=1;i<r.height-1;++i)
- {
- r.position(i,0)='|';
- r.position(i,r.width-1)='|';
- }
- for(intj=1;j<r.width-1;++j)
- {
- r.position(0,j)='-';
- r.position(r.height-1,j)='-';
- }
- r.position(0,0)='+';
- r.position(0,r.width-1)='+';
- r.position(r.height-1,0)='+';
- r.position(r.height-1,r.width-1)='+';
- r.copyblock(1,1,p);
- returnr;
- }
- Pictureoperator&(constPicture&p,constPicture&q)
- {
- Picturer;
- r.init(p.height+q.height,max(p.width,q.width));
- r.clear(0,p.width,p.height,r.width);
- r.clear(p.height,q.width,r.height,r.width);
- r.copyblock(0,0,p);
- r.copyblock(p.height,0,q);
- returnr;
- }
- Pictureoperator|(constPicture&p,constPicture&q)
- {
- Picturer;
- r.init(max(p.height,q.height),p.width+q.width);
- r.clear(p.height,0,r.height,q.height);
- r.clear(q.height,p.width,r.height,r.width);
- r.copyblock(0,0,p);
- r.copyblock(0,p.width,q);
- returnr;
- }
- intmain()
- {
- char*init[]={"Paris","inthe","Spring"};
- Picturep(init,3);
- //cout<<p<<endl;
- Pictureq=frame(p);
- cout<<frame(q|(p&q))<<endl;
- //cout<<q<<endl;
- }