Beispiel #1
0
    /**
     * 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);
        }
    }
Beispiel #2
0
//---------------------------------------------------------------------------
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;
}
Beispiel #3
0
        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            
        }