<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Dear Cory,<div class=""><br class=""></div><div class="">Thank you so much for your explanation! My problem is solved!</div><div class=""><br class=""></div><div class="">One more thing is the array order in the conversion from numpy array to vtkArray, which should change to [2, 0, 1] instead of [2, 1, 0]. It guarantees the rendering result will not be up-side-down or with other disordered results.</div><div class=""><br class=""></div><div class=""><font face="Courier New" class="">```Python</font></div><div class=""><div class=""><font face="Courier New" class="">vtk_array = numpy_support.numpy_to_vtk(</font></div><div class=""><font face="Courier New" class="">    num_array=quadric_2.transpose(2, 0, 1).ravel(),  # was (2, 1, 0)</font></div><div class=""><font face="Courier New" class="">    deep=True,</font></div><div class=""><font face="Courier New" class="">    array_type=vtk.VTK_FLOAT)</font></div></div><div class=""><font face="Courier New" class="">```</font></div><div class=""><br class=""></div><div class="">It confused me actually that numpy has opposite array order against VTK, but here it seems not. What happened?</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Quentan</div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 21 Jul 2015, at 04:07, Cory Quammen <<a href="mailto:cory.quammen@kitware.com" class="">cory.quammen@kitware.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Quentan,<div class=""><br class=""></div><div class="">Thank you for posting the excellent code sample. With it, I could see what the problem was right away.</div><div class=""><br class=""></div><div class="">The problem is that vtkImageData has the notion of an origin, and you are not setting it. By default, vtkImageData have a corner at (0, 0, 0), but your function in numpy starts at (-1, -1, -1). By not setting the origin to (-1, -1, -1), you are accidentally shifting your data. You'll need to set the origin in your vtk_image_data via</div><div class=""><br class=""></div><div class="">vtk_image_data.SetOrigin(-1, -1, -1)</div><div class=""><br class=""></div><div class="">You'll also need to figure out your vtk_image_data's spacing. For the x-component, this can be computed with</div><div class=""><br class=""></div><div class="">(x_max - x_min) / (x_dim - 1)</div><div class=""><br class=""></div><div class="">where x_{max, min} are the maximum and minimum x coordinate and x_dim is the number of voxels in the x direction.</div><div class=""><br class=""></div><div class="">I hope that helps,</div><div class="">Cory</div><div class=""><br class=""></div><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Sun, Jul 19, 2015 at 1:40 PM, Quentan Qi <span dir="ltr" class=""><<a href="mailto:quentan@gmail.com" target="_blank" class="">quentan@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">Dear Cory,<div class=""><br class=""></div><div class="">I may fail to explain my problem, so I made <a href="https://github.com/quentan/Test_ImageData" target="_blank" class="">an example</a> to show what I want to express, as you suggested. <a href="https://github.com/quentan/Test_ImageData" target="_blank" class="">https://github.com/quentan/Test_ImageData</a></div><div class=""><br class=""></div><div class="">This example generates a quadric with its implicit form: <font face="Courier New" class="">F(x,y,z) = a0*x^2 + a1*y^2 + a2*z^2 + a3*x*y + a4*y*z + a5*x*z + a6*x + a7*y + a8*z + a9</font> </div><div class=""><br class=""></div><div class="">The left viewport renders the quadric with vtkQuadric, which works perfectly.</div><div class=""><br class=""></div><div class="">The right viewport renders the same quadric with a meshgrid generated with numpy. The meshgrid is converted to vtkFloatArray then to vtkImageData. Its shape is right, but locates at wrong position, which seems like it was scaled to some positive values. </div><div class=""><br class=""></div><div class="">Note the small perpendicular coordinate lines in the corner.</div><div class=""><br class=""></div><div class="">I guess the issue raises around line 120 - 123. If any other wrongs happen, point it for me, please.</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Quentan</div><div class=""><br class=""></div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class=""><div class="h5"><div class="">On 18 Jul 2015, at 15:09, Cory Quammen <<a href="mailto:cory.quammen@kitware.com" target="_blank" class="">cory.quammen@kitware.com</a>> wrote:</div><br class=""></div></div><div class=""><div class=""><div class="h5"><div dir="ltr" class="">Quentan,<div class=""><br class=""></div><div class="">vtkImageData is in fact a subclass of vtkDataSet, so no conversion is needed. You said, "<span style="font-size:12.8000001907349px" class="">vtkImageData scales all points to positive integer values", but this should not be the case. Something strange is going on.</span></div><div class=""><span style="font-size:12.8000001907349px" class=""><br class=""></span></div><div class=""><span style="font-size:12.8000001907349px" class="">Could you expand the code above into a complete example that can be run through vtkpython? That will make it easier to take a look. In particular, please add a part that shows the vtkImageData are being scaled to positive integers. It's fine if you fill the array with random values.</span></div><div class=""><span style="font-size:12.8000001907349px" class=""><br class=""></span></div><div class=""><span style="font-size:12.8000001907349px" class="">Thanks,</span></div><div class=""><span style="font-size:12.8000001907349px" class="">Cory</span></div><div class=""><br class=""></div></div></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote"><div class=""><div class="h5">On Sat, Jul 18, 2015 at 6:08 AM, Quentan Qi <span dir="ltr" class=""><<a href="mailto:quentan@gmail.com" target="_blank" class="">quentan@gmail.com</a>></span> wrote:<br class=""></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class=""><div class="h5"><div style="word-wrap:break-word" class="">Hi there,<div class=""><br class=""></div><div class="">I am going to read a set of discrete 3D points (<font face="Courier New" class="">float</font> value, not <font face="Courier New" class="">int</font> value) and show both the points and the fitting surface via VTK’s implicit functions, say vtkImplicitVolume or vtkImplicitDataSet.</div><div class=""><br class=""></div><div class="">It works fine of the numpy arrary to vtkImageData conversion in the following code, but is out of my mind how to convert it to vtkDataSet, which is my requirement.</div><div class=""><br class=""></div><div class=""><font face="Courier New" class="">```Python</font></div><div class=""><div class=""><font face="Courier New" class="">    # Convert numpy array to VTK array (vtkFloatArray)</font></div></div><div class=""><font face="Courier New" class="">    vtk_data_array = numpy_support.numpy_to_vtk(</font></div><div class=""><div class=""><font face="Courier New" class="">        num_array=ndarray.transpose(2, 1, 0).ravel(),  # ndarray contains the fitting result from the points. It is a 3D array</font></div><div class=""><font face="Courier New" class="">        deep=True,</font></div><div class=""><font face="Courier New" class="">        array_type=vtk.VTK_FLOAT)</font></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">    # Convert the VTK array to vtkImageData</font></div><div class=""><font face="Courier New" class="">    img_vtk = vtk.vtkImageData()</font></div><div class=""><font face="Courier New" class="">    img_vtk.SetDimensions(ndarray.shape)</font></div><div class=""><font face="Courier New" class="">    img_vtk.SetSpacing(spacing[::-1])</font></div><div class=""><font face="Courier New" class="">    img_vtk.GetPointData().SetScalars(vtk_data_array)</font></div></div><div class=""><font face="Courier New" class=""><br class=""></font></div><div class=""><font face="Courier New" class="">    # …</font></div><div class=""><font face="Courier New" class=""><div class="">    implicit_volume = vtk.vtkImplicitVolume()  # I want a vtkImplicitDataSet, whose input is a vtkDataSet</div><div class="">    implicit_volume.SetVolume(img_vtk)</div></font></div><div class=""><font face="Courier New" class="">```</font></div><div class=""><br class=""></div><div class="">Because vtkImageData scales all points to positive integer values so that the rendering result mismatches the original points, I deem vtkDataSet or its subclass can do it. Anybody knows how to convert?</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Quentan</div></div><br class="">_______________________________________________<br class=""></div></div>
Powered by <a href="http://www.kitware.com/" rel="noreferrer" target="_blank" class="">www.kitware.com</a><span class=""><br class="">
<br class="">
Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" rel="noreferrer" target="_blank" class="">http://www.kitware.com/opensource/opensource.html</a><br class="">
<br class="">
Please keep messages on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" rel="noreferrer" target="_blank" class="">http://www.vtk.org/Wiki/VTK_FAQ</a><br class="">
<br class="">
Search the list archives at: <a href="http://markmail.org/search/?q=vtkusers" rel="noreferrer" target="_blank" class="">http://markmail.org/search/?q=vtkusers</a><br class="">
<br class="">
Follow this link to subscribe/unsubscribe:<br class="">
<a href="http://public.kitware.com/mailman/listinfo/vtkusers" rel="noreferrer" target="_blank" class="">http://public.kitware.com/mailman/listinfo/vtkusers</a><br class="">
<br class=""></span></blockquote></div><span class=""><br class=""><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div class="">Cory Quammen<br class="">R&D Engineer<br class="">Kitware, Inc.</div>
</span></div>
</div></blockquote></div><br class=""></div></div></blockquote></div><br class=""><br clear="all" class=""><div class=""><br class=""></div>-- <br class=""><div class="gmail_signature">Cory Quammen<br class="">R&D Engineer<br class="">Kitware, Inc.</div>
</div>
</div></blockquote></div><br class=""></div></body></html>