Skip to content

Commit 7836cd2

Browse files
committed
Compute vector scaling correctly
VTK does clamping and not remapping of input range to desired range which leads to undesirable visual effects.
1 parent 9593283 commit 7836cd2

File tree

1 file changed

+29
-8
lines changed

1 file changed

+29
-8
lines changed

Packages/vcs/vcs/vcsvtk/vectorpipeline.py

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,25 +84,46 @@ def _plotInternal(self):
8484
arrow.SetOutputPointsPrecision(vtk.vtkAlgorithm.DOUBLE_PRECISION)
8585
arrow.FilledOff()
8686

87+
polydata = self._vtkPolyDataFilter.GetOutput()
88+
vectors = polydata.GetPointData().GetVectors()
89+
vectorsRangeX = vectors.GetRange(0)
90+
vectorsRangeY = vectors.GetRange(1)
91+
vectorsRange = []
92+
vectorsRange.insert(0, vectorsRangeY[0] if (vectorsRangeX[0] > vectorsRangeY[0]) else vectorsRangeX[0])
93+
vectorsRange.insert(1, vectorsRangeY[1] if (vectorsRangeX[1] > vectorsRangeY[1]) else vectorsRangeX[1])
94+
95+
scalarArray = vtk.vtkDoubleArray()
96+
scalarArray.SetNumberOfComponents(1)
97+
scalarArray.SetNumberOfValues(vectors.GetNumberOfTuples())
98+
99+
oldRange = vectorsRange[1] - vectorsRange[0]
100+
newRange = 1 - 0.0
101+
102+
for i in range (0, vectors.GetNumberOfTuples()):
103+
norm = vtk.vtkMath.Norm(vectors.GetTuple(i))
104+
newValue = (((norm - vectorsRange[0]) * newRange) / oldRange) + 0.1
105+
scalarArray.SetValue(i, newValue)
106+
107+
polydata.GetPointData().SetScalars(scalarArray)
108+
87109
glyphFilter = vtk.vtkGlyph2D()
88-
glyphFilter.SetInputConnection(self._vtkPolyDataFilter.GetOutputPort())
110+
# glyphFilter.SetInputConnection(self._vtkPolyDataFilter.GetOutputPort())
111+
glyphFilter.SetInputData(polydata)
89112
glyphFilter.SetInputArrayToProcess(1, 0, 0, 0, "vector")
90113
glyphFilter.SetSourceConnection(arrow.GetOutputPort())
91114
glyphFilter.SetVectorModeToUseVector()
92115

93116
# Rotate arrows to match vector data:
94117
glyphFilter.OrientOn()
118+
glyphFilter.ScalingOn()
95119

96120
# Scale to vector magnitude:
97-
glyphFilter.SetScaleModeToScaleByVector()
121+
# NOTE: Currently we compute our own scaling factor since VTK does
122+
# it by clamping the values > max to max and values < min to min
123+
# and not remap the range.
124+
glyphFilter.SetScaleModeToScaleByScalar()
98125
glyphFilter.SetScaleFactor(scale * 2.0 * self._gm.scale)
99126

100-
# These are some unfortunately named methods. It does *not* clamp the
101-
# scale range to [min, max], but rather remaps the range
102-
# [min, max] --> [0, 1].
103-
glyphFilter.ClampingOn()
104-
glyphFilter.SetRange(0.01, 1.0)
105-
106127
mapper = vtk.vtkPolyDataMapper()
107128

108129
glyphFilter.Update()

0 commit comments

Comments
 (0)