DGtal  1.0.0
dvcm-2d.cpp
1 
49 #include <iostream>
51 #include "DGtal/base/Common.h"
52 #include "DGtal/helpers/StdDefs.h"
53 #include "DGtal/kernel/BasicPointPredicates.h"
54 #include "DGtal/math/linalg/EigenDecomposition.h"
55 #include "DGtal/geometry/volumes/distance/ExactPredicateLpSeparableMetric.h"
56 #include "DGtal/geometry/volumes/estimation/VoronoiCovarianceMeasure.h"
57 #include "DGtal/io/colormaps/GradientColorMap.h"
58 #include "DGtal/io/boards/Board2D.h"
59 #include "ConfigExamples.h"
60 
61 
63 
64 using namespace std;
65 using namespace DGtal;
66 
68 int main( int /* argc */, char** /* argv */ )
69 {
70  typedef Z2i::Space Space;
71  typedef Z2i::Point Point;
72  typedef Z2i::RealPoint RealPoint;
75  typedef ExactPredicateLpSeparableMetric<Space, 2> Metric; // L2-metric
76  typedef EigenDecomposition<2,double> LinearAlgebraTool;
77  typedef LinearAlgebraTool::Matrix Matrix;
78 
80  typedef functors::HatPointFunction<Point,double> KernelFunction;
81 
82  // Gets the points
83  vector<unsigned int> vPos;
84  vPos.push_back(0);
85  vPos.push_back(1);
86  string inputSDP = examplesPath + "samples/flower-30-8-3.sdp";
87  // string inputSDP = examplesPath + "samples/ellipse-20-7-0.4.sdp";
88  // string inputSDP = examplesPath + "samples/accflower-20-5-5-0.1.sdp";
89  trace.info() << "Reading input 2d discrete points file: " << inputSDP;
90  std::vector<Point> pts = PointListReader<Point>::getPointsFromFile(inputSDP, vPos);
91  trace.info() << " [done] " << std::endl ;
92  const double R = 20;
93  trace.info() << "Big radius R = " << R << std::endl;
94  const double r = 5;
95  trace.info() << "Small radius r = " << r << std::endl;
96  const double T = 0.1;
97  trace.info() << "Feature thres. T = " << T << std::endl; // threshold for displaying features as red.
98  const double size = 3.0; // size of displayed normals
99 
100  Metric l2;
101  VCM vcm( R, ceil( r ), l2, true );
102  vcm.init( pts.begin(), pts.end() );
103  Domain domain = vcm.domain();
104  KernelFunction chi( 1.0, r );
105 
106  // Flat zones are metallic blue, slightly curved zones are white,
107  // more curved zones are yellow till red.
108  GradientColorMap<double> colormap( 0.0, T );
109  colormap.addColor( Color( 128, 128, 255 ) );
110  colormap.addColor( Color( 255, 255, 255 ) );
111  colormap.addColor( Color( 255, 255, 0 ) );
112  colormap.addColor( Color( 255, 0, 0 ) );
113  Board2D board;
114  Matrix vcm_r, evec;
115  RealVector eval;
116  for ( std::vector<Point>::const_iterator it = pts.begin(), itE = pts.end();
117  it != itE; ++it )
118  {
119  // Compute VCM and diagonalize it.
120  vcm_r = vcm.measure( chi, *it );
121  LinearAlgebraTool::getEigenDecomposition( vcm_r, evec, eval );
122  double feature = eval[ 0 ] / ( eval[ 0 ] + eval[ 1 ] );
123  board << CustomStyle( it->className(),
124  new CustomColors( Color::Black, colormap( feature > T ? T : feature ) ) )
125  << *it;
126  // Display normal
127  RealVector normal = evec.column( 1 );
128  RealPoint p( (*it)[ 0 ], (*it)[ 1 ] );
129  Display2DFactory::draw( board, size*normal, p );
130  Display2DFactory::draw( board, -size*normal, p );
131  }
132  board.saveSVG("dvcm-hat-r.svg");
133 
134  return 0;
135 }
136 // //
HyperRectDomain< Space > Domain
Aim: This class template may be used to (linearly) convert scalar values in a given range into a colo...
Trace trace
Definition: Common.h:144
Z3i::RealVector RealVector
Aim: This class provides methods to compute the eigen decomposition of a matrix. Its objective is to ...
Custom style class redefining the pen color and the fill color. You may use Board2D::Color::None for ...
Definition: Board2D.h:278
Domain domain
PointVector< 3, double > RealPoint
void saveSVG(const char *filename, PageSize size=Board::BoundingBox, double margin=10.0) const
Definition: Board.cpp:1012
Aim: implements separable l_p metrics with exact predicates.
Aim: Implements method to read a set of points represented in each line of a file.
int main(int argc, char **argv)
DGtal is the top-level namespace which contains all DGtal functions and types.
MyPointD Point
Definition: testClone2.cpp:383
std::ostream & info()
Structure representing an RGB triple with alpha component.
Definition: Color.h:66
void draw(const Iterator &itb, const Iterator &ite, Board &aBoard)
Aim: This class specializes a 'Board' class so as to display DGtal objects more naturally (with <<)....
Definition: Board2D.h:70