8 #ifndef vtkBlockSortHelper_h
9 #define vtkBlockSortHelper_h
23 VTK_ABI_NAMESPACE_BEGIN
56 double camWorldPos[4];
60 double camWorldFocalPoint[4];
62 camWorldFocalPoint[3] = 1.0;
66 InverseVolumeMatrix->
DeepCopy(volMatrix);
67 InverseVolumeMatrix->
Invert();
69 InverseVolumeMatrix->
MultiplyPoint(camWorldFocalPoint, camWorldFocalPoint);
71 this->CameraPosition =
vtkVector3d(camWorldPos[0], camWorldPos[1], camWorldPos[2]);
72 this->CameraPosition = this->CameraPosition /
vtkVector3d(camWorldPos[3]);
74 vtkVector3d camFP(camWorldFocalPoint[0], camWorldFocalPoint[1], camWorldFocalPoint[2]);
94 template <
typename TT>
97 double abounds[6], bbounds[6];
98 vtkBlockSortHelper::GetBounds<TT>(first, abounds);
99 vtkBlockSortHelper::GetBounds<TT>(second, bbounds);
110 for (
int i = 0; i < 6; ++i)
112 int low = 2 * (i / 2);
113 bboundsP[i] = bbounds[i];
114 if (bboundsP[i] < abounds[low])
116 bboundsP[i] = abounds[low];
118 if (bboundsP[i] > abounds[low + 1])
120 bboundsP[i] = abounds[low + 1];
122 aboundsP[i] = abounds[i];
123 if (aboundsP[i] < bbounds[low])
125 aboundsP[i] = bbounds[low];
127 if (aboundsP[i] > bbounds[low + 1])
129 aboundsP[i] = bbounds[low + 1];
137 for (
int i = 0; i < 6; i += 2)
139 if (aboundsP[i] != aboundsP[i + 1])
141 dimSize[dims] = aboundsP[i + 1] - aboundsP[i];
146 degenAxes[degenDims] = i / 2;
156 if (dimSize[0] < dimSize[1])
158 if (dimSize[0] < dimSize[2])
169 if (dimSize[1] < dimSize[2])
183 double atobdir[3] = { bbounds[0] + bbounds[1] - abounds[0] - abounds[1],
184 bbounds[2] + bbounds[3] - abounds[2] - abounds[3],
185 bbounds[4] + bbounds[5] - abounds[4] - abounds[5] };
189 if (fabs(aboundsP[degenAxes[0] * 2] - bboundsP[degenAxes[0] * 2]) > 0.01 * atoblength)
196 if (this->CameraIsParallel)
203 vtkVector3d planePoint(0.25 * (aboundsP[0] + aboundsP[1] + bboundsP[0] + bboundsP[1]),
204 0.25 * (aboundsP[2] + aboundsP[3] + bboundsP[2] + bboundsP[3]),
205 0.25 * (aboundsP[4] + aboundsP[5] + bboundsP[4] + bboundsP[5]));
213 double plane[3] = { 0, 0, 0 };
214 plane[degenAxes[0]] = 1.0;
216 double dot =
dir[0] * plane[0] +
dir[1] * plane[1] +
dir[2] * plane[2];
222 double side = plane[0] * atobdir[0] + plane[1] * atobdir[1] + plane[2] * atobdir[2];
223 return (dot *
side < 0 ? 1 : -1);
231 template <
class RandomIt>
236 bool Visited =
false;
237 std::vector<gnode<RandomIt>*> Closer;
240 template <
class RandomIt>
241 bool operator==(gnode<RandomIt>
const& lhs, gnode<RandomIt>
const& rhs)
243 return lhs.Value == rhs.Value && lhs.Closer == rhs.Closer;
246 template <
class RandomIt>
247 bool findCycle(gnode<RandomIt>& start,
std::vector<gnode<RandomIt>>& graph,
256 active.push_back(start);
259 for (
auto& close : start.Closer)
267 for (
auto ait = active.begin(); ait != active.end(); ++ait)
269 if (ait->Value == close->Value)
271 loop.push_back(*ait);
276 if (findCycle(*close, graph, active,
loop))
279 loop.push_back(*close);
284 active.erase(std::find(active.begin(), active.end(), start));
285 start.Visited =
true;
290 template <
class RandomIt,
typename T>
297 std::vector<typename RandomIt::value_type> working;
298 std::vector<typename RandomIt::value_type> result;
299 working.assign(bitr, eitr);
300 size_t numNodes = working.size();
304 for (
auto it = working.begin(); it != working.end(); ++it)
308 for (; it2 != working.end(); ++it2)
312 if (comp1 * comp2 > 0)
321 std::vector<gnode<RandomIt>> graph;
322 for (
auto it = working.begin(); it != working.end(); ++it)
324 gnode<RandomIt> anode;
326 graph.push_back(anode);
328 for (
auto& git : graph)
330 for (
auto&
next : graph)
334 git.Closer.push_back(&
next);
340 std::vector<gnode<RandomIt>> active;
341 std::vector<gnode<RandomIt>>
loop;
342 for (
auto& gval : graph)
345 if (findCycle(gval, graph, active,
loop))
349 vtkGenericWarningMacro(
"found a loop cam dir: " <<
dir[0] <<
" " <<
dir[1] <<
" " <<
dir[2]);
350 for (
auto& lval :
loop)
354 vtkGenericWarningMacro(<< bnds[0] <<
" " << bnds[1] <<
" " << bnds[2] <<
" " << bnds[3]
355 <<
" " << bnds[4] <<
" " << bnds[5]);
362 for (
auto it = working.begin(); it != working.end();)
364 auto it2 = working.begin();
365 for (; it2 != working.end(); ++it2)
375 if (it2 == working.end())
378 result.push_back(*it);
380 it = working.begin();
388 if (result.size() != numNodes)
390 vtkGenericWarningMacro(
"sorting failed");
394 std::reverse_copy(result.begin(), result.end(), start);
396 VTK_ABI_NAMESPACE_END
a virtual camera for 3D rendering
virtual double * GetFocalPoint()
Set/Get the focal of the camera in world coordinates.
virtual double * GetPosition()
Set/Get the position of the camera in world coordinates.
virtual vtkTypeBool GetParallelProjection()
Set/Get the value of the ParallelProjection instance variable.
abstract class to specify dataset behavior
double * GetBounds()
Return a pointer to the geometry bounding box in the form (xmin,xmax, ymin,ymax, zmin,...
static float Normalize(float v[3])
Normalize (in place) a 3-vector.
represent and manipulate 4x4 transformation matrices
void DeepCopy(const vtkMatrix4x4 *source)
Set the elements of the matrix to the same values as the elements of the given source matrix.
void MultiplyPoint(const float in[4], float out[4])
Multiply a homogeneous coordinate by this matrix, i.e.
static void Invert(const vtkMatrix4x4 *in, vtkMatrix4x4 *out)
Matrix Inversion (adapted from Richard Carling in "Graphics Gems," Academic Press,...
abstract specification for renderers
vtkCamera * GetActiveCamera()
Get the current camera.
double Normalize()
Normalize the vector in place.
Collection of comparison functions for std::sort.
void Sort(RandomIt bitr, RandomIt eitr, BackToFront< T > &me)
void GetBounds(T a, double bds[6])
operator() for back-to-front sorting.
int CompareOrderWithUncertainty(TT &first, TT &second)
int CompareBoundsOrderWithUncertainty(const double abounds[6], const double bbounds[6])
BackToFront(vtkRenderer *ren, vtkMatrix4x4 *volMatrix)
BackToFront(const vtkVector3d &camPos, const vtkVector3d &viewdirection, bool is_parallel)
vtkVector3d CameraPosition
vtkVector3d CameraViewDirection
bool VTKCOMMONCORE_EXPORT operator==(const std::string &a, const vtkStringToken &b)