This example shows the recognition of a simple digital plane with the Chord algorithm (class DGtal::ChordNaivePlaneComputer). Green points belong to the naive plane. There is no naive plane containing the green points and any one of the red points.
#include <cstdlib>
#include <iostream>
#include "DGtal/base/Common.h"
#include "DGtal/helpers/StdDefs.h"
#include "DGtal/geometry/surfaces/ChordNaivePlaneComputer.h"
#include "DGtal/io/viewers/Viewer3D.h"
using namespace std;
template <typename Viewer3D, typename Domain, typename Predicate>
void
{
itB != itE; ++itB )
{
if ( pred( *itB ) )
viewer << *itB;
}
}
int main(
int argc,
char** argv )
{
using namespace Z3i;
QApplication application(argc,argv);
unsigned int nbok = 0;
unsigned int nb = 0;
typedef ChordNaivePlaneComputer<Z3, Z3::Point, int> PlaneComputer;
typedef PlaneComputer::Primitive Primitive;
PlaneComputer plane;
plane.init( 2, 1, 1 );
bool pt0_inside = plane.extend( pt0 );
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") Plane=" << plane
<< std::endl;
bool pt1_inside = plane.extend( pt1 );
++nb; nbok += pt1_inside == true ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt1
<< " Plane=" << plane << std::endl;
bool pt2_inside = plane.extend( pt2 );
++nb; nbok += pt2_inside == true ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt2
<< " Plane=" << plane << std::endl;
bool pt3_inside = plane.extend( pt3 );
++nb; nbok += pt3_inside == false ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt3
<< " Plane=" << plane << std::endl;
bool pt4_inside = plane.extend( pt4 );
++nb; nbok += pt4_inside == false ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt4
<< " Plane=" << plane << std::endl;
bool pt5_inside = plane.extend( pt5 );
++nb; nbok += pt5_inside == true ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt5
<< " Plane=" << plane << std::endl;
bool pt6_inside = plane.extend( pt6 );
++nb; nbok += pt6_inside == true ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") add " << pt5
<< " Plane=" << plane << std::endl;
Primitive strip = plane.primitive();
<< " axis=" << strip.mainAxis()
<< " axiswidth=" << strip.axisWidth()
<< " diag=" << strip.mainDiagonal()
<< " diagwidth=" << strip.diagonalWidth()
<< std::endl;
++nb; nbok += strip.axisWidth() < 1.0 ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") axiswidth < 1 "
<< std::endl;
++nb; nbok += strip.diagonalWidth() < sqrt(3.0) ? 1 : 0;
trace.
info() <<
"(" << nbok <<
"/" << nb <<
") axiswidth < sqrt(3) "
<< std::endl;
trace.
emphase() << ( nbok == nb ?
"Passed." :
"Error." ) << endl;
typedef Viewer3D<> MyViewer;
MyViewer viewer;
viewer.show();
Color red( 255, 0, 0 );
Color green( 0, 255, 0 );
Color grey( 200, 200, 200 );
viewer << ( pt0_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt0;
viewer << ( pt1_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt1;
viewer << ( pt2_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt2;
viewer << ( pt3_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt3;
viewer << ( pt4_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt4;
viewer << ( pt5_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt5;
viewer << ( pt6_inside ? CustomColors3D( green, green ) : CustomColors3D( red, red ) ) << pt6;
viewer << CustomColors3D( grey, grey );
viewer << MyViewer::updateDisplay;
return application.exec();
}
void beginBlock(const std::string &keyword="")
MyDigitalSurface::ConstIterator ConstIterator
DGtal is the top-level namespace which contains all DGtal functions and types.
int main(int argc, char **argv)
HyperRectDomain< Space > Domain
void displayPredicate(Viewer3D &viewer, const Domain &domain, const Predicate &pred)