static number FaceArea(TDomain& dom, int si) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); UG_ASSERT(TDomain::position_type::Size <= 3, "too many coordinates."); return FaceArea(*dom.subset_handler(), si, 0, aaPos); }
//----------------------------------------------------------------------------- void TAdministradora :: LoadDomainsNacionales(AnsiString pDomainNacional) { TFile* TreeFile = new TFile(pDomainNacional); TreeFile->Open("rb+"); TreeFile->SeekTo(0); if(TreeFile->IsOpen()) { TSDomainInfo SDominio; TreeFile->Read(&SDominio,sizeof(TSServerInfo)); while(!TreeFile->Eof()) { TPreOrderNode* node = new TPreOrderNode(); TDomain* domain = new TDomain(); node->End(SDominio.End); node->RightLink(SDominio.LinkedRight); domain->NameDomain(SDominio.Name); node->Info(domain); aDomainsPreOrderList->Insert(node); TreeFile->Read(&SDominio,sizeof(TSDomainInfo)); } } TreeFile->Close(); delete TreeFile; }
static void PrintElementEdgeRatios(TDomain& dom) { int elemType = dom.domain_info().element_type(); MultiGrid& mg = *dom.grid(); UG_LOG("Element Edge Ratios:\n"); for(size_t lvl = 0; lvl < mg.num_levels(); ++lvl){ UG_LOG(" level " << lvl << ":\t"); switch(elemType){ case FACE: PrintElementEdgeRatios(mg, mg.begin<Face>(lvl), mg.end<Face>(lvl), dom.position_accessor()); break; case VOLUME: PrintElementEdgeRatios(mg, mg.begin<Volume>(lvl), mg.end<Volume>(lvl), dom.position_accessor()); break; default: UG_LOG("---\n"); break; } } }
static void ProjectVerticesToSphere(TDomain& dom, std::vector<number> center, number radius, number eps) { static const int dim = TDomain::dim; typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); typename TDomain::grid_type& g = *dom.grid(); if((int)center.size() != dim) UG_THROW("Expect center to be of dimension "<<dim); MathVector<dim> Center; for(int d = 0; d < dim; d++) Center[d] = center[d]; for(VertexIterator iter = g.vertices_begin(); iter != g.vertices_end(); ++iter) { MathVector<dim>& pos = aaPos[*iter]; // move only vertices in eps-environment of sphere if( VecDistance(pos, Center) < radius - eps || VecDistance(pos, Center) > radius + eps) continue; // get closest point on sphere MathVector<dim> dir; VecSubtract(dir, pos, Center); number s, s1Out, s2Out; if(RaySphereIntersection(s1Out,s2Out, Center, dir, Center, radius) < 1) UG_THROW("No intersection found for pos "<<pos); if(s1Out > s2Out) s = s1Out; else s = s2Out; if(s <= 0) UG_THROW("Invalid scale "<<s); // set new pos VecScaleAdd(pos, 1.0, Center, s, dir); } }
//----------------------------------------------------------------------------- //::::::::::::::::::::::::::::CREADORES DE CUENTAS::::::::::::::::::::::::::::::::::::: //----------------------------------------------------------------------------- AnsiString TAdministradora :: CreateDirection(TBinTreeNode* pServer,AnsiString pUserNameServer) { AnsiString email = pUserNameServer; while(pServer != aTree->Root()) { TDomain* Domain = (TDomain*)pServer->Info(); email = email + "." + Domain->NameDomain(); pServer=aTree->GetFather(pServer); } return email= email + "." + ( (TDomain*)aTree->Root()->Info() )->NameDomain(); }
static bool SavePartitionMap(PartitionMap& pmap, TDomain& domain, const char* filename) { PROFILE_FUNC_GROUP("grid"); if(domain.grid().get() != pmap.get_partition_handler()->grid()) { UG_LOG("WARNING in SavePartitionMap: The given partition map was not" " created for the given domain. Aborting...\n"); return false; } return SavePartitionMapToFile(pmap, filename, domain.position_attachment()); }
static number FaceArea(TDomain& dom, ISelector& sel) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); UG_ASSERT(TDomain::position_type::Size <= 3, "too many coordinates."); return FaceArea(sel, aaPos); }
static number FaceArea(TDomain& dom, ISubsetHandler& sh, int si, size_t lvl) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); UG_ASSERT(TDomain::position_type::Size <= 3, "too many coordinates."); return FaceArea(sh, si, lvl, aaPos); }
static void TranslateDomain(TDomain& dom, number tx, number ty, number tz) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); typename TDomain::grid_type& g = *dom.grid(); vector3 t(tx, ty, tz); const int numCoords = TDomain::position_type::Size; UG_ASSERT(numCoords <= 3, "too many coordinates."); for(VertexIterator iter = g.vertices_begin(); iter != g.vertices_end(); ++iter) { for(int i = 0; i < numCoords; ++i) aaPos[*iter][i] += t[i]; } }
static void RandomizeDomain(TDomain& dom, number dx, number dy, number dz) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); typename TDomain::grid_type& g = *dom.grid(); vector3 d(dx, dy, dz); const int numCoords = TDomain::position_type::Size; UG_ASSERT(numCoords <= 3, "too many coordinates."); for(VertexIterator iter = g.vertices_begin(); iter != g.vertices_end(); ++iter) { for(int i = 0; i < numCoords; ++i) aaPos[*iter][i] += urand(-d[i], d[i]); } }
static number GetMaxEdgeLength(TDomain& dom) { typename TDomain::position_accessor_type& aaPos = dom.position_accessor(); typename TDomain::grid_type& g = *dom.grid(); number maxLenSq = 0; for(EdgeIterator eiter = g.template begin<Edge>(); eiter != g.template end<Edge>(); ++eiter) { maxLenSq = max(maxLenSq, EdgeLengthSq(*eiter, aaPos)); } #ifdef UG_PARALLEL pcl::ProcessCommunicator com; number gMaxLenSq = com.allreduce(maxLenSq, PCL_RO_MAX); return sqrt(gMaxLenSq); #else return sqrt(maxLenSq); #endif }
static void LoadAndRefineDomain(TDomain& domain, const char* filename, int numRefs) { PROFILE_FUNC_GROUP("grid"); try{ LoadDomain(domain, filename); } UG_CATCH_THROW("LoadAndRefineDomain: Could not load domain at file: "<<filename); GlobalMultiGridRefiner ref(*domain.grid()); for(int i = 0; i < numRefs; ++i) ref.refine(); }
//----------------------------------------------------------------------------- //::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: //::::::::::::::::::: METODOS DE GUARDAR/CARGAR EN FICHEROS::::::::::::::::::: //:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: //----------------------------------------------------------------------------- //Nacionales Domains void TAdministradora :: SaveDominioTree(AnsiString pNameDomain) { TFile* TreeFile = new TFile(pNameDomain); TreeFile->Open("wb"); TreeFile->SeekTo(0); TSeqPreOrderTree* preorder = new TSeqPreOrderTree(aTree); if(TreeFile->IsOpen()) { TSDomainInfo SDominio; for(int i = 0; i < preorder->Length(); i++) { TPreOrderNode* node = (TPreOrderNode*)preorder->ItemInfo(i); SDominio.End = node->End(); SDominio.LinkedRight = node->RightLink(); TDomain* domain = (TDomain*)node->Info(); strcpy(SDominio.Name,domain->NameDomain().c_str()); TreeFile->Write(&SDominio,sizeof(TSDomainInfo)); } } TreeFile->Close(); delete TreeFile; }
int main( int argc, char** argv ) { std::string inputFilename = examplesPath + "samples/Al.100.vol"; //------------ typedef SpaceND<3> Space4Type; typedef HyperRectDomain<Space4Type> TDomain; typedef TDomain::Point Point; QApplication application(argc,argv); Viewer3D viewer; viewer.setWindowTitle("simpleViewer"); viewer.show(); //Default image selector = STLVector typedef ImageSelector<TDomain, unsigned char>::Type Image; Image image = VolReader<Image>::importVol( inputFilename ); TDomain domain = image.domain(); Image imageSeeds ( domain); for ( Image::Iterator it = imageSeeds.begin(), itend = imageSeeds.end();it != itend; ++it) (*it)=1; Z3i::Point p0(10,10,10); //imageSeeds.setValue(p0, 0 ); randomSeeds(imageSeeds, 70, 0); //Distance transformation computation typedef ImageSelector<TDomain, long int>::Type ImageLong; typedef SimpleThresholdForegroundPredicate<Image> Predicate; Predicate aPredicate(imageSeeds,0); typedef DistanceTransformation<Space4Type,Predicate, 2> DTL2; typedef DistanceTransformation<Space4Type,Predicate, 0> DTLInf; typedef DistanceTransformation<Space4Type,Predicate, 1> DTL1; DTL2 dtL2(domain, aPredicate); DTLInf dtLinf(domain, aPredicate); DTL1 dtL1(domain, aPredicate); DTL1::OutputImage resultL1 = dtL1.compute ( ); unsigned int min = 0; unsigned int max = 0; for(DTL1::OutputImage::ConstIterator it = resultL1.begin(), itend=resultL1.end(); it!=itend; ++it) { if( (*it) < min ) min=(*it); if( (*it) > max ) max=(*it); } GradientColorMap<long> gradient( 0,30); gradient.addColor(Color::Red); gradient.addColor(Color::Yellow); gradient.addColor(Color::Green); gradient.addColor(Color::Cyan); gradient.addColor(Color::Blue); gradient.addColor(Color::Magenta); gradient.addColor(Color::Red); viewer << SetMode3D( (*(domain.begin())).className(), "Paving" ); for(TDomain::ConstIterator it = domain.begin(), itend=domain.end(); it!=itend; ++it){ unsigned int valDist= resultL1( (*it) ); Color c= gradient(valDist); if(resultL1(*it)<=30 ){ viewer << CustomColors3D(Color((float)(c.red()), (float)(c.green()), (float)(c.blue(),205)), Color((float)(c.red()), (float)(c.green()), (float)(c.blue()),205)); viewer << *it ; } } //viewer << ClippingPlane(1,0,0,-60); viewer<< Viewer3D::updateDisplay; return application.exec(); }
static void MinimizeMemoryFootprint(TDomain& dom) { dom.grid()->set_options(GRIDOPT_VERTEXCENTRIC_INTERCONNECTION | GRIDOPT_AUTOGENERATE_SIDES); }
bool testEmptyDomain() { typedef SpaceND<3> TSpace; typedef TSpace::Point TPoint; typedef HyperRectDomain<TSpace> TDomain; unsigned int nb = 0; unsigned int nbok = 0; trace.beginBlock( "Test empty domain." ); const TDomain nonempty_domain( TPoint::diagonal(0), TPoint::diagonal(0) ); ++nb; nbok += nonempty_domain.isEmpty() ? 0 : 1; trace.info() << "(" << nbok << "/" << nb << ") Creating non-empty domain & checking isEmpty." << std::endl; const TDomain default_domain; ++nb; nbok += default_domain.isEmpty() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Creating default empty domain & checking isEmpty." << std::endl; const TDomain domain( TPoint::diagonal(1), TPoint::diagonal(0) ); ++nb; nbok += domain.isEmpty() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Creating default custom domain & checking isEmpty." << std::endl; ++nb; nbok += domain.size() == 0 ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Empty domain has size = " << domain.size() << std::endl; ++nb; nbok += domain.begin() == domain.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end()" << std::endl; ++nb; nbok += domain.rbegin() == domain.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend()" << std::endl; TDomain::ConstSubRange range = domain.subRange( 0, 1, 2, domain.lowerBound() ); ++nb; nbok += range.begin() == range.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end() for sub-range {0,1,2}" << std::endl; ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend() for sub-range {0,1,2}" << std::endl; range = domain.subRange( 2, 1, 0, domain.lowerBound() ); ++nb; nbok += range.begin() == range.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end() for sub-range {2,1,0}" << std::endl; ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend() for sub-range {2,1,0}" << std::endl; range = domain.subRange( 0, 2, domain.lowerBound() ); ++nb; nbok += range.begin() == range.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end() for sub-range {0,2}" << std::endl; ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend() for sub-range {0,2}" << std::endl; range = domain.subRange( 2, 0, domain.lowerBound() ); ++nb; nbok += range.begin() == range.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end() for sub-range {2,0}" << std::endl; ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend() for sub-range {2,0}" << std::endl; range = domain.subRange( 1, domain.lowerBound() ); ++nb; nbok += range.begin() == range.end() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that begin() == end() for sub-range {1}" << std::endl; ++nb; nbok += range.rbegin() == range.rend() ? 1 : 0; trace.info() << "(" << nbok << "/" << nb << ") Checking that rbegin() == rend() for sub-rang {1}" << std::endl; trace.endBlock(); return nb == nbok; }