Пример #1
0
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();
}
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;
  
}