<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Cory,<br>
<br>
I can confirm a call to vtkDataArrayRoundIfNecessary fixes the
issue. I will prepare and submit a patch.<br>
<br>
Thank you,<br>
Bengt<br>
<br>
<div class="moz-cite-prefix"><br>
</div>
<blockquote
cite="mid:CAB5Fpx6qqsSAVQTNM=jvgh28es=ntVAEyXTOAkNA94j4+yg=hw@mail.gmail.com"
type="cite">
<div dir="ltr">
<div>Bengt,</div>
<div><br>
</div>
That's what it looks like to me. Could you try to add a call to <span
style="font-size:12.8000001907349px">vtkDataArrayRoundIfNecessary there
and report back if it solves your problem? If so, would you be
interested in contributing a patch to VTK? Developer
instructions are available here:</span>
<div><span style="font-size:12.8000001907349px"><br>
</span></div>
<div><span style="font-size:12.8000001907349px"><a
moz-do-not-send="true"
href="https://gitlab.kitware.com/vtk/vtk/blob/master/CONTRIBUTING.md"><a class="moz-txt-link-freetext" href="https://gitlab.kitware.com/vtk/vtk/blob/master/CONTRIBUTING.md">https://gitlab.kitware.com/vtk/vtk/blob/master/CONTRIBUTING.md</a></a></span><br>
</div>
<div><span style="font-size:12.8000001907349px"><br>
</span></div>
<div><span style="font-size:12.8000001907349px">Feel free to add
me as a reviewer: @cory-quammen is my username.</span></div>
<div><span style="font-size:12.8000001907349px"><br>
</span></div>
<div><span style="font-size:12.8000001907349px">Thanks,</span></div>
<div><span style="font-size:12.8000001907349px">Cory</span></div>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On Thu, Jul 23, 2015 at 1:01 PM, Bengt
Rosenberger <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:bengt@ctech.com" target="_blank">bengt@ctech.com</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF"> Small correction:
vtkDataArrayInterpolateTuple is either called from
vtkDataArray, ln 496 or ln 515. I can't exactly tell
because I'm unable to step through that macro. However, I
could see that vtkDataArrayInterpolateTuple, ln 103 was
called.<br>
<br>
Is there just a vtkDataArrayRoundIfNecessary missing?<br>
<br>
Bye,<br>
Bengt<span class=""><br>
<br>
<div>Am 23.07.2015 um 18:50 schrieb Bengt Rosenberger:<br>
</div>
</span>
<blockquote type="cite"><span class=""> Hi Cory,<br>
<br>
thanks for the reply.<br>
<br>
When you run the provided code with the provided data,
the interpolation for the int data ultimately happens
in vtkDataArray::InterpolateEdge, ln 520, which in
turn calls vtkDataArrayInterpolateTuple, ln 103. This
one performs a multiplication with double and then
casts back to the type Scalar, it does not round the
final interpolant. The overload above it does tho, but
it's not called.<br>
<br>
Hope that helps,<br>
Bengt<br>
<br>
<div>Am 23.07.2015 um 15:30 schrieb Cory Quammen:<br>
</div>
</span>
<blockquote type="cite"><span class="">
<div dir="ltr">Bengt,
<div><br>
</div>
<div>From what I can tell looking at the
interpolating code in vtkDataArray.cxx, it looks
like integer types should be rounded, and it
looks like this support has been in VTK for a
long time. Can you point out where in VTK you
are seeing the casting back to integer type
instead of rounding? You may have discovered a
bug.</div>
<div><br>
</div>
<div>Thanks,</div>
<div>Cory</div>
</div>
</span>
<div>
<div class="h5">
<div class="gmail_extra"><br>
<div class="gmail_quote">On Wed, Jul 22, 2015 at
6:05 PM, Bengt Rosenberger <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:bengt@ctech.com"
target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:bengt@ctech.com">bengt@ctech.com</a></a>></span>
wrote:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">Hello everyone!<br>
<br>
Sorry if this may appear twice on the
mailing list, the first time I've submitted
this the attachment prevented this to show
up. This time I'll provide a link to my
DropBox for the data.<br>
<br>
Anyway, we encountered an issue with
vtkContourFilter. Specifically, we have an
unstructured grid containing the data to
contour with and an additional vtkIntArray.
The data in the int array is supposed to be
of all the same value, in this case 3.
However, after running the field through the
contour filter, the int data contains values
of 2 as well.<br>
<br>
After digging deeper into the VTK code, we
discovered that the data for the int array
is cast to double, interpolated and then
cast back to int.<br>
<br>
So my question is:<br>
Why aren't the data values being rounded
after interpolation, but instead just cast
back to int? Is there a way to enable
rounding or copying for only a single array
in the grid?<br>
<br>
Thank you!<br>
<br>
Here's the data: <a moz-do-not-send="true"
href="https://dl.dropboxusercontent.com/u/16837761/test1.7z"
rel="noreferrer" target="_blank">https://dl.dropboxusercontent.com/u/16837761/test1.7z</a><br>
And here's the code we used for testing:<br>
<br>
#include <cstdint><br>
#include <vtkSmartPointer.h><br>
#include <vtkUnstructuredGrid.h><br>
#include <vtkCellArray.h><br>
#include <vtkContourFilter.h><br>
#include <vtkPointData.h><br>
#include
<vtkXMLUnstructuredGridReader.h><br>
<br>
// Checks whether the geo_layer values are
all constant<br>
void check_geo_layer(vtkDataSet* ds)<br>
{<br>
if (ds->GetNumberOfCells() == 0)<br>
{<br>
assert(false);<br>
}<br>
<br>
vtkDataArray* geoLayerData =
ds->GetPointData()->GetArray("Geo_Layer");<br>
<br>
double geoLayer =
geoLayerData->GetComponent(ds->GetCell(0)->GetPointId(0),
0);<br>
for (uint32_t i = 0; i <
ds->GetNumberOfCells(); ++i)<br>
{<br>
vtkCell* c = ds->GetCell(i);<br>
for (uint32_t j = 0; j <
c->GetNumberOfPoints(); ++j)<br>
{<br>
double gl =
geoLayerData->GetComponent(c->GetPointId(j),
0);<br>
if (gl != geoLayer)<br>
{<br>
assert(false);<br>
}<br>
}<br>
}<br>
}<br>
<br>
template <class T><br>
void
check_geo_layer(vtkSmartPointer<T>
vtkFilter)<br>
{<br>
vtkFilter->Update();<br>
auto result = vtkFilter->GetOutput();<br>
vtkDataSet* ds =
vtkDataSet::SafeDownCast(result);<br>
<br>
check_geo_layer(ds);<br>
}<br>
<br>
int _tmain(int argc, _TCHAR* argv[])<br>
{<br>
// Read the test field<br>
// Field has one vtkDoubleArray
("TOTHC") and one vtkIntArray ("Geo_Layer")<br>
vtkSmartPointer<vtkXMLUnstructuredGridReader>
reader =
vtkSmartPointer<vtkXMLUnstructuredGridReader>::New();<br>
reader->SetFileName("C:\\test1.vtk");<br>
reader->Update();<br>
vtkDataSet* g1 =
reader->GetOutputAsDataSet();<br>
<br>
// Values in Geo_Layer are supposed to
be all 3's. Check that now for the input.<br>
check_geo_layer(g1);<br>
<br>
const double isoValue =
0.98712348937988281;<br>
<br>
vtkSmartPointer<vtkContourFilter>
contour = vtkContourFilter::New();<br>
contour->SetInputData(g1);<br>
contour->ReleaseDataFlagOn();<br>
contour->GenerateTrianglesOn();<br>
contour->ComputeGradientsOff();<br>
contour->ComputeNormalsOff();<br>
contour->ComputeScalarsOff();<br>
contour->SetNumberOfContours(1);<br>
contour->SetValue(0, isoValue);<br>
contour->SetInputArrayToProcess(0, 0,
0, vtkDataObject::FIELD_ASSOCIATION_POINTS,
"TOTHC");<br>
<br>
// Check again whether values in
Geo_Layer are only 3's.<br>
// PROBLEM: They are not. There are 2's
in there as well, which occur from
interpolating integers and not rounding in
the end.<br>
// You can see the problem if
you convert Geo_Layer to a vtkDoubleArray,
in which case values of 2.9999999998 may
appear after contouring.<br>
check_geo_layer(contour);<br>
<br>
std::cin.ignore();<br>
}<br>
_______________________________________________<br>
Powered by <a moz-do-not-send="true"
href="http://www.kitware.com"
rel="noreferrer" target="_blank">www.kitware.com</a><br>
<br>
Visit other Kitware open-source projects at
<a moz-do-not-send="true"
href="http://www.kitware.com/opensource/opensource.html"
target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
<br>
Please keep messages on-topic and check the
VTK FAQ at: <a moz-do-not-send="true"
href="http://www.vtk.org/Wiki/VTK_FAQ"
target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>
<br>
Search the list archives at: <a
moz-do-not-send="true"
href="http://markmail.org/search/?q=vtkusers"
rel="noreferrer" target="_blank"><a class="moz-txt-link-freetext" href="http://markmail.org/search/?q=vtkusers">http://markmail.org/search/?q=vtkusers</a></a><br>
<br>
Follow this link to subscribe/unsubscribe:<br>
<a moz-do-not-send="true"
href="http://public.kitware.com/mailman/listinfo/vtkusers"
rel="noreferrer" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a><br>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div>Cory Quammen<br>
R&D Engineer<br>
Kitware, Inc.</div>
</div>
</div>
</div>
</blockquote>
<div>
<div class="h5"> <br>
<br>
<fieldset></fieldset>
<br>
<pre>_______________________________________________
Powered by <a moz-do-not-send="true" href="http://www.kitware.com" target="_blank">www.kitware.com</a>
Visit other Kitware open-source projects at <a moz-do-not-send="true" href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a>
Please keep messages on-topic and check the VTK FAQ at: <a moz-do-not-send="true" href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a>
Search the list archives at: <a moz-do-not-send="true" href="http://markmail.org/search/?q=vtkusers" target="_blank">http://markmail.org/search/?q=vtkusers</a>
Follow this link to subscribe/unsubscribe:
<a moz-do-not-send="true" href="http://public.kitware.com/mailman/listinfo/vtkusers" target="_blank">http://public.kitware.com/mailman/listinfo/vtkusers</a>
</pre>
</div>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
<br>
<br clear="all">
<div><br>
</div>
-- <br>
<div class="gmail_signature">Cory Quammen<br>
R&D Engineer<br>
Kitware, Inc.</div>
</div>
</blockquote>
<br>
</body>
</html>