<div dir="ltr">Are your normals all in the right directions?<br><div><br></div><div>You could try the vtkPolyDataNormals or vktReverseSense filters to try to make them consistent.<br></div><div style><br></div><div style>Seth</div>

<div>
<div class="gmail_extra"><br><br><div class="gmail_quote">On Thu, Jun 6, 2013 at 9:00 AM, <a href="mailto:vtkusers-request@vtk.org">vtkusers-request@vtk.org</a> <span dir="ltr">&lt;<a href="mailto:vtkusers-request@vtk.org" target="_blank">vtkusers-request@vtk.org</a>&gt;</span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">Send vtkusers mailing list submissions to<br>
        <a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a><br>
<br>
To subscribe or unsubscribe via the World Wide Web, visit<br>
        <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
or, via email, send a message with subject or body &#39;help&#39; to<br>
        <a href="mailto:vtkusers-request@vtk.org">vtkusers-request@vtk.org</a><br>
<br>
You can reach the person managing the list at<br>
        <a href="mailto:vtkusers-owner@vtk.org">vtkusers-owner@vtk.org</a><br>
<br>
When replying, please edit your Subject line so it is more specific<br>
than &quot;Re: Contents of vtkusers digest...&quot;<br>
<br>
<br>
Today&#39;s Topics:<br>
<br>
   1. computing the volume of a simple multi triangles polydata<br>
      (Michele)<br>
<br>
<br>
----------------------------------------------------------------------<br>
<br>
Message: 1<br>
Date: Thu, 6 Jun 2013 07:33:22 -0700 (PDT)<br>
From: Michele &lt;<a href="mailto:michele.conconi@unibo.it">michele.conconi@unibo.it</a>&gt;<br>
Subject: [vtkusers] computing the volume of a simple multi triangles<br>
        polydata<br>
To: <a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a><br>
Message-ID: &lt;<a href="mailto:1370529201962-5721243.post@n5.nabble.com">1370529201962-5721243.post@n5.nabble.com</a>&gt;<br>
Content-Type: text/plain; charset=us-ascii<br>
<br>
Hi everybody,<br>
<br>
I am tring to build a polydata starting from an ordered set of points in<br>
space in order to evaluate its volume.<br>
<br>
I built an exapmple (see below) which generate a correct visual<br>
representation of the polydata, but the computed volume is wrong (6.8 rather<br>
then 48 mm^3).<br>
<br>
I tried aldo the vtkDelaunay2D, with no better results.<br>
<br>
What am I doing wrong?<br>
Thanks in advance for the help<br>
<br>
Michele<br>
<br>
------------------------------<br>
<br>
<br>
#include &lt;vtkVersion.h&gt;<br>
#include &lt;vtkSmartPointer.h&gt;<br>
#include &lt;vtkCellArray.h&gt;<br>
#include &lt;vtkCellData.h&gt;<br>
#include &lt;vtkDoubleArray.h&gt;<br>
#include &lt;vtkPoints.h&gt;<br>
#include &lt;vtkPolyLine.h&gt;<br>
#include &lt;vtkPolyData.h&gt;<br>
#include &lt;vtkPolyDataMapper.h&gt;<br>
#include &lt;vtkActor.h&gt;<br>
#include &lt;vtkRenderWindow.h&gt;<br>
#include &lt;vtkRenderer.h&gt;<br>
#include &lt;vtkRenderWindowInteractor.h&gt;<br>
#include &lt;vtkMassProperties.h&gt;<br>
#include &lt;vtkTriangle.h&gt;<br>
<br>
<br>
<br>
int main( int argc, char *argv[] )<br>
{<br>
        // build the points set to be triangulated<br>
        int Np = 5;<br>
        double **P1, **P2, **P3;<br>
<br>
        P1 = new double*[Np];<br>
        P2 = new double*[Np];<br>
        P3 = new double*[Np];<br>
<br>
        for(int i = 0; i &lt; Np; i++)<br>
        {<br>
                P1[i] = new double[4];<br>
                P2[i] = new double[4];<br>
                P3[i] = new double[4];<br>
        }<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
        {<br>
                P1[i][0]        = 0+i;<br>
                P1[i][1]        = 1;<br>
                P1[i][2]        = 0;<br>
<br>
                P2[i][0]        = 0+i;<br>
                P2[i][1]        = 3;<br>
                P2[i][2]        = 2;<br>
<br>
                P3[i][0]        = 0+i;<br>
                P3[i][1]        = 5;<br>
                P3[i][2]        = 4;<br>
        }<br>
<br>
<br>
        vtkSmartPointer&amp;lt;vtkPoints&gt; points = vtkSmartPointer&lt;vtkPoints&gt;::New();<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P1[i]);<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P2[i]);<br>
<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P3[i]);<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P1[i][0],0,P1[i][2]);<br>
<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P2[i][0],0,P2[i][2]);<br>
<br>
        for(int i=0;i&lt;Np;i++)<br>
                points-&gt;InsertNextPoint(P3[i][0],0,P3[i][2]);<br>
<br>
<br>
        //build manually the triangle<br>
<br>
        vtkSmartPointer&lt;vtkCellArray&gt; triangles =<br>
vtkSmartPointer&lt;vtkCellArray&gt;::New();<br>
        vtkSmartPointer&lt;vtkTriangle&gt; triangle =<br>
vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>
<br>
        // ------------------------------------- base<br>
        for(int j=3;j&lt;5;j++)<br>
                for(int i = (j*Np)+1; i &lt; (j+1)*Np; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,Np+i-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        for(int j=4;j&lt;6;j++)<br>
                for(int i = j*Np; i &lt; (j+1)*Np-1; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i+1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,i-Np+1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
<br>
        // ---------------------------------------- side 1<br>
<br>
        for(int i = 1; i &lt; Np; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,3*Np+i-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        for(int i = 3*Np; i &lt; 4*Np-1; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i+1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,i-3*Np+1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        // ---------------------------------------- side 2<br>
        for(int i = 2*Np+1; i &lt; 3*Np; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,3*Np+i-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        for(int i = 5*Np; i &lt; 6*Np-1; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i+1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,i-3*Np+1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        // ---------------------------------------- side 3<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,0);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,3*Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,4*Np);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,4*Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,5*Np);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,4*Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,0);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,5*Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,2*Np);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,Np);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
        // ---------------------------------------- side 4<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,4*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,5*Np-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,2*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,5*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,6*Np-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,5*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,2*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,Np-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,6*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,3*Np-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,2*Np-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
<br>
<br>
        // -------------------- top<br>
<br>
        for(int j=0;j&lt;2;j++)<br>
                for(int i = (j*Np)+1; i &lt; (j+1)*Np; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i-1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,Np+i-1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
        for(int j=1;j&lt;3;j++)<br>
                for(int i = j*Np; i &lt; (j+1)*Np-1; i++)<br>
                {<br>
                        triangle-&gt;Initialize();<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(0,i);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(1,i+1);<br>
                        triangle-&gt;GetPointIds()-&gt;SetId(2,i-Np+1);<br>
                        triangles -&gt;InsertNextCell(triangle);<br>
                }<br>
<br>
<br>
        // build the polydata<br>
<br>
        vtkPolyData *polyData = vtkPolyData::New();<br>
<br>
        polyData-&gt;SetPoints(points);<br>
        polyData-&gt;SetPolys(triangles );<br>
<br>
<br>
        //evaluate the volume : expected outcome for the current points set 48<br>
<br>
        vtkMassProperties *mass = vtkMassProperties::New();<br>
<br>
        mass-&gt;SetInput(polyData);<br>
        cout&lt;&lt;&quot;volume &quot;&lt;&lt;mass-&gt;GetVolume()&lt;&lt;endl;<br>
<br>
          // Setup actor and mapper<br>
          vtkSmartPointer&amp;lt;vtkPolyDataMapper&gt; mapper =<br>
vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>
          mapper-&gt;SetInput(polyData);<br>
<br>
<br>
          vtkSmartPointer&lt;vtkActor&gt; actor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>
          actor-&gt;SetMapper(mapper);<br>
<br>
          // Setup render window, renderer, and interactor<br>
          vtkSmartPointer&lt;vtkRenderer&gt; renderer =<br>
vtkSmartPointer&lt;vtkRenderer&gt;::New();<br>
          vtkSmartPointer&lt;vtkRenderWindow&gt; renderWindow =<br>
vtkSmartPointer&lt;vtkRenderWindow&gt;::New();<br>
          renderWindow-&gt;AddRenderer(renderer);<br>
          vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; renderWindowInteractor =<br>
vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();<br>
          renderWindowInteractor-&gt;SetRenderWindow(renderWindow);<br>
          renderer-&gt;AddActor(actor);<br>
<br>
          renderWindow-&gt;Render();<br>
          renderWindowInteractor-&gt;Start();<br>
<br>
return 0;<br>
}<br>
<br>
<br>
<br>
--<br>
View this message in context: <a href="http://vtk.1045678.n5.nabble.com/computing-the-volume-of-a-simple-multi-triangles-polydata-tp5721243.html" target="_blank">http://vtk.1045678.n5.nabble.com/computing-the-volume-of-a-simple-multi-triangles-polydata-tp5721243.html</a><br>


Sent from the VTK - Users mailing list archive at Nabble.com.<br>
<br>
<br>
------------------------------<br>
<br>
_______________________________________________<br>
vtkusers mailing list<br>
<a href="mailto:vtkusers@vtk.org">vtkusers@vtk.org</a><br>
<a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>
<br>
<br>
End of vtkusers Digest, Vol 110, Issue 9<br>
****************************************<br>
</blockquote></div><br></div></div></div>