00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "mitkTestingMacros.h"
00019 #include "mitkPlanarCross.h"
00020 #include "mitkPlaneGeometry.h"
00021
00022
00023 class mitkPlanarCrossTestClass
00024 {
00025
00026 public:
00027
00028
00029 static void TestPlanarCrossPlacement( mitk::PlanarCross::Pointer planarCross )
00030 {
00031
00032 MITK_TEST_CONDITION( planarCross->GetMinimumNumberOfControlPoints() == 4, "Minimum number of control points" );
00033
00034
00035 MITK_TEST_CONDITION( planarCross->GetMaximumNumberOfControlPoints() == 4, "Maximum number of control points" );
00036
00037
00038 mitk::Point2D p0;
00039 p0[0] = 20.0; p0[1] = 20.0;
00040 planarCross->PlaceFigure( p0 );
00041
00042
00043 mitk::Point2D p1;
00044 p1[0] = 80.0; p1[1] = 80.0;
00045 planarCross->SetCurrentControlPoint( p1 );
00046
00047
00048 mitk::Point2D p2;
00049 p2[0] = 90.0; p2[1] = 10.0;
00050 planarCross->AddControlPoint( p2 );
00051
00052
00053 const mitk::PlanarFigure::VertexContainerType* helperPolyLine = planarCross->GetHelperPolyLine( 0, 1.0, 100 );
00054 MITK_TEST_CONDITION( planarCross->GetHelperPolyLinesSize() == 1, "Number of helper polylines after placing 3 points" );
00055
00056
00057 MITK_TEST_CONDITION( planarCross->IsHelperToBePainted( 0 ), "Helper line to be painted after placing 3 points" );
00058
00059
00060 mitk::Vector2D v0 = p1 - p0;
00061 v0.Normalize();
00062 mitk::Vector2D hv = helperPolyLine->ElementAt( 1 ) - helperPolyLine->ElementAt( 0 );
00063 hv.Normalize();
00064 MITK_TEST_CONDITION( fabs(v0 * hv) < mitk::eps, "Helper line is orthogonal to first line" );
00065
00066
00067 mitk::Vector2D hv1 = helperPolyLine->ElementAt( 1 ) - p2;
00068 hv1.Normalize();
00069 MITK_TEST_CONDITION( fabs(hv * hv1 - 1.0) < mitk::eps, "Helper line is aligned to third point" );
00070
00071
00072
00073 mitk::Point2D p3;
00074 p3[0] = 10.0; p3[1] = 90.0;
00075 planarCross->AddControlPoint( p3 );
00076
00077
00078 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 4, "Number of control points after placement" );
00079
00080
00081 MITK_TEST_CONDITION( !planarCross->IsClosed(), "Is PlanarFigure closed?" );
00082
00083
00084 MITK_TEST_CONDITION( planarCross->IsHelperToBePainted( 0 ), "Helper line no longer to be painted after placement of all 4 points" );
00085
00086
00087
00088 const mitk::PlanarFigure::VertexContainerType* polyLine0 = planarCross->GetPolyLine( 0 );
00089 const mitk::PlanarFigure::VertexContainerType* polyLine1 = planarCross->GetPolyLine( 1 );
00090 MITK_TEST_CONDITION( planarCross->GetPolyLinesSize() == 2, "Number of polylines after placement" );
00091
00092
00093 const mitk::Point2D& pp0 = polyLine0->ElementAt( 0 );
00094 const mitk::Point2D& pp1 = polyLine0->ElementAt( 1 );
00095 MITK_TEST_CONDITION( ((pp0 == p0) && (pp1 == p1))
00096 || ((pp0 == p1) && (pp1 == p0)), "Correct polyline 1" );
00097
00098 const mitk::Point2D& pp2 = polyLine1->ElementAt( 0 );
00099 const mitk::Point2D& pp3 = polyLine1->ElementAt( 1 );
00100 MITK_TEST_CONDITION( ((pp2 == p2) && (pp3 == p3))
00101 || ((pp2 == p3) && (pp3 == p2)), "Correct polyline 2" );
00102
00103
00104
00105 planarCross->EvaluateFeatures();
00106 MITK_TEST_CONDITION( planarCross->GetNumberOfFeatures() == 2, "Number of measurement features" );
00107
00108
00109 double length0 = sqrt( 80.0 * 80.0 * 2.0 );
00110 MITK_TEST_CONDITION( fabs( planarCross->GetQuantity( 0 ) - length0) < mitk::eps, "Size of longest diameter" );
00111
00112 double length1 = sqrt( 60.0 * 60.0 * 2.0 );
00113 MITK_TEST_CONDITION( fabs( planarCross->GetQuantity( 1 ) - length1) < mitk::eps, "Size of short axis diameter" );
00114 }
00115
00116
00117 static void TestPlanarCrossPlacementSingleLine(mitk::PlanarCross::Pointer planarCross)
00118 {
00119
00120 MITK_TEST_CONDITION( planarCross->GetMinimumNumberOfControlPoints() == 2, "Minimum number of control points" );
00121
00122
00123 MITK_TEST_CONDITION( planarCross->GetMaximumNumberOfControlPoints() == 2, "Maximum number of control points" );
00124
00125
00126 mitk::Point2D p0;
00127 p0[0] = 25.0; p0[1] = 10.0;
00128 planarCross->PlaceFigure( p0 );
00129
00130
00131 mitk::Point2D p1;
00132 p1[0] = 30.0; p1[1] = 60.0;
00133 planarCross->SetCurrentControlPoint( p1 );
00134
00135
00136 MITK_TEST_CONDITION( planarCross->IsHelperToBePainted( 0 ) == false, "No helper line to be painted in single-line mode" );
00137
00138
00139 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 2, "Number of control points after placement" );
00140
00141
00142 MITK_TEST_CONDITION( !planarCross->IsClosed(), "Is PlanarFigure closed?" );
00143
00144
00145
00146 const mitk::PlanarFigure::VertexContainerType* polyLine0 = planarCross->GetPolyLine( 0 );
00147 MITK_TEST_CONDITION( planarCross->GetPolyLinesSize() == 1, "Number of polylines after placement" );
00148
00149
00150 const mitk::Point2D& pp0 = polyLine0->ElementAt( 0 );
00151 const mitk::Point2D& pp1 = polyLine0->ElementAt( 1 );
00152 MITK_TEST_CONDITION( ((pp0 == p0) && (pp1 == p1))
00153 || ((pp0 == p1) && (pp1 == p0)), "Correct polyline 1" );
00154
00155
00156
00157 planarCross->EvaluateFeatures();
00158 MITK_TEST_CONDITION( planarCross->GetNumberOfFeatures() == 1, "Number of measurement features" );
00159
00160
00161 double length0 = sqrt( 5.0 * 5.0 + 50.0 * 50.0 );
00162 MITK_TEST_CONDITION( fabs( planarCross->GetQuantity( 0 ) - length0) < mitk::eps, "Size of diameter" );
00163
00164
00165 MITK_TEST_CONDITION( planarCross->ResetOnPointSelect() == false, "Single-line PlanarCross should not be reset on point edit" );
00166 }
00167
00168
00169 static void TestPlanarCrossPlacementConstrained(mitk::PlanarCross::Pointer planarCross)
00170 {
00171
00172
00173 mitk::Point2D p0;
00174 p0[0] = -20.0; p0[1] = 20.0;
00175 planarCross->PlaceFigure( p0 );
00176
00177
00178 mitk::Point2D cp0 = planarCross->GetControlPoint( 0 );
00179 MITK_TEST_CONDITION(
00180 (fabs(cp0[0]) < mitk::eps)
00181 && (fabs(cp0[1] - 20.0) < mitk::eps), "Point1 placed and constrained correctly" );
00182
00183
00184
00185 mitk::Point2D p1;
00186 p1[0] = 80.0; p1[1] = 120.0;
00187 planarCross->SetCurrentControlPoint( p1 );
00188
00189
00190 mitk::Point2D cp1 = planarCross->GetControlPoint( 1 );
00191 MITK_TEST_CONDITION(
00192 (fabs(cp1[0] - 80.0) < mitk::eps)
00193 && (fabs(cp1[1] - 100.0) < mitk::eps), "Point2 placed and constrained correctly" );
00194
00195
00196
00197 mitk::Point2D p2;
00198 p2[0] = 100.0; p2[1] = 100.0;
00199 planarCross->AddControlPoint( p2 );
00200
00201
00202 mitk::Point2D cp2 = planarCross->GetControlPoint( 2 );
00203 MITK_TEST_CONDITION(
00204 (fabs(cp2[0] - 90.0) < mitk::eps)
00205 && (fabs(cp2[1] - 90.0) < mitk::eps), "Point3 placed and constrained correctly" );
00206
00207
00208 p2[0] = 40.0; p2[1] = 20.0;
00209 planarCross->SetControlPoint( 2, p2 );
00210
00211
00212 cp2 = planarCross->GetControlPoint( 2 );
00213 MITK_TEST_CONDITION(
00214 (fabs(cp2[0] - 40.0) < mitk::eps)
00215 && (fabs(cp2[1] - 20.0) < mitk::eps), "Point3 moved correctly" );
00216
00217
00218
00219 mitk::Point2D p3;
00220 p3[0] = 20.0; p3[1] = 60.0;
00221 planarCross->AddControlPoint( p3 );
00222
00223
00224 mitk::Point2D cp3 = planarCross->GetControlPoint( 3 );
00225 MITK_TEST_CONDITION(
00226 (fabs(cp3[0] - 10.0) < mitk::eps)
00227 && (fabs(cp3[1] - 50.0) < mitk::eps), "Point4 placed and constrained correctly" );
00228
00229
00230
00231 p3[0] = 40.0; p3[1] = 30.0;
00232 planarCross->SetControlPoint( 3, p3 );
00233
00234
00235 cp3 = planarCross->GetControlPoint( 3 );
00236 MITK_TEST_CONDITION(
00237 (fabs(cp3[0] - 20.0) < mitk::eps)
00238 && (fabs(cp3[1] - 40.0) < mitk::eps), "Point4 placed and constrained correctly" );
00239 }
00240
00241
00242 static void TestPlanarCrossEdit(mitk::PlanarCross::Pointer planarCross)
00243 {
00244
00245
00246
00247 mitk::Point2D p0 = planarCross->GetControlPoint( 0 );
00248 mitk::Point2D p1 = planarCross->GetControlPoint( 1 );
00249 mitk::Point2D p2 = planarCross->GetControlPoint( 2 );
00250 mitk::Point2D p3 = planarCross->GetControlPoint( 3 );
00251
00252
00253
00254 planarCross->SelectControlPoint( 0 );
00255
00256
00257 MITK_TEST_CONDITION( planarCross->ResetOnPointSelect(), "Editing control point 0: Double-line PlanarCross should be reset" );
00258
00259
00260 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 2, "Two control points are left" );
00261
00262
00263 MITK_TEST_CONDITION(
00264 (planarCross->GetControlPoint( 0 ).EuclideanDistanceTo( p1 ) < mitk::eps)
00265 && (planarCross->GetControlPoint( 1 ).EuclideanDistanceTo( p0 ) < mitk::eps),
00266 "Reset to expected control points (p1, p0)" );
00267
00268
00269 ResetPlanarCross( planarCross, p0, p1, p2, p3 );
00270
00271
00272
00273
00274 planarCross->SelectControlPoint( 1 );
00275
00276
00277 MITK_TEST_CONDITION( planarCross->ResetOnPointSelect(), "Editing control point 1: Double-line PlanarCross should be reset" );
00278
00279
00280 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 2, "Two control points are left" );
00281
00282
00283 MITK_TEST_CONDITION(
00284 (planarCross->GetControlPoint( 0 ).EuclideanDistanceTo( p0 ) < mitk::eps)
00285 && (planarCross->GetControlPoint( 1 ).EuclideanDistanceTo( p1 ) < mitk::eps),
00286 "Reset to expected control points (p0, p1)" );
00287
00288
00289 ResetPlanarCross( planarCross, p0, p1, p2, p3 );
00290
00291
00292
00293
00294 planarCross->SelectControlPoint( 2 );
00295
00296
00297 MITK_TEST_CONDITION( planarCross->ResetOnPointSelect(), "Editing control point 2: Double-line PlanarCross should be reset" );
00298
00299
00300 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 2, "Two control points are left" );
00301
00302
00303 MITK_TEST_CONDITION(
00304 (planarCross->GetControlPoint( 0 ).EuclideanDistanceTo( p3 ) < mitk::eps)
00305 && (planarCross->GetControlPoint( 1 ).EuclideanDistanceTo( p2 ) < mitk::eps),
00306 "Reset to expected control points (p3, p2)" );
00307
00308
00309 ResetPlanarCross( planarCross, p0, p1, p2, p3 );
00310
00311
00312
00313
00314 planarCross->SelectControlPoint( 3 );
00315
00316
00317 MITK_TEST_CONDITION( planarCross->ResetOnPointSelect(), "Editing control point 3: Double-line PlanarCross should be reset" );
00318
00319
00320 MITK_TEST_CONDITION( planarCross->GetNumberOfControlPoints() == 2, "Two control points are left" );
00321
00322
00323 MITK_TEST_CONDITION(
00324 (planarCross->GetControlPoint( 0 ).EuclideanDistanceTo( p2 ) < mitk::eps)
00325 && (planarCross->GetControlPoint( 1 ).EuclideanDistanceTo( p3 ) < mitk::eps),
00326 "Reset to expected control points (p2, p3)" );
00327 }
00328
00329
00330 static void ResetPlanarCross( mitk::PlanarCross::Pointer planarCross,
00331 mitk::Point2D p0, mitk::Point2D p1, mitk::Point2D p2, mitk::Point2D p3 )
00332 {
00333 planarCross->SetControlPoint( 0, p0, true );
00334 planarCross->SetControlPoint( 1, p1, true );
00335 planarCross->SetControlPoint( 2, p2, true );
00336 planarCross->SetControlPoint( 3, p3, true );
00337 }
00338
00339
00340 };
00341
00342
00352 int mitkPlanarCrossTest(int , char* [])
00353 {
00354
00355 MITK_TEST_BEGIN("PlanarCross")
00356
00357
00358 mitk::PlaneGeometry::Pointer planeGeometry = mitk::PlaneGeometry::New();
00359 planeGeometry->InitializeStandardPlane( 100.0, 100.0 );
00360
00361
00362
00363 mitk::PlanarCross::Pointer planarCross = mitk::PlanarCross::New();
00364 planarCross->SetGeometry2D( planeGeometry );
00365
00366
00367 MITK_TEST_CONDITION_REQUIRED( planarCross.IsNotNull(), "Testing instantiation" );
00368
00369
00370 MITK_TEST_CONDITION_REQUIRED( !planarCross->GetSingleLineMode(), "Testing default cross mode" );
00371
00372
00373
00374 mitkPlanarCrossTestClass::TestPlanarCrossPlacement( planarCross );
00375
00376
00377
00378
00379 planarCross = mitk::PlanarCross::New();
00380 planarCross->SingleLineModeOn();
00381 planarCross->SetGeometry2D( planeGeometry );
00382
00383
00384 MITK_TEST_CONDITION_REQUIRED( planarCross->GetSingleLineMode(), "Testing activation of single-line mode" );
00385
00386
00387 mitkPlanarCrossTestClass::TestPlanarCrossPlacementSingleLine( planarCross );
00388
00389
00390
00391
00392 planarCross = mitk::PlanarCross::New();
00393 planarCross->SetGeometry2D( planeGeometry );
00394
00395
00396
00397 mitkPlanarCrossTestClass::TestPlanarCrossPlacementConstrained( planarCross );
00398
00399
00400
00401
00402 mitkPlanarCrossTestClass::TestPlanarCrossEdit( planarCross );
00403
00404
00405
00406
00407 MITK_TEST_END()
00408 }