#include "BitmapFont.h" #include "Matchers.h" #include std::vector MatchResult::getPixels() const { return pm.getPixels(x,y); } Matchers::Matchers(){ pm.push_back(PatMatch(3,3, "..." ".@@" "...", Assumption() .add(SimpleAssumption(YokoMask,Start,1,1,0,0)) .add(SimpleAssumption(HidariMask,End,1,1,180,0)))); pm.push_back(PatMatch(3,3, "..." "@@@" "...", Assumption() .add(SimpleAssumption(YokoMask,Mid,1,1,0,0)) .add(SimpleAssumption(HidariMask,Mid,1,1,180,1)))); pm.push_back(PatMatch(4,3, "...?" "@@@@" ".@@.", Assumption() .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0)) .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,1,270,2)))); pm.push_back(PatMatch(5,3, ".@@.." "@@@@@" ".....", Assumption() .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0)) .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointEnd,1.5,1,270,2)))); pm.push_back(PatMatch(5,4, "....?" ".@@.." "@@@@." "?...?", SimpleAssumption(YokoMask,End,3,2,0,2))); pm.push_back(PatMatch(4,2, ".@@." ".@@.", SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,1,270,2))); pm.push_back(PatMatch(5,2, "..@@." ".@@..", SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,2,0.5,225,1.7))); pm.push_back(PatMatch(4,2, "?*@*" "*@*?", SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,1.5,0.5,225,1))); pm.push_back(PatMatch(4,3, "?*@*" "*@@*" "*@*?", SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),JointStart,1.5,0.5,225,1))); pm.push_back(PatMatch(4,3, ".@@." "@@@@" ".@@.", Assumption() .add(SimpleAssumption(YokoMask,Mid,1.5,1,0,0)) .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),Mid,1.5,1,270,2)))); pm.push_back(PatMatch(5,3, "..@@." "@@@@@" ".@@..", Assumption() .add(SimpleAssumption(YokoMask,Mid,2,1,0,0)) .add(SimpleAssumption((PtypeMask)(TatehidariMask|HidariMask),Mid,2,1,250,2)))); pm.push_back(PatMatch(4,4, "?.??" ".@.." ".@@@" "?@?.", Assumption() .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0)) .add(SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),JointStart,1.5,2,270,2)))); pm.push_back(PatMatch(5,3, "?...?" ".@@@." ".@@.?", SimpleAssumption((PtypeMask)(TateMask|TatehaneMask|TatehidariMask|HidariMask),Start,1.5,0.5,270,2))); pm.push_back(PatMatch(5,4, "*@@*?" "?.@@." "?.@@." "??..?", SimpleAssumption(TenMask,End,2.5,2.5,300,2))); pm.push_back(PatMatch(4,3, "*.??" "*@*?" "?*@*", SimpleAssumption(TenMask,Start,1,1,315,1))); pm.push_back(PatMatch(4,4, ".@@." ".@@@" ".@@." "....", Assumption() .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0)) .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2)))); pm.push_back(PatMatch(4,5, ".@@." ".@@@" ".@@." ".@@." "....", Assumption() .add(SimpleAssumption(YokoMask,JointStart,1.5,2,0,0)) .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2)))); pm.push_back(PatMatch(4,4, ".@@." "@@@." ".@@." "....", Assumption() .add(SimpleAssumption(YokoMask,JointEnd,1.5,2,0,0)) .add(SimpleAssumption(TateMask,JointEnd,1.5,1,270,2)))); } std::vector Matchers::findMatch(const BitmapFont& bf) const{ std::vector mr; std::vector::const_iterator it; for(it=pm.begin();it!=pm.end();it++) for(int y= -1; ymatchPenalty(bf,x,y); if(penalty>=0) mr.push_back(MatchResult(x,y,*it,penalty)); } return mr; } std::vector Matchers::notCovered(const BitmapFont& bf) const{ std::vector mr=findMatch(bf); std::vector > pixel2match(bf.getSize()); std::vector > match2pixel(mr.size()); std::vector::iterator it; for(it=mr.begin();it!=mr.end();it++){ int n= it-mr.begin(); std::vector ps=(*it).getPixels(); std::vector::iterator ips; for(ips=ps.begin();ips!=ps.end();ips++){ int m=bf.getIndex(*ips); std::cout << '(' << ips->first << ',' << ips->second << ")\n"; assert(m != -1); match2pixel[n].insert(m); pixel2match[m].insert(n); } } std::vector ret; for(int i=0;i::const_iterator it; for(it=mt.pm.begin();it!=mt.pm.end();it++){ os << *it << ','; } os << ')'; return os; } ostream& operator<<(ostream &os,const MatchResult &mr){ os << "MatchResult(" << mr.x << "," << mr.y << "," << mr.pm << "," << mr.penalty << ")"; return os; }