The easiest way to answer this is to show the code. Below is what it does for triangles. You can find what it does for other polygon types in here:
http://paraview.org/gitweb?p=ParaView.git;a=blob_plain;f=Servers/Filters/vtkIntegrateAttributes.cxx;hb=HEAD Note that the actual filter is vtkIntegrateFlowThroughSurface which uses vtkSurfaceVectors to calculate vector . normal and then vtkIntegrateAttributes to integrate it over a polygonal surface. If you find a bug or inaccuracy that can be improved, please let us know. void vtkIntegrateAttributes::IntegrateTriangle(vtkDataSet* input, vtkUnstructuredGrid* output, vtkIdType cellId, vtkIdType pt1Id, vtkIdType pt2Id, vtkIdType pt3Id) { double pt1[3], pt2[3], pt3[3]; double mid[3], v1[3], v2[3]; double cross[3]; double k; input->GetPoint(pt1Id,pt1); input->GetPoint(pt2Id,pt2); input->GetPoint(pt3Id,pt3); // Compute two legs. v1[0] = pt2[0] - pt1[0]; v1[1] = pt2[1] - pt1[1]; v1[2] = pt2[2] - pt1[2]; v2[0] = pt3[0] - pt1[0]; v2[1] = pt3[1] - pt1[1]; v2[2] = pt3[2] - pt1[2]; // Use the cross product to compute the area of the parallelogram. vtkMath::Cross(v1,v2,cross); k = sqrt(cross[0]*cross[0] + cross[1]*cross[1] + cross[2]*cross[2]) * 0.5; if (k == 0.0) { return; } this->Sum += k; // Compute the middle, which is really just another attribute. mid[0] = (pt1[0]+pt2[0]+pt3[0])/3.0; mid[1] = (pt1[1]+pt2[1]+pt3[1])/3.0; mid[2] = (pt1[2]+pt2[2]+pt3[2])/3.0; // Add weighted to sumCenter. this->SumCenter[0] += mid[0]*k; this->SumCenter[1] += mid[1]*k; this->SumCenter[2] += mid[2]*k; // Now integrate the rest of the attributes. this->IntegrateData3(input->GetPointData(), output->GetPointData(), pt1Id, pt2Id, pt3Id, k, *this->PointFieldList, this->FieldListIndex); this->IntegrateData1(input->GetCellData(), output->GetCellData(), cellId, k, *this->CellFieldList, this->FieldListIndex); } void vtkIntegrateAttributes::IntegrateData3(vtkDataSetAttributes* inda, vtkDataSetAttributes* outda, vtkIdType pt1Id, vtkIdType pt2Id, vtkIdType pt3Id, double k, vtkIntegrateAttributes::vtkFieldList& fieldList, int index) { int numArrays, i, numComponents, j; vtkDataArray* inArray; vtkDataArray* outArray; numArrays = fieldList.GetNumberOfFields(); double vIn1, vIn2, vIn3, dv, vOut; for (i = 0; i < numArrays; ++i) { if (fieldList.GetFieldIndex(i) < 0) { continue; } // We could template for speed. inArray = inda->GetArray(fieldList.GetDSAIndex(index, i)); outArray = outda->GetArray(fieldList.GetFieldIndex(i)); numComponents = inArray->GetNumberOfComponents(); for (j = 0; j < numComponents; ++j) { vIn1 = inArray->GetComponent(pt1Id, j); vIn2 = inArray->GetComponent(pt2Id, j); vIn3 = inArray->GetComponent(pt3Id, j); vOut = outArray->GetComponent(0, j); dv = (vIn1+vIn2+vIn3)/3.0; vOut += dv*k; outArray->SetComponent(0, j, vOut); } } } 2011/2/11 Aurélien Marsan <[email protected]>: > Dear all, > > Using the surface flow filter, I get results that are not those expected. > Could you give me some informations about how the integration is performed ? > > Is this a "local" approach, computing the surface of each face, and doing > some point data to face data interpolation ? > > Thanks, > > Aurélien. > _______________________________________________ > Powered by www.kitware.com > > Visit other Kitware open-source projects at > http://www.kitware.com/opensource/opensource.html > > Please keep messages on-topic and check the ParaView Wiki at: > http://paraview.org/Wiki/ParaView > > Follow this link to subscribe/unsubscribe: > http://www.paraview.org/mailman/listinfo/paraview > > _______________________________________________ Powered by www.kitware.com Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Please keep messages on-topic and check the ParaView Wiki at: http://paraview.org/Wiki/ParaView Follow this link to subscribe/unsubscribe: http://www.paraview.org/mailman/listinfo/paraview
