/** * Compute complement (list of boxes) of a box in a box * @param sbox source box * @param cbox complementary box * @param result resulting list of boxes (list = sbox \ cbox) */ template <class FT> static void complement(const Box<FT> &sbox, const Box<FT> &cbox, std::vector< Box<FT> >& result) { int n = sbox.mDim; BNB_ASSERT(cbox.mDim == n); Box<FT> box(n); copy(sbox, box); bool intersect = true; for (int i = 0; i < n; i++) { if ((cbox.mB[i] < box.mA[i]) || (cbox.mA[i] > box.mB[i])) { intersect = false; } } if (intersect) { for (int i = 0; i < n; i++) { if (cbox.mA[i] > box.mA[i]) { Box<FT> nbox(n); copy(box, nbox); nbox.mB[i] = cbox.mA[i]; box.mA[i] = cbox.mA[i]; result.push_back(nbox); } if (cbox.mB[i] < box.mB[i]) { Box<FT> nbox(n); copy(box, nbox); nbox.mA[i] = cbox.mB[i]; box.mB[i] = cbox.mB[i]; result.push_back(nbox); } } } else { result.push_back(box); } }
//--------------------------------------------------------------------------- std::vector<int> BDOctTree::BoxInNode(BDOctNode* node, BDAABB* box) { std::vector<int> nodelist, dummy; for (short index = 0; index < 8; index++) { BDAABB nbox(Nodes[node->children[index]].ToBox()); if (nbox.Intersect(*box)) { // If this child is the smallest if (Nodes[node->children[index]].children[0] == 0) { nodelist.push_back(node->children[index]); } else { dummy = BoxInNode(&Nodes[node->children[index]], box); while(dummy.size() > 0) { nodelist.push_back(dummy.back()); dummy.pop_back(); } } } } return nodelist; }
void getCuts(const snowgoose::Box<FT>& box, std::vector<std::shared_ptr <Cut <FT> > >& v) const { const int n = mBox.mDim; snowgoose::Box<FT> nbox(n); snowgoose::BoxUtils::copy(box, nbox); FT r; auto comp = [&] () { snowgoose::BoxUtils::getCenter(nbox, (FT*) mX); r = snowgoose::BoxUtils::radius(nbox); mF.hess(mX, mH); mHessSupp.getLpzConst(box, mLH); }; comp(); std::vector< snowgoose::Box<FT> > boxv; boxv.push_back(nbox); bool savecut = false; for (int i = 0; i < n; i++) { int ii = i + i * n; FT lb = mH[ii] - r * mLH[ii]; FT ub = mH[ii] + r * mLH[ii]; if (ub < -mDelta) { savecut = true; std::vector< snowgoose::Box<FT> > nbx; while (!boxv.empty()) { snowgoose::Box<FT> bx = boxv.back(); boxv.pop_back(); if (bx.mA[i] == mBox.mA[i]) { snowgoose::Box<FT> bxa(bx); bxa.mB[i] = bxa.mA[i]; nbx.push_back(bxa); } if (bx.mB[i] == mBox.mB[i]) { snowgoose::Box<FT> bxb(bx); bxb.mA[i] = bxb.mB[i]; nbx.push_back(bxb); } } boxv = std::move(nbx); } else { } if (boxv.empty()) { auto tc = new TotalCut <FT> (box); std::shared_ptr< Cut<FT> > pc(tc); v.push_back(pc); break; } } if (savecut) { auto savebox = new NUC::SaveBoxCut<double>(box); for (auto b : boxv) { savebox->pushBox(b); } std::shared_ptr< NUC::Cut<FT> > pc(savebox); v.push_back(pc); } /* r = 0; for (int i = 0; i < n; i++) { FT nr = 0; if (mLH[i] == 0) continue; if (mH[i] >= mDelta) { nr = (mH[i] - mDelta) / mLH[i]; } else if (mH[i] <= -mDelta) { nr = -(mH[i] + mDelta) / mLH[i]; } if (nr > r) r = nr; } std::cout << "r = " << r << "\n"; */ #if 0 if (r > 0) { auto exballcut = new NUC::ExcludeBallCut<FT>(nbox, r, mX); std::shared_ptr< NUC::Cut<FT> > pc(exballcut); v.push_back(pc); } #endif }