forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkConeLayoutStrategy.h
142 lines (118 loc) · 4.58 KB
/
vtkConeLayoutStrategy.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
/*=========================================================================
Program: Visualization Toolkit
Module: vtkConeLayoutStrategy.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
//-------------------------------------------------------------------------
//Copyright 2008 Sandia Corporation.
//Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
//the U.S. Government retains certain rights in this software.
//-------------------------------------------------------------------------
/**
* @class vtkConeLayoutStrategy
* @brief produce a cone-tree layout for a forest
*
* vtkConeLayoutStrategy positions the nodes of a tree(forest) in 3D
* space based on the cone-tree approach first described by
* Robertson, Mackinlay and Card in Proc. CHI'91. This
* implementation incorporates refinements to the layout
* developed by Carriere and Kazman, and by Auber.
*
* The input graph must be a forest (i.e. a set of trees, or a
* single tree); in the case of a forest, the input will be
* converted to a single tree by introducing a new root node,
* and connecting each root in the input forest to the meta-root.
* The tree is then laid out, after which the meta-root is removed.
*
* The cones are positioned so that children lie in planes parallel
* to the X-Y plane, with the axis of cones parallel to Z, and
* with Z coordinate increasing with distance of nodes from the root.
*
* @par Thanks:
* Thanks to David Duke from the University of Leeds for providing this
* implementation.
*/
#ifndef vtkConeLayoutStrategy_h
#define vtkConeLayoutStrategy_h
#include "vtkInfovisLayoutModule.h" // For export macro
#include "vtkGraphLayoutStrategy.h"
class vtkPoints;
class VTKINFOVISLAYOUT_EXPORT vtkConeLayoutStrategy : public vtkGraphLayoutStrategy
{
public:
static vtkConeLayoutStrategy *New();
vtkTypeMacro(vtkConeLayoutStrategy, vtkGraphLayoutStrategy);
void PrintSelf(ostream& os, vtkIndent indent);
//@{
/**
* Determine the compactness, the ratio between the
* average width of a cone in the tree, and the
* height of the cone. The default setting is 0.75
* which (empirically) seems reasonable, but this
* will need adapting depending on the data.
*/
vtkSetMacro(Compactness, float);
vtkGetMacro(Compactness, float);
//@}
//@{
/**
* Determine if layout should be compressed, i.e. the
* layout puts children closer together, possibly allowing
* sub-trees to overlap. This is useful if the tree is
* actually the spanning tree of a graph. For "real" trees,
* non-compressed layout is best, and is the default.
*/
vtkSetMacro(Compression, int);
vtkGetMacro(Compression, int);
vtkBooleanMacro(Compression, int);
//@}
//@{
/**
* Set the spacing parameter that affects space between
* layers of the tree. If compression is on, Spacing is the
* actual distance between layers. If compression is off,
* actual distance also includes a factor of the compactness
* and maximum cone radius.
*/
vtkSetMacro(Spacing, float);
vtkGetMacro(Spacing, float);
//@}
/**
* Perform the layout.
*/
void Layout();
protected:
vtkConeLayoutStrategy();
~vtkConeLayoutStrategy();
/**
* Helper operations for tree layout. Layout is performed
* in two traversals of the tree. The first traversal finds
* the position of child nodes relative to their parent. The
* second traversal positions each node absolutely, working
* from the initial position of the root node.
*/
double LocalPlacement(vtkIdType root, vtkPoints *points);
void GlobalPlacement(
vtkIdType root,
vtkPoints *points,
double refX, // absolute x-y coordinate of
double refY, // parent node; z coordinate
double level ); // derived from level.
float Compactness; // factor used in mapping layer to Z
int Compression; // force a compact layout?
float Spacing; // Scale vertical spacing of cones.
// Values accumulated for possible statistical use
double MinRadius;
double MaxRadius;
int NrCones;
double SumOfRadii;
private:
vtkConeLayoutStrategy(const vtkConeLayoutStrategy&) VTK_DELETE_FUNCTION;
void operator=(const vtkConeLayoutStrategy&) VTK_DELETE_FUNCTION;
};
#endif