<html>
<head>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 10 (filtered)">
<style>
<!--
/* Font Definitions */
@font-face
{font-family:Tahoma;
panose-1:2 11 6 4 3 5 4 4 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
margin-bottom:.0001pt;
font-size:12.0pt;
font-family:"Times New Roman";}
a:link, span.MsoHyperlink
{color:blue;
text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
{color:blue;
text-decoration:underline;}
span.EmailStyle17
{font-family:Arial;
color:navy;}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style>
</head>
<body lang=EN-US link=blue vlink=blue>
<div class=Section1>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Hi Will,</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>For geometric scales, I have made changes to</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> vtkWarpScalar</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> vtkWarpVector</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> vtkGlyph3D</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> vtkTensorGlyph</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>For vtkMapper, I have a programmable vtkMergeDataObjectFilter
which sets the range of the lookup table used by the mapper each time the
filter executes. A new method, say, vtkMapper::AutoRangeOn() which mapped the
input to [0,1] would presumably remove the need for the LUT range update
(provided UseLookupTableScalarRangeOff()).</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>On the implementation side, maybe you
could consider some transform switches for vtkDataArray like NormalizeOn()/Off(),
ClampOn()/Off() which could be used by GetTuple(), GetComponent(), GetValue()
to transform the data on the fly. The original scalars do need to be preserved so
they can be used for, say, labeling.</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>Thanks for your interest.</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'>John.</span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal><font size=2 color=navy face=Arial><span style='font-size:
10.0pt;font-family:Arial;color:navy'> </span></font></p>
<p class=MsoNormal style='margin-left:36.0pt'><font size=2 face=Tahoma><span
style='font-size:10.0pt;font-family:Tahoma'>-----Original Message-----<br>
<b><span style='font-weight:bold'>From:</span></b> Will Schroeder
[mailto:will.schroeder@kitware.com] <br>
<b><span style='font-weight:bold'>Sent:</span></b> 18 May 2005 11:38<br>
<b><span style='font-weight:bold'>To:</span></b> John Platt;
vtk-developers@vtk.org<br>
<b><span style='font-weight:bold'>Subject:</span></b> Re: [vtk-developers]
vtkGlyph3D & range clamping</span></font></p>
<p class=MsoNormal style='margin-left:36.0pt'><font size=3
face="Times New Roman"><span style='font-size:12.0pt'> </span></font></p>
<p class=MsoNormal style='margin-left:36.0pt'><font size=3
face="Times New Roman"><span style='font-size:12.0pt'>John-<br>
<br>
I apologize if I've missed something here: for which classes are you proposing
these changes? vtkGlyph3D, vtkWarpScalar, and ?? How many classes are involved?
Your ideas have merit but I'm wondering if it should be done class-by-class or
somehow encapsulated in a helper class...<br>
<br>
Will<br>
<br>
At 06:20 PM 5/11/2005, John Platt wrote:<br>
<br>
</span></font></p>
<p class=MsoNormal style='margin-left:36.0pt'><font size=2 face=Arial><span
style='font-size:10.0pt;font-family:Arial'>Hi,<br>
<br>
Maybe I’ve missed something but I seem to spend a lot of time modifying
filters to normalise the input data at the time of execution. Here’s an example
of bodging the scale factor so the warp is always shown a fixed size.<br>
<br>
void vtkWarpScalarEx::Execute()<br>
{<br>
vtkDataArray* inScalars =
this->GetInput()->GetPointData()->GetScalars(
this->InputScalarsSelection );<br>
double scaleFactor = this->ScaleFactor;<br>
if ( inScalars )<br>
{<br>
double maxNorm = inScalars->GetMaxNorm();<br>
if ( maxNorm > 0.0 )<br>
this->SetScaleFactor(
scaleFactor/maxNorm );<br>
}<br>
vtkWarpScalar::Execute();<br>
this->SetScaleFactor( scaleFactor );<br>
}<br>
<br>
Mapping attribute data to the range to [0,1] doesn’t always solve the
problem either, particularly when computing a scale factor for sizing glyphs.
For example, suppose there are sphere glyphs representing masses M1 < M2 and
M2 is to be displayed a fixed size. Normalising scalars (say) to [0, 1] will
leave M1 zero size. Provision for this kind of functionality requires
independent access to the attribute data limits. Here is a solution for the
mass problem using UpperClampToMaxNormOn().<br>
<br>
vtkGlyph3D.h<br>
==========<br>
<br>
Replace <br>
<br>
// Description:<br>
// Specify range to map scalar values into.<br>
vtkSetVector2Macro(Range,double);<br>
vtkGetVectorMacro(Range,double,2);<br>
<br>
By<br>
<br>
// Description:<br>
// Specify the range for clamping the scalar values (or vector magnitude
if<br>
// ScaleByVector() is enabled). Scalars outside this range are set to
the<br>
// end points and then normalised to [0-1]. Glyphs for points with
scalars<br>
// less than or equal to Range[0] with therefore not be visible. This
range is<br>
// only used with ClampingOn()<br>
vtkSetVector2Macro(Range,double);<br>
vtkGetVectorMacro(Range,double,2);<br>
<br>
vtkSetMacro(LowerClampToMinNorm,int);<br>
vtkBooleanMacro(LowerClampToMinNorm,int);<br>
vtkGetMacro(LowerClampToMinNorm,int);<br>
<br>
vtkSetMacro(UpperClampToMaxNorm,int);<br>
vtkBooleanMacro(UpperClampToMaxNorm,int);<br>
vtkGetMacro(UpperClampToMaxNorm,int);<br>
<br>
Insert<br>
<br>
int LowerClampToMinNorm; // Use the min norm of the attribute data as
the lower clamp<br>
int UpperClampToMaxNorm; // Use the max norm of the attribute data as
the upper clamp<br>
<br>
<br>
vtkGlyph3D.cxx (Revision: 1.112)<br>
========================<br>
<br>
vtkGlyph3D::vtkGlyph3D()<br>
<br>
Insert<br>
<br>
this->LowerClampToMinNorm = 0;<br>
this->UpperClampToMaxNorm = 0;<br>
<br>
vtkGlyph3D::Execute()<br>
<br>
Remove<br>
<br>
// Check input for consistency<br>
//<br>
if ( (den = this->Range[1] - this->Range[0]) == 0.0 )<br>
{<br>
den = 1.0;<br>
}<br>
<br>
After <br>
<br>
else<br>
{<br>
haveVectors = 0;<br>
}<br>
<br>
Insert<br>
<br>
// Set the range for clamping the data scale factors.<br>
if ( this->Clamping && ( this->LowerClampToMinNorm ||
this->UpperClampToMaxNorm ) )<br>
{<br>
double* inRange = NULL;<br>
if ( inScalars && this->ScaleMode ==
VTK_SCALE_BY_SCALAR )<br>
{<br>
inRange = inScalars->GetRange();<br>
}<br>
else if ( haveVectors )<br>
{<br>
if ( this->VectorMode == VTK_USE_NORMAL )<br>
{<br>
inRange = inNormals->GetRange( -1
);<br>
}<br>
else<br>
{<br>
inRange = inVectors->GetRange( -1
);<br>
}<br>
}<br>
if ( inRange && LowerClampToMinNorm )
this->Range[0] = inRange[0];<br>
if ( inRange && UpperClampToMaxNorm )
this->Range[1] = inRange[1];<br>
}<br>
<br>
if ( (den = this->Range[1] - this->Range[0]) == 0.0 ) den = 1.0;<br>
<br>
<br>
vtkGlyph3D::PrintSelf()<br>
<br>
Replace <br>
<br>
os << indent << "Range: (" <<
this->Range[0] << ", " << this->Range[1] <<
")\n";<br>
<br>
By<br>
<br>
os << indent << "Range: (";<br>
this->LowerClampToMinNorm ? os << "Min
norm," : os << this->Range[0] << ",";<br>
this->UpperClampToMaxNorm ? os << "Max norm)\n" : os
<< this->Range[1] << ")\n";<br>
<br>
If this kind of functionality is useful I will add it to bug tracker as a feature
request.<br>
<br>
Where the clamping and normalisation are not combined, it would be useful to
have methods like<br>
<br>
ScaleByMinNorm()/ScaleByMaxNorm()<br>
SetLowerClamp( lower )/SetUpperClamp( upper )<br>
MapToRange(
lower, upper )<br>
<br>
Using MapToRange( 0, 1 ) on vtkMapper would allow scalars of any range to be
colour mapped red through blue without having to call SetRange() with actual
attribute values. This would go some way to lessening the assumption that the
data range is known in advance.<br>
<br>
Thanks for your consideration.<br>
<br>
John Platt.<br>
<br>
</span></font>_______________________________________________<br>
vtk-developers mailing list<br>
vtk-developers@vtk.org<br>
<a href="http://www.vtk.org/mailman/listinfo/vtk-developers" eudora=autourl>http://www.vtk.org/mailman/listinfo/vtk-developers</a></p>
</div>
</body>
</html>