[vtkusers] Using vtkMarchingCubes3D with vtkContourWidget

Jonathan Morra jonmorra at gmail.com
Thu Nov 18 20:20:01 EST 2010


I just wanted to let everyone know that I've solved this issue.  I ended up
totally redoing my internal storage to use binary volumes.  This allowed me
to run vtkMarchingSquares on the slice I was interested in, and use that for
contour initialization, and it works perfectly.

On Tue, Nov 16, 2010 at 4:25 PM, Jonathan Morra <jonmorra at gmail.com> wrote:

> I have been working on this some more and realized that I've overlooked a
> major issue.  When I cut a mesh in a different plane I might not get only 1
> contour.  This has lead me to do the following in the hopes of returning N
> vtkPoints, and creating a new contour with each.  Unfortunately this still
> doesn't work.  It would appear that some of the cells from strippedData need
> to be connected and some do not, however, I'm still not sure how to
> determine which ones should be connected and which ones should be different
> contours.
>
> The frustrating thing for me is that I know the code to do this is buried
> somewhere in VTK because when I render the output of vtkCutter, it looks
> totally reasonable, but I just can't seem to flush out the logic.
>
> Any ideas?
>
>         vtkStripper stripper = new vtkStripper();
>         stripper.SetInput(unorderedData);
>         stripper.Update();
>         vtkPolyData strippedData = stripper.GetOutput();
>
>         HashSet<vtkPoints> pointsSet = new HashSet<vtkPoints>();
>         // Here, we're trying to mimic the suggestion given here
>         //
> http://vtk.1045678.n5.nabble.com/question-about-vtkContourWidget-vtkContourRepresentation-td1255118.html#a3247766
>
>         for (int i=0; i<strippedData.GetNumberOfCells(); i++) {
>             vtkCell cell = strippedData.GetCell(i);
>             vtkPoints points = new vtkPoints();
>             for (int j=0; j<cell.GetNumberOfPoints(); j++)
>                 points.InsertNextPoint(cell.GetPoints().GetPoint(j));
>             pointsSet.add(points);
>         }
>
>         return pointsSet;
>
> On Mon, Nov 15, 2010 at 11:08 AM, Jonathan Morra <jonmorra at gmail.com>wrote:
>
>> So I've found out some more info.  It would appear that I am in fact
>> ordering the points in each cell correctly.  The following code will output
>> a part of the total points in order.  However, if I uncomment the outer for
>> loop and change strippedData.GetCell(0) to strippedData.GetCell(i) the
>> points are again out of order (like my last message).  It would appear that
>> the cells of stripped data have an order that is not 0, 1, 2,...
>>
>> Does anyone know if this is correct, or if I'm on the right track?
>>
>>         vtkStripper stripper = new vtkStripper();
>>         stripper.SetInput(unorderedData);
>>         stripper.Update();
>>         vtkPolyData strippedData = stripper.GetOutput();
>>
>>         vtkPoints points = new vtkPoints();
>>         // Here, we're trying to mimic the suggestion given here
>>         //
>> http://vtk.1045678.n5.nabble.com/question-about-vtkContourWidget-vtkContourRepresentation-td1255118.html#a3247766
>>
>>         //for (int i=0; i<strippedData.GetNumberOfCells(); i++) {
>>             vtkCell cell = strippedData.GetCell(0);
>>             for (int j=0; j<cell.GetPoints().GetNumberOfPoints()-1; j++) {
>>                 points.InsertNextPoint(cell.GetPoints().GetPoint(j));
>>             }
>>         //}
>>         return points;
>>
>> On Thu, Nov 11, 2010 at 12:24 PM, Jonathan Morra <jonmorra at gmail.com>wrote:
>>
>>> So after struggling with this for a while, I've come up with the
>>> following code, which kinda does the job.
>>>
>>>     public vtkPoints reorderPoints(vtkPolyData unorderedData) {
>>>         vtkStripper stripper = new vtkStripper();
>>>         stripper.SetInput(unorderedData);
>>>         stripper.Update();
>>>         vtkPolyData strippedData = stripper.GetOutput();
>>>
>>>         vtkPoints points = new vtkPoints();
>>>         // Here, we're trying to mimic the suggestion given here
>>>         //
>>> http://vtk.1045678.n5.nabble.com/question-about-vtkContourWidget-vtkContourRepresentation-td1255118.html#a3247766
>>>         for (int i=0; i<strippedData.GetNumberOfCells(); i++) {
>>>             vtkCell cell = strippedData.GetCell(i);
>>>             for (int j=0; j<cell.GetPoints().GetNumberOfPoints()-1; j++)
>>> {
>>>                 points.InsertNextPoint(cell.GetPoints().GetPoint(j));
>>>             }
>>>         }
>>>         return points;
>>>     }
>>> The points that are returned are in "better" order than having not run
>>> this method, but it's still not the correct order.  It turns out that I
>>> cannot upgrade to the newest version of VTK because we're using GDCM which
>>> isn't yet integrated into the newest version of VTK, so I'm stuck with 5.6
>>> for now.  However, I did do a test on the head of GIT and I tried to use
>>> Karthik's code suggested above, but I still couldn't get that working.  I
>>> attempted to follow internally what vtkCellArray.GetNextCell() was doing,
>>> and that's how I came up with the above function.
>>>
>>> Can someone tell me why the above function isn't returning the vtkPoints
>>> in the correct order for vtkContourWidget?
>>>
>>> Thanks
>>>
>>> On Sat, Nov 6, 2010 at 10:12 PM, Karthik Krishnan <
>>> karthik.krishnan at kitware.com> wrote:
>>>
>>>> Ah.. yes.. This method was added on May 19, 2010. Perhaps you are
>>>> using a version of VTK prior to that.
>>>>
>>>> Please see :
>>>>
>>>> http://vtk.org/gitweb?p=VTK.git;a=commitdiff;h=068a064cea7ba0fc7a4c4f9d2f7dfed6eb093674
>>>>
>>>> Update your VTK.
>>>>
>>>>
>>>> On Sat, Nov 6, 2010 at 10:54 PM, Jonathan Morra <jonmorra at gmail.com>
>>>> wrote:
>>>> > I couldn't find GetNextCell() at all in Java. I'm currently using
>>>> version
>>>> > 5.6. Do you have any other suggestions?
>>>> >
>>>> > On Nov 6, 2010 9:05 AM, "Karthik Krishnan" <
>>>> karthik.krishnan at kitware.com>
>>>> > wrote:
>>>> >
>>>> > Jonathan:
>>>> >
>>>> > Use the other signature of the method GetNextCell. [ int
>>>> > GetNextCell(vtkIdList *pts) ]That should be wrapped...
>>>> >
>>>> > The code to re-order the points based on the connectivity information
>>>> > would be written in java as :
>>>> >
>>>> >  vtkIdList idlist = new vtkIdList();
>>>> >  unorderedPolyData.GetLines().GetNextCell(idlist);
>>>> >  npts = idlist.GetNumberOfIds();
>>>> >  for ( int i = 0;  i < ( npts-1 );  i ++)
>>>> >    {
>>>> >    points.InsertPoint(i,
>>>> unorderedPolyData.GetPoints().GetPoint(pts[i]));
>>>> >    }
>>>> >
>>>> > --
>>>> > karthik
>>>> >
>>>> > On Wed, Nov 3, 2010 at 7:29 AM, Jonathan Morra <jonmorra at gmail.com>
>>>> wrote:
>>>> >> I have a 3D vtkPolyDat...
>>>> >
>>>> >> _______________________________________________
>>>> >> Powered by www.kitware.com
>>>> >>
>>>> >> Visit other Kitwa...
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20101118/17c09444/attachment.htm>


More information about the vtkusers mailing list