1 /*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: TestSortFieldData.cxx
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14 =========================================================================*/
15 #include "vtkSortFieldData.h"
16 #include "vtkIntArray.h"
17 #include "vtkStringArray.h"
18 #include "vtkDoubleArray.h"
19 #include "vtkVariantArray.h"
20 #include "vtkFieldData.h"
21 #include "vtkMath.h"
22
23 #include <sstream> // to_string chokes some compilers
24 #include <locale> // C++ locale
25
26 // A simple test sorts on one of the components of a 3-tuple array, and then
27 // orders all of the arrays based on the sort indices.
TestSortFieldData(int,char * [])28 int TestSortFieldData(int, char*[])
29 {
30 // Create the arrays
31 vtkIntArray *iArray = vtkIntArray::New();
32 iArray->SetName("Int Array");
33 iArray->SetNumberOfComponents(3);
34 iArray->SetNumberOfTuples(10);
35
36 vtkStringArray *sArray = vtkStringArray::New();
37 sArray->SetName("String Array");
38 sArray->SetNumberOfComponents(1);
39 sArray->SetNumberOfTuples(10);
40
41 vtkDoubleArray *dArray = vtkDoubleArray::New();
42 dArray->SetName("Double Array");
43 dArray->SetNumberOfComponents(2);
44 dArray->SetNumberOfTuples(10);
45
46 vtkVariantArray *vArray = vtkVariantArray::New();
47 vArray->SetName("Variant Array");
48 vArray->SetNumberOfComponents(1);
49 vArray->SetNumberOfTuples(10);
50
51 // Populate the arrays. Mostly random numbers with a some values
52 // set to compare against expected output.
53 std::ostringstream ostr;
54 ostr.imbue(std::locale::classic());
55 int permute[] = {3,0,9,6,7,4,5,8,2,1};
56 for (int i=0; i < 10; ++i)
57 {
58 iArray->SetComponent(i,0, i);
59 iArray->SetComponent(permute[i],1, i);
60 iArray->SetComponent(i,2, static_cast<int>(vtkMath::Random(0,100)));
61 ostr.str(""); //clear it out
62 ostr << i;
63 sArray->SetValue(permute[i], ostr.str());
64 dArray->SetComponent(i,0, static_cast<double>(vtkMath::Random(-1,1)));
65 dArray->SetComponent(permute[i],1, static_cast<double>(i));
66 vArray->SetValue(permute[i],vtkVariant(ostr.str()));
67 }
68
69 // Create the field data
70 vtkFieldData *fd = vtkFieldData::New();
71 fd->AddArray(iArray);
72 fd->AddArray(dArray);
73 fd->AddArray(vArray);
74 fd->AddArray(sArray);
75
76 // Sort the data
77 vtkIdType *idx = vtkSortFieldData::Sort(fd,"Int Array",1,1,0);
78
79 // Now test the result
80 cout << "Ordering:\n\t( ";
81 for (int i=0; i<10; ++i)
82 {
83 cout << idx[i] << " ";
84 if (idx[i] != permute[i])
85 {
86 cout << "Bad sort order!\n";
87 delete [] idx;
88 return 1;
89 }
90 }
91 delete [] idx;
92 cout << ")";
93
94 cout << "\n\nInteger Array (sorted by component==1):\n";
95 for (int i=0; i<10; ++i)
96 {
97 cout << "\t(" << iArray->GetComponent(i,0) << ","
98 << iArray->GetComponent(i,1) << ","
99 << iArray->GetComponent(i,2) << ")\n";
100 if (iArray->GetComponent(i,1) != i )
101 {
102 cout << "Bad sort order!\n";
103 return 1;
104 }
105 }
106
107 cout << "\nDouble Array:\n";
108 for (int i=0; i<10; ++i)
109 {
110 cout << "\t(" << dArray->GetComponent(i,0) << ","
111 << dArray->GetComponent(i,1) << ")\n";
112 if (dArray->GetComponent(i,1) != i )
113 {
114 cout << "Bad sort order!\n";
115 return 1;
116 }
117 }
118
119 cout << "\nString Array:\n\t( ";
120 for (int i=0; i<10; ++i)
121 {
122 cout << sArray->GetValue(i) << " ";
123 ostr.str(""); //clear it out
124 ostr << i;
125 if (sArray->GetValue(i) != ostr.str())
126 {
127 cout << "Bad sort order!\n";
128 return 1;
129 }
130 }
131 cout << ")\n";
132
133 cout << "\nVariant Array:\n\t( ";
134 for (int i=0; i<10; ++i)
135 {
136 cout << vArray->GetValue(i).ToString() << " ";
137 ostr.str(""); //clear it out
138 ostr << i;
139 if (vArray->GetValue(i).ToString() != ostr.str() )
140 {
141 cout << "Bad sort order!\n";
142 return 1;
143 }
144 }
145 cout << ")\n";
146
147 // Clean up
148 iArray->Delete();
149 sArray->Delete();
150 dArray->Delete();
151 vArray->Delete();
152 fd->Delete();
153
154 return 0;
155 }
156