1234567891011121314151617181920212223242526272829303132 |
- #include "polygon_generator.hpp"
- //------------------------
- // PolygonGenerator::next
- //------------------------
- bool
- PolygonGenerator::next(){
- size_t nd=0;
- while(not s.empty()){
- Step step=s.top();
- s.pop();
- poly.apply(step);
- if(poly.is_closed()) return true;
- size_t h=poly.head;
- int64 xh=h%Polygon::grid_width;
- int64 yh=h/Polygon::grid_width;
- ++nd;
- if(abs(xh-Polygon::xinit)+abs(yh-Polygon::yinit)+step.t<=max_len+1){
- size_t l=Polygon::left(h);
- size_t r=Polygon::right(h);
- size_t d=Polygon::down(h);
- size_t u=Polygon::up(h);
- size_t nt=step.t+1;
- if(poly.test(nt,l,&step)) s.emplace(&step,l,++n);
- if(poly.test(nt,r,&step)) s.emplace(&step,r,++n);
- if(poly.test(nt,d,&step)) s.emplace(&step,d,++n);
- if(poly.test(nt,u,&step)) s.emplace(&step,u,++n);
- }
- }
- return false;
- }
|