📄 waku.cpp
字号:
}
}
if(playoutrect!=NULL)
{
compositewaku* ptmpwaku = playoutrect->getwaku();
if(!ptmpwaku->isempty())
{
if(onlyfull)
{
vector< wakuinterface* > tmpvec;
ptmpwaku->getwakus(tmpvec);
vector< wakuinterface* >::iterator iter = tmpvec.begin();
vector< wakuinterface* >::iterator iterend = tmpvec.end();
for(;iter!=iterend;++iter)
{
(*iter)->setpos(0,0);
{
if((*iter)->getmaxwidth()==12)
++nfullcolumnleft;
AddwakuTobags((*iter)->duplicate(),Wakus,1);
}
}
delete playoutrect;
}else{
Pages.push_back(playoutrect);
}
}else{
delete playoutrect;
}
}
return true;
}
void layout::OutputResult(ofstream& out,bool beps)
{
if(beps)
{
double pensiaze = 1/72.0;
out<<"%!PS-Adobe-3.0"<<endl;
out<<"<</PageSize [864 1152]>> setpagedevice"<<endl;
out<<" 72 72 scale "<<pensiaze<<" setlinewidth "<<endl;
}
vector< layoutrect* >::iterator iter = Pages.begin();
vector< layoutrect* >::iterator iterend = Pages.end();
for(;iter!=iterend;++iter)
{
(*iter)->OutputResult(out,beps);
}
}
int layout::TotalRemain()
{
int nRemain = 0;
return nRemain;
}
int layout::GetFullUsedPageNums()
{
int nResult = 0;
return nResult;
}
wakubag* wakubags::getwakubagatpos(int i)
{
return pbags[i];
}
void wakubags::setwakubagatpos(wakubag* pset,int i)
{
pbags[i] = pset;
}
void wakubags::exchangebags(wakubags& subbags,vector < pair<int,int> >& vecitem)
{
vector < pair<int,int> >::iterator iter = vecitem.begin();
for(;iter!=vecitem.end();++iter)
{
wakubag* pbag1 = NULL;
wakubag* pbag2 = NULL;
pbag1 = getwakubagatpos(pindex->getindex((*iter).first,(*iter).second));
pbag2 = subbags.getwakubagatpos(pindex->getindex((*iter).first,(*iter).second));
subbags.setwakubagatpos(pbag1,pindex->getindex((*iter).first,(*iter).second));
setwakubagatpos(pbag2,pindex->getindex((*iter).first,(*iter).second));
}
}
void wakubags::getsubbags(wakubags& subbags,int height)
{
if(height<1||height>nheight)
return;
for(int i = 0;i<nwidth;i++)
{
wakubag* pbag1 = NULL;
wakubag* pbag2 = NULL;
pbag1 = getwakubagatpos(pindex->getindex(i+1,height));
pbag2 = subbags.getwakubagatpos(pindex->getindex(i+1,height));
subbags.setwakubagatpos(pbag1,pindex->getindex(i+1,height));
setwakubagatpos(pbag2,pindex->getindex(i+1,height));
}
}
void wakubags::addsubbags(wakubags& subbags,int height)
{
if(height<1||height>nheight)
return;
for(int i = 0;i<nwidth;i++)
{
wakubag* pbag1 = NULL;
wakubag* pbag2 = NULL;
pbag2 = getwakubagatpos(pindex->getindex(i+1,height));
pbag1 = subbags.getwakubagatpos(pindex->getindex(i+1,height));
subbags.setwakubagatpos(pbag2,pindex->getindex(i+1,height));
setwakubagatpos(pbag1,pindex->getindex(i+1,height));
}
}
void readfromfiletoarray(const char* szfilename)
{
ifstream infile(szfilename);
if(!infile)
return;
int number,nHeight,nWidth;
for(int k = 0;k<10;k++)
for(int l = 0;l<12;l++)
globalinputt[k][l] = 0;
while(infile>>nHeight)
{
infile>>nWidth;
infile>>number;
globalinputt[nHeight-1][nWidth-1] += number;
}
}
void initwakufromarraytobags(wakubags& wakubag,int w,int h,int step,int start)
{
for(int i = 0;i<h;i++)
{
for(int j = start;j<w;j+=step)
{
if(globalinputt[i][j]>0)
{
basewaku* pWaku = new basewaku(i+1,(j+1)/step,step);
AddwakuTobags(pWaku,wakubag,globalinputt[i][j]);
}
}
}
}
void convertwaku4towaku3(wakubags& waku4,wakubags& waku3)
{
wakuinterface* presult = NULL;
bagsvistornormal vistor;
while(waku4.HasContentToProcess(vistor))
{
presult = vistor.getwaku();
int nheight = presult->getheight();
layout processor(nheight,3,nheight,0);
vistor.pageinfo(3,nheight);
processor.LayoutWakus(waku4,false,vistor);
vector< layoutrect* > pages;
processor.getlayoutrect(pages);
vector< layoutrect* >::iterator iter = pages.begin();
vector< layoutrect* >::iterator iterend = pages.end();
for(;iter!=iterend;++iter)
{
wakuinterface* presult = (*iter)->getwaku()->duplicate();
presult->setwidth(4);
presult->setwidthscale(3);
AddwakuTobags(presult,waku3,1,true);
}
}
}
void combinewakustobigone(wakubags& from,int height1,int height2,int width,int widthbarrier)
{
wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
from.getsubbags(wakutmp,height1);
if(height1!=height2&&height2!=0)
from.getsubbags(wakutmp,height2);
bagsvistornormal vistor;
layout processor(height1+height2,width,height1,widthbarrier);
vistor.pageinfo(width,height1+height2);
processor.LayoutWakus(wakutmp,true,vistor);
vector< layoutrect* > pages;
processor.getlayoutrect(pages);
vector< layoutrect* >::iterator iter = pages.begin();
vector< layoutrect* >::iterator iterend = pages.end();
from.addsubbags(wakutmp,height1);
if(height1!=height2&&height2!=0)
from.addsubbags(wakutmp,height2);
for(;iter!=iterend;++iter)
{
AddwakuTobags((*iter)->getwaku()->duplicate(),from,1);
}
}
void processcombinelayout(layout& processor)
{
policystatus.rightpreference = false;
wakubags waku4(3,16,4);
wakubags waku3(4,16,3);
initwakufromarraytobags(waku4,11,10,4,3);
initwakufromarraytobags(waku3,12,10,3,2);
convertwaku4towaku3(waku4,waku3);
int i = 0;
for(i = 3;i>0;i--)
{
combinewakustobigone(waku3,7,3,i,i);
//waku3.debgout();
}
for(i = 3;i>0;i--)
{
combinewakustobigone(waku3,5,5,i,i);
//waku3.debgout();
}
for(i = 3;i>0;i--)
{
combinewakustobigone(waku3,5,3,i,i);
//waku3.debgout();
}
for(i = 3;i>0;i--)
{
combinewakustobigone(waku3,7,1,i,i);
//waku3.debgout();
}
for(i = 3;i>0;i--)
{
combinewakustobigone(waku3,3,3,i,i);
//waku3.debgout();
}
/*
for(i = 10;i>0;i--)
{
combinewakustobigone(waku3,i,0,4,0);
}*/
bagsvistornormal vistor;
vistor.pageinfo(4,16);
vistor.setpreferencewidth(4);
vistor.setpreferenceheight(3);
processor.LayoutWakus(waku3,false,vistor);
}
void processnormallayout(layout& processor)
{
policystatus.rightpreference = false;
wakubags waku4(3,16,4);
wakubags waku3(4,16,3);
initwakufromarraytobags(waku4,11,10,4,3);
initwakufromarraytobags(waku3,12,10,3,2);
convertwaku4towaku3(waku4,waku3);
bagsvistornormal vistor;
vistor.pageinfo(4,16);
vistor.setpreferencewidth(4);
vistor.setpreferenceheight(0);
processor.LayoutWakus(waku3,false,vistor);
}
void combine3_1wakusfinal(wakubags& from,wakubags& pagecomp)
{
//for(int i = from.getheight()-2;i>0;i--)
policystatus.rightpreference = false;
policystatus.ignorevalidate = true;
for(int i = from.getheight();i>1;i-=2)
{
wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
vector < pair<int,int> > vecitem;
for(int j = i;j>0;j--)
{
vecitem.push_back(pair<int,int>(1,j));
vecitem.push_back(pair<int,int>(3,j));
vecitem.push_back(pair<int,int>(4,j));
}
from.exchangebags(wakutmp,vecitem);
pattern3_1vistor vistor;
vistor.pageinfo(4,i);
vistor.setpreferencewidth(3);
layout processor(i,4,0,3);
processor.LayoutWakus(wakutmp,true,vistor);
vector< layoutrect* > pages;
processor.getlayoutrect(pages);
vector< layoutrect* >::iterator iter = pages.begin();
vector< layoutrect* >::iterator iterend = pages.end();
from.exchangebags(wakutmp,vecitem);
for(;iter!=iterend;++iter)
{
AddwakuTobags((*iter)->getwaku()->duplicate(),pagecomp,1);
}
}
policystatus.ignorevalidate = false;
}
void combine2_2wakusfinal(wakubags& from,wakubags& pagecomp)
{
policystatus.ignorevalidate = true;
for(int i = from.getheight();i>2;i-=2)
//for(int i = 5;i<from.getheight();i++)
{
wakubags wakutmp(from.getwidth(),from.getheight(),from.getwscale());
vector < pair<int,int> > vecitem;
for(int j = i;j>0;j--)
{
vecitem.push_back(pair<int,int>(2,j));
vecitem.push_back(pair<int,int>(4,j));
}
from.exchangebags(wakutmp,vecitem);
pattern2_2vistor vistor;
vistor.pageinfo(4,i);
vistor.setpreferencewidth(0);
layout processor(i,4,0,0);
processor.LayoutWakus(wakutmp,true,vistor);
vector< layoutrect* > pages;
processor.getlayoutrect(pages);
vector< layoutrect* >::iterator iter = pages.begin();
vector< layoutrect* >::iterator iterend = pages.end();
from.exchangebags(wakutmp,vecitem);
for(;iter!=iterend;++iter)
{
AddwakuTobags((*iter)->getwaku()->duplicate(),pagecomp,1);
}
}
policystatus.ignorevalidate = false;
}
void processsymetrylayout(layout& processor)
{
policystatus.rightpreference = false;
wakubags waku4(3,16,4);
wakubags waku3(4,16,3);
initwakufromarraytobags(waku4,11,10,4,3);
initwakufromarraytobags(waku3,12,10,3,2);
{
wakubags pagecomp(4,16,3);
combine3_1wakusfinal(waku3,pagecomp);
combine2_2wakusfinal(waku3,pagecomp);
convertwaku4towaku3(waku4,waku3);
waku3.addwakubags(pagecomp);
}
bagsvistornormal vistor;
vistor.pageinfo(4,16);
vistor.setpreferencewidth(4);
vistor.setpreferenceheight(3);
policystatus.ignorevalidate = true;
processor.LayoutWakus(waku3,false,vistor);
}
void outputwakuinfo()
{
int nTotalnum = 0;
int nTotalarea = 0;
int bestneedpages = 0;
nbakoffullcolumnwaku = 0;
for(int i = 0;i<10;i++)
{
for(int j = 0;j<12;j++)
{
nTotalnum+=globalinputt[i][j];
nTotalarea+=((i+1)*(j+1)*globalinputt[i][j]);
if(j==11)
nbakoffullcolumnwaku+=globalinputt[i][j];
}
}
bestresult = 1;
int nrealarea = nTotalarea;
nTotalarea-=12*(16-nglobaltitlenum);
bestneedpages = 0;
if(nTotalarea>=0)
{
bestneedpages = nTotalarea/(12*16);
if(nTotalarea%(12*16))
bestneedpages++;
bestresult+=bestneedpages;
}
bestneedpages = bestresult;
cout<<endl;
cout<<"best result: "<<bestneedpages<<endl;
cout<<"total area : "<<nrealarea<<endl;
cout<<"total waku num: "<<nTotalnum<<endl;
}
bool outputnumberseqiter(int num1,int num2,vector<int> prefixnum)
{
if(num1<=0)
{
return true;
}
if(num2==1)
{
if(prefixnum[num2-1]<num1)
return false;
else
return true;
}
bool result = false;
if(num1>=num2)
{
if(!(prefixnum[num2-1]<1))
{
prefixnum[num2-1]-=1;
num1-=num2;
result = outputnumberseqiter(num1,num2,prefixnum);
prefixnum[num2-1]+=1;
num1+=num2;
}
if(result)
return true;
else
return outputnumberseqiter(num1,num2-1,prefixnum);
}
return outputnumberseqiter(num1,num2-1,prefixnum);
}
vector< compositewaku* > pattern14;
vector< compositewaku* > pattern15;
vector< compositewaku* > patternhalf;
void clearpattern()
{
vector< compositewaku* >::iterator iter = pattern14.begin();
for(;iter!=pattern14.end();++iter)
delete *iter;
iter = pattern15.begin();
for(;iter!=pattern15.end();++iter)
delete *iter;
iter = patternhalf.begin();
for(;iter!=patternhalf.end();++iter)
delete *iter;
}
void initpattern()
{
char patternstr[128];
int localinputt[10][12];
int ncolumn;
{
ifstream infile("titlepattern15.txt");
if(!infile)
return;
int number,nHeight;
int xpos,ypos,xwidth,yheight;
while(infile>>patternstr)
{
infile>>nHeight;
infile>>ncolumn;
infile>>number;
vector<int> vecxpos;
vector<int> vecypos;
vector<int> vecxwidth;
vector<int> vecyheight;
{
for(int l = 0;l<10;l++)
for(int m = 0;m<12;m++)
localinputt[l][m] = 0;
}
for(int i = 0;i<number;i++)
{
infile>>xpos;
vecxpos.push_back(xpos);
infile>>ypos;
vecypos.push_back(ypos);
infile>>xwidth;
vecxwidth.push_back(xwidth);
infile>>yheight;
vecyheight.push_back(yheight);
localinputt[yheight-1][xwidth-1]+=1;
}
infile>>patternstr;
{
compositewaku* pcom = new compositewaku();
pcom->setwidth(4);
pcom->setwidthscale(3);
pcom->setheight(nHeight);
for(int i = 0;i<number;i++)
{
basewaku* pwaku = new basewaku(vecyheight[i],vecxwidth[i]/3,3);
pwaku->setpos(vecxpos[i]/3,vecypos[i]);
pcom->AddWaku(pwaku);
}
pattern15.push_back(pcom);
}
}
}
{
ifstream infile("titlepattern14.txt");
if(!infile)
return ;
int number,nHeight;
int xpos,ypos,xwidth,yheight;
while(infile>>patternstr)
{
infile>>nHeight;
infile>>ncolumn;
infile>>number;
vector<int> vecxpos;
vector<int> vecypos;
vector<int> vecxwidth;
vector<int> vecyheight;
{
for(int l = 0;l<10;l++)
for(int m = 0;m<12;m++)
localinputt[l][m] = 0;
}
for(int i = 0;i<number;i++)
{
infile>>xpos;
vecxpos.push_back(xpos);
infile>>ypos;
vecypos.push_back(ypos);
infile>>xwidth;
vecxwidth.push_back(xwidth);
infile>>yheight;
vecyheight.push_back(yheight);
localinputt[yheight-1][xwidth-1]+=1;
}
infile>>patternstr;
{
compositewaku* pcom = new compositewaku();
pcom->setwidth(4);
pcom->setwidthscale(3);
pcom->setheight(nHeight);
for(int i = 0;i<number;i++)
{
basewaku* pwaku = new basewaku(vecyheight[i],vecxwidth[i]/3,3);
pwaku->setpos(vecxpos[i]/3,vecypos[i]);
pcom->AddWaku(pwaku);
}
pattern14.push_back(pcom);
}
}
}
{
ifstream infile("halfpattern.txt");
if(!infile)
return ;
int number,nHeight;
int xpos,ypos,xwidth,yheight;
while(infile>>patternstr)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -