[vtk-developers] [vtkusers] Uneven colors after the vtkButterflySubdivisionFilter

David Gobbi david.gobbi at gmail.com
Sun Apr 21 17:42:06 EDT 2013


I've posted a potential fix along with a test.  I haven't done
performance checks yet, but I'd like to note that this code is only
executed when InterpolateTuple() is called on an integer-type array.

http://review.source.kitware.com/#/t/2661/

On Sun, Apr 21, 2013 at 2:27 PM, David Gobbi <david.gobbi at gmail.com> wrote:
> The specialization is already there in the vtkDataArray code.  Integer
> scalars have their own code path.  VTK isn't as far behind the times
> as you seem to think ;)
>
> On Sun, Apr 21, 2013 at 2:24 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>> In ITK we use traits to turn runtime tests into compile tests. This might
>> help, And specialization might help to provide clamping for those types that
>> need it.
>>
>>
>>
>>
>> On Sun, Apr 21, 2013 at 4:14 PM, David Gobbi <david.gobbi at gmail.com> wrote:
>>>
>>> Yes, but performance could equally well be a non-issue.  No way to be
>>> sure without trying a fix and doing some timings.  I strongly suspect
>>> the performance hit would be negligible, given the large amount of
>>> code in InterpolateTuple().
>>>
>>>  - David
>>>
>>>
>>> On Sun, Apr 21, 2013 at 1:43 PM, Bill Lorensen <bill.lorensen at gmail.com>
>>> wrote:
>>> > Performance could be an issue.
>>> >
>>> >
>>> > On Sun, Apr 21, 2013 at 3:39 PM, David Gobbi <david.gobbi at gmail.com>
>>> > wrote:
>>> >>
>>> >> Hi Bill,
>>> >>
>>> >> I traced the code that is interpolating the scalars, and it led me to
>>> >> the following function in vtkDataArray.cxx, which is called from
>>> >> vtkDataArray::InterpolateTuple().  In fact, that is the only place
>>> >> this function is called from.
>>> >>
>>> >>   template <class T>
>>> >>   inline void vtkDataArrayRoundIfNecessary(double val, T* retVal)
>>> >>   {
>>> >>     *retVal = static_cast<T>((val>=0.0)?(val + 0.5):(val - 0.5));
>>> >>   }
>>> >>
>>> >> It might be good for us to add a clamp here immediately before the
>>> >> cast, rather than to trust that the weights will never sum to a value
>>> >> greater than one.
>>> >>
>>> >> Either that, or vtkButterflySubdivisionFilter can be modified so that
>>> >> it normalizes the weights before it interpolates the scalars (i.e. it
>>> >> would be approximating when computing the points, but would use
>>> >> normalized weights when computing the scalars).  My preference,
>>> >> though, would be to modify vtkDataArray in order to make the fix more
>>> >> general.
>>> >>
>>> >>  - David
>>> >>
>>> >>
>>> >>
>>> >> On Sun, Apr 21, 2013 at 10:12 AM, Bill Lorensen
>>> >> <bill.lorensen at gmail.com>
>>> >> wrote:
>>> >> > Maybe I have it this time.
>>> >> >
>>> >> > Multiple problems:
>>> >> > 1) First number of points must be used, not number of ploys
>>> >> > 2) I think color interpolation is overflowing/underflowing the
>>> >> > unsigned
>>> >> > char
>>> >> >
>>> >> > Solution. Use FloatArray for colors. After subdivision,  convert the
>>> >> > floats
>>> >> > to unsigned chars, clamping between 0 and 255.
>>> >> >
>>> >> > Attached is an example c++ that seems to work.
>>> >> >
>>> >> >
>>> >> >
>>> >> > On Sun, Apr 21, 2013 at 11:46 AM, Bill Lorensen
>>> >> > <bill.lorensen at gmail.com>
>>> >> > wrote:
>>> >> >>
>>> >> >> Oops. I still see problems after that change.
>>> >> >>
>>> >> >>
>>> >> >>
>>> >> >> On Sun, Apr 21, 2013 at 11:45 AM, Bill Lorensen
>>> >> >> <bill.lorensen at gmail.com>
>>> >> >> wrote:
>>> >> >>>
>>> >> >>> Found the problem.
>>> >> >>>
>>> >> >>> You want to set the point data, but your colors array is filled for
>>> >> >>> NumberOfPolys. Replace NumberOfPolys with NumberOfPoints and the
>>> >> >>> results
>>> >> >>> look good.
>>> >> >>>
>>> >> >>>
>>> >> >>>
>>> >> >>> On Sun, Apr 21, 2013 at 10:43 AM, DivyaS <div.anand141 at gmail.com>
>>> >> >>> wrote:
>>> >> >>>>
>>> >> >>>> Bill,
>>> >> >>>>
>>> >> >>>> Butterfly subdivision gives me better results(shape) to the actual
>>> >> >>>> data
>>> >> >>>> i'm
>>> >> >>>> working on. Is there no other way we can get this working? you
>>> >> >>>> were
>>> >> >>>> talking
>>> >> >>>> about assigned scalar float, single component values, I would like
>>> >> >>>> to
>>> >> >>>> give
>>> >> >>>> it a try.. could you please give me some details on that.
>>
>>
>>
>>
>> --
>> Unpaid intern in BillsBasement at noware dot com



More information about the vtk-developers mailing list