Cloned library of VTK-5.0.0 with extra build files for internal package management.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

97 lines
3.0 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkLinearSubdivisionFilter.cxx,v $
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#include "vtkLinearSubdivisionFilter.h"
#include "vtkCellArray.h"
#include "vtkEdgeTable.h"
#include "vtkIdList.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include "vtkPolyData.h"
vtkCxxRevisionMacro(vtkLinearSubdivisionFilter, "$Revision: 1.17 $");
vtkStandardNewMacro(vtkLinearSubdivisionFilter);
void vtkLinearSubdivisionFilter::GenerateSubdivisionPoints (vtkPolyData *inputDS, vtkIntArray *edgeData, vtkPoints *outputPts, vtkPointData *outputPD)
{
vtkIdType *pts = 0;
int edgeId;
vtkIdType npts, cellId, newId;
vtkIdType p1, p2;
vtkCellArray *inputPolys=inputDS->GetPolys();
vtkEdgeTable *edgeTable;
vtkIdList *cellIds = vtkIdList::New();
vtkIdList *pointIds = vtkIdList::New();
vtkPoints *inputPts=inputDS->GetPoints();
vtkPointData *inputPD=inputDS->GetPointData();
static double weights[2] = {.5, .5};
// Create an edge table to keep track of which edges we've processed
edgeTable = vtkEdgeTable::New();
edgeTable->InitEdgeInsertion(inputDS->GetNumberOfPoints());
pointIds->SetNumberOfIds(2);
double total = inputPolys->GetNumberOfCells();
double curr = 0;
// Generate new points for subdivisions surface
for (cellId=0, inputPolys->InitTraversal();
inputPolys->GetNextCell(npts, pts); cellId++)
{
if ( inputDS->GetCellType(cellId) != VTK_TRIANGLE )
{
continue;
}
p1 = pts[2];
p2 = pts[0];
for (edgeId=0; edgeId < 3; edgeId++)
{
outputPD->CopyData (inputPD, p1, p1);
outputPD->CopyData (inputPD, p2, p2);
// Do we need to create a point on this edge?
if (edgeTable->IsEdge (p1, p2) == -1)
{
edgeTable->InsertEdge (p1, p2);
// Compute Position andnew PointData using the same subdivision scheme
pointIds->SetId(0,p1);
pointIds->SetId(1,p2);
newId =
this->InterpolatePosition (inputPts, outputPts, pointIds, weights);
outputPD->InterpolatePoint (inputPD, newId, pointIds, weights);
}
else // we have already created a point on this edge. find it
{
newId = this->FindEdge (inputDS, cellId, p1, p2, edgeData, cellIds);
}
edgeData->InsertComponent(cellId,edgeId,newId);
p1 = p2;
if (edgeId < 2)
{
p2 = pts[edgeId + 1];
}
} // each edge
this->UpdateProgress(curr / total);
curr += 1;
} // each cell
edgeTable->Delete();
cellIds->Delete();
pointIds->Delete();
}