void SetNodeReg::compare(const IntervalVector& root, const IntervalVector& box,const int& type, bool * flag,unsigned int op) { if(is_leaf()) { //cout<<"leaf box: "<<root<<"of status: "<<status<<" box: "<<box<<endl; switch(op){ case 0: if(status != type){*flag = false;} break; case 1: if(status == type){*flag = true;} break; case 2: if(status == type){*flag = false;} break; } } else if(((op==0||op==2)&& (*flag)) || (op ==1 && !(*flag))) { if(root.intersects(right_box(box))) {right->compare(right_box(root),box,type,flag,op);} if(root.intersects(left_box(box))) {left->compare(left_box(root),box,type,flag,op);} } return; }
void SetNodeReg::cleave(const IntervalVector& box, Ctc& Ctcin, Ctc& Ctcout, const double eps) { if(is_leaf() && status == OUT) return; IntervalVector box1(box); IntervalVector box2(box); //try{Ctcin.contract(box1);} //catch(EmptyBoxException&){inter(OUT);return;} Ctcin.contract(box1); if(box1.is_empty()) { inter(OUT); return; } //try{Ctcout.contract(box2);} //catch(EmptyBoxException&){_union(IN);return;} Ctcout.contract(box2); if(box2.is_empty()) { _union(IN);return; } if(is_leaf()) { if(box[var].diam()>eps) { cut(box); left->cleave(left_box(box),Ctcin,Ctcout,eps); right->cleave(right_box(box),Ctcin,Ctcout,eps); } else status = inte(status,UNK); } else { left->cleave(left_box(box),Ctcin,Ctcout,eps); right->cleave(right_box(box),Ctcin,Ctcout,eps); } }
void SetNodeReg::cleave(const IntervalVector& box, Sep& sep, const double eps) { if(is_leaf() && status == OUT) return; IntervalVector box1(box); IntervalVector box2(box); sep.separate(box1,box2); if(box1.is_empty()){ inter(OUT); // cout<<"box: "<<box<<" set to OUT"<<endl; } else if(box2.is_empty()){ _union(IN); cout<<"box: "<<box<<" set to IN"<<endl; } else // continu until box1 and box2 are disjoint { if(is_leaf()) { if(box[var].diam()>eps) { cut(box); left->cleave(left_box(box),sep,eps); right->cleave(right_box(box),sep,eps); } else status = inte(status,UNK); } else { left->cleave(left_box(box),sep,eps); right->cleave(right_box(box),sep,eps); } } }
void SetNodeReg::operator_ir(const IntervalVector& box,const IntervalVector& nodebox, NodeType valin, NodeType valout, bool op, double eps) { int r = Interset(box,nodebox); switch (r) { case 2: if(op && valin != IN) inter(valin); else if(!op && valin!= OUT) _union(valin); break; case 1: if(is_leaf()) { if( box[var].diam()>eps) { cut(box); left->operator_ir(left_box(box),nodebox,valin,valout,op,eps); right->operator_ir(right_box(box),nodebox,valin,valout,op,eps); } else status = inte_in(status,UNK); } else { left->operator_ir(left_box(box),nodebox,valin,valout,op,eps); right->operator_ir(right_box(box),nodebox,valin,valout,op,eps); } break; case 0: if(op && valout!= IN) inter(valout); else if(!op && valout!= OUT) _union(valout); break; } }
void SetNodeReg::visit_leaves(leaf_func func, const IntervalVector& nodebox) const { if(is_leaf()) func(nodebox, status==IN? YES : (status==OUT? NO : MAYBE)); else { left->visit_leaves(func, left_box(nodebox)); right->visit_leaves(func, right_box(nodebox)); } }
void SetNodeReg::getLeaf(vector<SetNodeReg*> * vecLeaf, vector<IntervalVector> * vecBox, const IntervalVector& curbox) { if(is_leaf()) { vecLeaf->push_back(this); vecBox->push_back(curbox); } else { right->getLeaf(vecLeaf,vecBox,right_box(curbox)); left->getLeaf(vecLeaf,vecBox,left_box(curbox)); } }
void SetNodeReg::findNeighbor(const IntervalVector& box,const IntervalVector& nbox,vector<SetNodeReg*> * neigh) { if(is_leaf()){ if(box.intersects(nbox) && box!=nbox ) neigh->push_back(this); } else if(box.intersects(nbox)) { right->findNeighbor(right_box(box),nbox,neigh); left->findNeighbor(left_box(box),nbox,neigh); } }
void SetNodeReg::print(std::ostream& os, const IntervalVector& nodebox, int shift) const { if(is_leaf()) { for (unsigned int i=0; i<shift; i++) os << ' '; os << "* " << nodebox << endl; } else { for (int i=0; i<shift; i++) os << ' '; os << nodebox << " " << to_string(status) << endl; left->print(os, left_box(nodebox), shift+2); right->print(os, right_box(nodebox), shift+2); } }
awl::main::exit_code const example_main( awl::main::function_context const & ) try { sge::rucksack::testbed::object testbed{ sge::window::title{ FCPPT_TEXT("rucksack box test") } }; sge::rucksack::viewport::adaptor viewport_box{ testbed.systems().viewport_manager(), testbed.systems().renderer_device_core() }; sge::rucksack::padding const padding{ 5 }; sge::rucksack::widget::box outer_box{ sge::rucksack::axis::x, padding }; viewport_box.child( outer_box ); sge::rucksack::widget::box left_box( sge::rucksack::axis::y, padding ); outer_box.push_back_child( left_box, sge::rucksack::alignment::left_or_top ); sge::rucksack::widget::box right_box( sge::rucksack::axis::y, padding ); outer_box.push_back_child( right_box, sge::rucksack::alignment::center ); sge::rucksack::widget::dummy inner_sprite{ sge::rucksack::axis_policy2{ sge::rucksack::axis_policy{ sge::rucksack::preferred_size{ 100 } }, sge::rucksack::axis_policy{ sge::rucksack::preferred_size{ 50 } } } }; left_box.push_back_child( inner_sprite, sge::rucksack::alignment::center ); sge::rucksack::widget::dummy inner_sprite2{ sge::rucksack::axis_policy2{ sge::rucksack::axis_policy{ sge::rucksack::preferred_size{ 200 } }, sge::rucksack::axis_policy{ sge::rucksack::preferred_size{ 50 } } } }; right_box.push_back_child( inner_sprite2, sge::rucksack::alignment::right_or_bottom ); testbed.add_widget( viewport_box, sge::image::color::any::object{ sge::image::color::predef::blue() } ); testbed.add_widget( inner_sprite, sge::image::color::any::object{ sge::image::color::predef::red() } ); testbed.add_widget( inner_sprite2, sge::image::color::any::object{ sge::image::color::predef::green() } ); return testbed.run(); } catch( fcppt::exception const &_error ) { awl::show_error( _error.string() ); return awl::main::exit_failure(); } catch( std::exception const &_error ) { awl::show_error_narrow( _error.what() ); return awl::main::exit_failure(); }