void Box::SaveBoxesToFile(const string& fileName, const BoxList& boxes) { FILE* fout = fopen(fileName.c_str(), "w"); int n = boxes.size(); fprintf(fout, "%d\n", n); for (int i = 0; i < n; i++) fprintf(fout, "%d %d %d\n", boxes[i].l, boxes[i].w, boxes[i].h); fclose(fout); }
bool BoxList::operator== (const BoxList& rhs) const { if ( !(size() == rhs.size()) ) return false; BoxList::const_iterator liter = begin(), riter = rhs.begin(), End = end(); for (; liter != End; ++liter, ++riter) if ( !( *liter == *riter) ) return false; return true; }
void ImagePane::paintEvent(QPaintEvent* /*event*/) { QPainter painter(this); //draw the transformed version of the text-object image painter.drawImage(0, 0, transformedImage); //then we draw the bounding boxes //TODO inscriptions with at least one graph are a different color (?) //in case index numbers are visible, set font QFont font; font.setPixelSize(30/zoom); //TODO make font size dependent on resolution painter.setFont(font); QPen pen; pen.setWidth(0); pen.setColor(Qt::red); painter.setPen(pen); //make a list of bounding boxes according to current mode BoxList currentBoxList; //this is a list of all boxes currentBoxList.clear(); switch(mode) { case SURFACE: currentBoxList.append(*surf); //list of one item, consting of the surface bounding box break; case INSCRIPTION: for(int i=0; i < surf->inscriptionCount(); i++) currentBoxList.insertBox(surf->inscrAt(i), i); break; case GRAPH: for(int i=0; i < surf->ptrInscrAt(currentInscrIndex)->count(); i++) currentBoxList.insertBox(surf->ptrInscrAt(currentInscrIndex)->at(i), i); break; default: break; } //iterate through the list of bounding boxes for (int i=0; i<currentBoxList.size(); i++) { BoundingBox currentBox = currentBoxList.at(i); //the bounding boxes need to be rotated and scaled QTransform boxTransform; //identity matrix //first we need to handle the bounding box's own rotation //by inverting the true matrix that was applied to the image //at the time each bounding box was created //(note: we don't need to worry about scale, as we took account of that //when the bounding box was created) boxTransform.rotate(currentBox.getRotation()); boxTransform = QImage::trueMatrix(boxTransform, currentImage.width(), currentImage.height()); boxTransform = boxTransform.inverted(); //then we compound the above matrix with the current transformation of the image QTransform imageTrueTransform = QImage::trueMatrix(transform, currentImage.width(), currentImage.height()); painter.setWorldTransform(boxTransform * imageTrueTransform); //now draw the box //pen color is red; set the pen-color to green if this is the current box. if(i==currentBoxIndex) { QPen pen; pen.setWidth(0); pen.setColor(Qt::green); painter.setPen(pen); } painter.drawRect(currentBox); //and add an (optional) index number if(indexNumbersVisible) { painter.drawText(currentBox.left(), currentBox.top(), 50/zoom, 50/zoom, Qt::AlignBottom, QString("%1").arg(i+1)); //visible index, so base = 1, not zero } //return pen color to red (might be green) QPen pen; pen.setWidth(0); pen.setColor(Qt::red); painter.setPen(Qt::red); } //if label is not resized, it will stay large on zoom out //resulting in misleading / redundant scroll bars resize(transformedImage.size()); // keep label same size as image }
void AuxBoundaryData::initialize (const BoxArray& ba, int n_grow, int n_comp, const Geometry& geom) { BL_ASSERT(!m_initialized); const bool verbose = false; const int NProcs = ParallelDescriptor::NProcs(); const Real strt_time = ParallelDescriptor::second(); m_ngrow = n_grow; BoxList gcells = BoxLib::GetBndryCells(ba,n_grow); // // Remove any intersections with periodically shifted valid region. // if (geom.isAnyPeriodic()) { Box dmn = geom.Domain(); for (int d = 0; d < BL_SPACEDIM; d++) if (!geom.isPeriodic(d)) dmn.grow(d,n_grow); for (BoxList::iterator it = gcells.begin(); it != gcells.end(); ) { const Box& isect = *it & dmn; if (isect.ok()) { *it++ = isect; } else { gcells.remove(it++); } } } gcells.simplify(); if (gcells.size() < NProcs) { gcells.maxSize(BL_SPACEDIM == 3 ? 64 : 128); } BoxArray nba(gcells); gcells.clear(); if (nba.size() > 0) { m_fabs.define(nba, n_comp, 0, Fab_allocate); } else { m_empty = true; } if (verbose) { const int IOProc = ParallelDescriptor::IOProcessorNumber(); Real run_time = ParallelDescriptor::second() - strt_time; const int sz = nba.size(); #ifdef BL_LAZY Lazy::QueueReduction( [=] () mutable { #endif ParallelDescriptor::ReduceRealMax(run_time,IOProc); if (ParallelDescriptor::IOProcessor()) std::cout << "AuxBoundaryData::initialize() size = " << sz << ", time = " << run_time << '\n'; #ifdef BL_LAZY }); #endif } m_initialized = true; }
void MFGhostIter::Initialize () { int rit = 0; int nworkers = 1; #ifdef BL_USE_TEAM if (ParallelDescriptor::TeamSize() > 1) { rit = ParallelDescriptor::MyRankInTeam(); nworkers = ParallelDescriptor::TeamSize(); } #endif int tid = 0; int nthreads = 1; #ifdef _OPENMP nthreads = omp_get_num_threads(); if (nthreads > 1) tid = omp_get_thread_num(); #endif int npes = nworkers*nthreads; int pid = rit*nthreads+tid; BoxList alltiles; Array<int> allindex; Array<int> alllocalindex; for (int i=0; i < fabArray.IndexMap().size(); ++i) { int K = fabArray.IndexMap()[i]; const Box& vbx = fabArray.box(K); const Box& fbx = fabArray.fabbox(K); const BoxList& diff = BoxLib::boxDiff(fbx, vbx); for (BoxList::const_iterator bli = diff.begin(); bli != diff.end(); ++bli) { BoxList tiles(*bli, FabArrayBase::mfghostiter_tile_size); int nt = tiles.size(); for (int it=0; it<nt; ++it) { allindex.push_back(K); alllocalindex.push_back(i); } alltiles.catenate(tiles); } } int n_tot_tiles = alltiles.size(); int navg = n_tot_tiles / npes; int nleft = n_tot_tiles - navg*npes; int ntiles = navg; if (pid < nleft) ntiles++; // how many tiles should we skip? int nskip = pid*navg + std::min(pid,nleft); BoxList::const_iterator bli = alltiles.begin(); for (int i=0; i<nskip; ++i) ++bli; lta.indexMap.reserve(ntiles); lta.localIndexMap.reserve(ntiles); lta.tileArray.reserve(ntiles); for (int i=0; i<ntiles; ++i) { lta.indexMap.push_back(allindex[i+nskip]); lta.localIndexMap.push_back(alllocalindex[i+nskip]); lta.tileArray.push_back(*bli++); } currentIndex = beginIndex = 0; endIndex = lta.indexMap.size(); lta.nuse = 0; index_map = &(lta.indexMap); local_index_map = &(lta.localIndexMap); tile_array = &(lta.tileArray); }