DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testShapesFromPoints.cpp
1 
32 
33 #include <iostream>
34 #include <fstream>
35 #include <sstream>
36 #include <exception>
37 #include <boost/program_options.hpp>
38 
39 #include "DGtal/base/Common.h"
40 #include "DGtal/kernel/PointVector.h"
41 #include "DGtal/shapes/fromPoints/CircleFrom3Points.h"
42 #include "DGtal/shapes/fromPoints/CircleFrom2Points.h"
43 
44 #include "DGtal/io/boards/Board2D.h"
45 
46 #include "ConfigTest.h"
47 
49 
50 using namespace std;
51 using namespace DGtal;
52 
54 // testing Functions
56 
61 template <typename Coordinate>
62 bool testCircleFrom3Points()
63 {
64 
65  trace.beginBlock("Simple test for CircleFrom3Points");
66 
69  Point o(0,0);
70 
71  {
72  c.init( Point(0,1), Point(150,18), Point(250,-48) );
73  trace.info() << c << endl;
74  trace.info() << o << " is at distance " << c.signedDistance(o) << endl;
75  if (c.signedDistance(o) != -4026300) return false;
76  }
77  {
78  c.init( Point(0,1), Point(150,18), Point(100,48) );
79  trace.info() << c << endl;
80  trace.info() << o << " is at distance " << c.signedDistance(o) << endl;
81  if (c.signedDistance(o) != 442200) return false;
82  }
83  {
84  c.init( Point(8,4), Point(9,3), Point(10,0) );
85  trace.info() << c << endl;
86  trace.info() << o << " is at distance " << c.signedDistance(o) << endl;
87  if (c.signedDistance(o) != 0) return false;
88  double cx, cy, r;
89  c.getParameters(cx, cy, r);
90  if ( (cx != 5.0)||(cy != 0.0) )
91  {
92  trace.emphase() << "error in returned center" << endl;
93  trace.info() << "(" << cx << "," << cy << ") " << endl;
94  trace.info() << "instead of (5,0)" << endl;
95  return false;
96  }
97  }
98  {
99  c.init( Point(0,0), Point(150,20), Point(15,2) );
100  trace.info() << c << endl;
101  trace.info() << o << " is at distance " << c.signedDistance(o) << endl;
102  if (c.signedDistance(o) != 0) return false;
103  }
104 
105  Board2D board;
106  board << SetMode(o.className(), "Grid") << o;
107  {
108  c.init( Point(8,4), Point(9,3), Point(10,0) );
109  trace.info() << "arc drawing" << endl;
110 
111  board << SetMode( c.className(), "Arc" );
112  Display2DFactory::draw(board, c, Point(5,10), Point(8,4));
113 
114  board << SetMode( c.className(), "Sector" );
115  Display2DFactory::draw(board, c, Point(9,3), Point(10,0) );
116 
117  board << SetMode( c.className(), "Annulus" );
118  Display2DFactory::draw(board, c, Point(5,-10), Point(2,-4) );
119 
120  board.saveEPS("arcDisplay.eps");
121  }
122 
123 
124  trace.endBlock();
125 
126  return true;
127 }
128 
129 template <typename Coordinate>
130 bool testCircleFrom2Points()
131 {
132 
133  trace.beginBlock("Simple test for CircleFrom2Points");
134 
135  typedef PointVector<2,Coordinate> Point;
136  Point o(0,0);
137  Point pole(0,1);
138  CircleFrom2Points<Point> c( pole );
139 
140  {
141  c.init( Point(15,2), Point(10,5) );
142  trace.info() << c << endl;
143  trace.info() << o << " is at distance " << c.signedDistance(o) << endl;
144  if (c.signedDistance(o) != 470) return false;
145 
146  }
147 
148  trace.endBlock();
149 
150  return true;
151 }
152 
153 
155 // Standard services - public :
156 
157 int main( int argc, char** argv )
158 {
159  trace.beginBlock ( "Testing shapes from points" );
160  trace.info() << "Args:";
161  for ( int i = 0; i < argc; ++i )
162  trace.info() << " " << argv[ i ];
163  trace.info() << endl;
164 
165 
166  bool res = testCircleFrom3Points<int>()
167  && testCircleFrom3Points<double>()
168 #ifdef WITH_BIGINTEGER
169  && testCircleFrom3Points<BigInteger>()
170 #endif
171  && testCircleFrom2Points<int>()
172 ;
173 
174 
175  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
176  trace.endBlock();
177 
178  return res ? 0 : 1;
179 }
180 // //