OpenWalnut  1.5.0dev
WVisiTrace_test.h
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2017 OpenWalnut Community and Hochschule Worms
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #ifndef WVISITRACE_TEST_H
26 #define WVISITRACE_TEST_H
27 
28 #include <utility>
29 #include <vector>
30 
31 #include <cxxtest/TestSuite.h>
32 
33 #include "../WVisiTrace.h"
34 #include "../../../core/common/math/test/WPositionTraits.h"
35 
36 /**
37  * Test for WMWriteMesh
38  */
39 class WVisiTraceTest : public CxxTest::TestSuite
40 {
41 public:
42  /**
43  * Setup method called before every test case.
44  */
45  void setUp()
46  {
47  }
48 
49  /**
50  * Ensure instantiation does not throw and does initialization right.
51  */
53  {
54  TS_ASSERT_THROWS_NOTHING( WVisiTrace() );
55  }
56 
57  /**
58  * Ensure that getline does not return anything until something is added.
59  */
61  {
62  WVisiTrace myVisiTrace;
63  std::vector< WPosition > line = myVisiTrace.getLine();
64  TS_ASSERT_EQUALS( line.size(), 0 );
65  }
66 
67  /**
68  * Check correct order resulting from getLinearizedNodesRefs
69  */
71  {
72  WVisiTrace myVisiTrace;
73  std::vector< std::vector< WPosition > > candidates;
74  const std::vector< int > sizes = { 4, 2, 5, 8, 3, 6 };
75  for( size_t id = 0; id < sizes.size(); ++id )
76  {
77  myVisiTrace.m_candidatePositions.push_back( std::vector< WPosition >( sizes[id] ) );
78  }
79 
80  std::vector< std::pair< int, int > > order = myVisiTrace.getLinearizedNodesRefs();
81 
82  TS_ASSERT_EQUALS( order.size(), 28 );
83 
84  TS_ASSERT_EQUALS( order[0], std::make_pair( 0, 0 ) );
85  TS_ASSERT_EQUALS( order[1], std::make_pair( 0, 1 ) );
86  TS_ASSERT_EQUALS( order[2], std::make_pair( 0, 2 ) );
87  TS_ASSERT_EQUALS( order[3], std::make_pair( 0, 3 ) );
88 
89  TS_ASSERT_EQUALS( order[5], std::make_pair( 1, 1 ) );
90  TS_ASSERT_EQUALS( order[6], std::make_pair( 2, 0 ) );
91 
92  TS_ASSERT_EQUALS( order[27], std::make_pair( 5, 5 ) );
93  }
94 
95  /**
96  * Check getLinearizedNodesRefs
97  */
99  {
100  WVisiTrace myVisiTrace;
101  std::vector< std::vector< WPosition > > candidates;
102  const std::vector< int > sizes = { 4, 2, 5, 8, 3, 6 };
103  for( size_t id = 0; id < sizes.size(); ++id )
104  {
105  myVisiTrace.m_candidatePositions.push_back( std::vector< WPosition >( sizes[id] ) );
106  }
107 
108  std::vector< std::vector< int > > inverseRefs = myVisiTrace.getInverseLinearizedNodesRefs();
109 
110  TS_ASSERT_EQUALS( inverseRefs.size(), 6 );
111 
112  TS_ASSERT_EQUALS( inverseRefs[0][0], 0 );
113  TS_ASSERT_EQUALS( inverseRefs[0][1], 1 );
114  TS_ASSERT_EQUALS( inverseRefs[0][2], 2 );
115  TS_ASSERT_EQUALS( inverseRefs[0][3], 3 );
116 
117  TS_ASSERT_EQUALS( inverseRefs[1][0], 4 );
118  TS_ASSERT_EQUALS( inverseRefs[1][1], 5 );
119 
120  TS_ASSERT_EQUALS( inverseRefs[2][0], 6 );
121 
122  TS_ASSERT_EQUALS( inverseRefs[5][5], 27 );
123  }
124 
125  /**
126  * Check throwing of Dijkstra and result according to VisiTrace with constant opacity weights.
127  */
129  {
130  WVisiTrace myVisiTrace;
131 
132  myVisiTrace.m_candidatePositions.push_back(
133  {
134  WPosition( 1, 0, 0 ),
135  WPosition( 1, 0, 1 ),
136  WPosition( 1, 0, 2 ),
137  WPosition( 1, 0, 3 )
138  }
139  );
140  myVisiTrace.m_candidateJumps.push_back( { 0.5, 0.5, 0.5, 0.5 } ); // NOLINT
141 
142  myVisiTrace.m_candidatePositions.push_back(
143  {
144  WPosition( 1, 1, -3.5 ),
145  WPosition( 1, 1, -2.5 )
146  }
147  );
148  myVisiTrace.m_candidateJumps.push_back( { 0.5, 0.5 } ); // NOLINT
149 
150  myVisiTrace.m_candidatePositions.push_back(
151  {
152  WPosition( 1, 1.2, 0 ),
153  WPosition( 1, 1.2, 1 ),
154  WPosition( 1, 1.2, 2 ),
155  WPosition( 1, 1.2, 3 )
156  }
157  );
158  myVisiTrace.m_candidateJumps.push_back( { 0.5, 0.5, 0.5, 0.5 } ); // NOLINT
159 
160  TS_ASSERT_EQUALS( myVisiTrace.m_candidatePositions.size(), 3 );
161  TS_ASSERT_THROWS_NOTHING( myVisiTrace.performDijkstra() );
162  TS_ASSERT_EQUALS( myVisiTrace.m_curve3D.size(), 3 );
163  TS_ASSERT_EQUALS( myVisiTrace.m_curve3D[0], WPosition( 1, 0, 0 ) );
164  TS_ASSERT_EQUALS( myVisiTrace.m_curve3D[1], WPosition( 1, 1, -2.5 ) );
165  TS_ASSERT_EQUALS( myVisiTrace.m_curve3D[2], WPosition( 1, 1.2, 0 ) );
166  }
167 
168 
169  /**
170  * Does addCandidatesForRay() actually add positions
171  */
173  {
174  WVisiTrace visiTraceAdding;
175 
176 
177  const size_t numCands1 = 11;
178  const size_t numCands2 = 12;
179  const size_t numCands3 = 13;
180  {
181  std::vector< std::pair< double, WPosition > > cands1;
182  const double someDoubleValue1 = 1.1;
183  for( size_t id = 0; id < numCands1; ++id )
184  {
185  cands1.push_back( std::make_pair( someDoubleValue1 * id, WPosition( someDoubleValue1 * id, someDoubleValue1, someDoubleValue1 ) ) );
186  }
187  visiTraceAdding.addCandidatesForRay( cands1 );
188  }
189  {
190  std::vector< std::pair< double, WPosition > > cands2;
191  const double someDoubleValue2 = 1.2;
192  for( size_t id = 0; id < numCands2; ++id )
193  {
194  cands2.push_back( std::make_pair( someDoubleValue2 * id, WPosition( someDoubleValue2 * id, someDoubleValue2, someDoubleValue2 ) ) );
195  }
196  visiTraceAdding.addCandidatesForRay( cands2 );
197  }
198  {
199  std::vector< std::pair< double, WPosition > > cands3;
200  const double someDoubleValue3 = 1.3;
201  for( size_t id = 0; id < numCands3; ++id )
202  {
203  cands3.push_back( std::make_pair( someDoubleValue3 * id, WPosition( someDoubleValue3 * id, someDoubleValue3, someDoubleValue3 ) ) );
204  }
205  visiTraceAdding.addCandidatesForRay( cands3 );
206  }
207 
208  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions.size(), 3 );
209  TS_ASSERT_EQUALS( visiTraceAdding.m_candidateJumps.size(), 3 );
210 
211  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[0].size(), numCands1 );
212  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[1].size(), numCands2 );
213  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[2].size(), numCands3 );
214 
215  TS_ASSERT_EQUALS( visiTraceAdding.m_candidateJumps[0].size(), numCands1 );
216  TS_ASSERT_EQUALS( visiTraceAdding.m_candidateJumps[1].size(), numCands2 );
217  TS_ASSERT_EQUALS( visiTraceAdding.m_candidateJumps[2].size(), numCands3 );
218 
219  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[0][0], WPosition( 0, 1.1, 1.1 ) );
220  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[0][1], WPosition( 1.1, 1.1, 1.1 ) );
221  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[0][10], WPosition( 11, 1.1, 1.1 ) );
222 
223  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[1][0], WPosition( 0, 1.2, 1.2 ) );
224  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[1][1], WPosition( 1.2, 1.2, 1.2 ) );
225  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[1][10], WPosition( 12, 1.2, 1.2 ) );
226 
227  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[2][0], WPosition( 0, 1.3, 1.3 ) );
228  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[2][1], WPosition( 1.3, 1.3, 1.3 ) );
229  TS_ASSERT_EQUALS( visiTraceAdding.m_candidatePositions[2][10], WPosition( 13, 1.3, 1.3 ) );
230  }
231 };
232 
233 #endif // WVISITRACE_TEST_H
This only is a 3d double vector.
Test for WMWriteMesh.
void testGetLineOfInitial()
Ensure that getline does not return anything until something is added.
void setUp()
Setup method called before every test case.
void testAddingPositions()
Does addCandidatesForRay() actually add positions.
void testPerformDijkstraException()
Check throwing of Dijkstra and result according to VisiTrace with constant opacity weights.
void testLinearization()
Check correct order resulting from getLinearizedNodesRefs.
void testInstatiation()
Ensure instantiation does not throw and does initialization right.
void testInverseLinearization()
Check getLinearizedNodesRefs.
Class performing graph computations for VisiTrace algorithm.
Definition: WVisiTrace.h:42
std::vector< std::vector< WPosition > > m_candidatePositions
The candidate positions for all rays.
Definition: WVisiTrace.h:98
std::vector< std::vector< double > > m_candidateJumps
The opacity jumps belonging to the intervals of the candidate positions.
Definition: WVisiTrace.h:99
std::vector< std::vector< int > > getInverseLinearizedNodesRefs() const
Get ids in the vector of getLinearizedNodesRefs from structure of m_candidatePositions.
Definition: WVisiTrace.cpp:89
std::vector< WPosition > getLine()
Get the final 3D line a vector of WPosition.
Definition: WVisiTrace.cpp:48
void addCandidatesForRay(const std::vector< std::pair< double, WPosition > > candidates)
Add candidate positions and corresponding opacity jump values for one viewing ray.
Definition: WVisiTrace.cpp:59
std::vector< std::pair< int, int > > getLinearizedNodesRefs() const
Get an vector with reference ids for all nodes.
Definition: WVisiTrace.cpp:76
std::vector< WPosition > m_curve3D
The 3D curve computed by VisiTrace.
Definition: WVisiTrace.h:100
void performDijkstra()
Create weighted graph and find shortest path from according to VisiTrace.
Definition: WVisiTrace.cpp:105