forked from Kitware/VTK
-
Notifications
You must be signed in to change notification settings - Fork 0
/
vtkContourHelper.cxx
106 lines (96 loc) · 3.19 KB
/
vtkContourHelper.cxx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*=========================================================================
Program: Visualization Toolkit
Module: vtkContourHelper.cxx
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 "vtkContourHelper.h"
#include "vtkIncrementalPointLocator.h"
#include "vtkCellArray.h"
#include "vtkPointData.h"
#include "vtkCellData.h"
#include "vtkPolygonBuilder.h"
#include "vtkIdList.h"
#include "vtkCell.h"
#include "vtkDataArray.h"
vtkContourHelper::vtkContourHelper(vtkIncrementalPointLocator *locator,
vtkCellArray *verts,
vtkCellArray *lines,
vtkCellArray* polys,
vtkPointData *inPd,
vtkCellData *inCd,
vtkPointData* outPd,
vtkCellData *outCd,
int estimatedSize,
bool outputTriangles):
Locator(locator),
Verts(verts),
Lines(lines),
Polys(polys),
InPd(inPd),
InCd(inCd),
OutPd(outPd),
OutCd(outCd),
GenerateTriangles(outputTriangles)
{
this->Tris = vtkCellArray::New();
this->TriOutCd = vtkCellData::New();
if(this->GenerateTriangles)
{
this->Tris->Allocate(estimatedSize,estimatedSize/2);
this->TriOutCd->Initialize();
}
this->Poly = vtkIdList::New();
}
vtkContourHelper::~vtkContourHelper()
{
this->Tris->Delete();
this->TriOutCd->Delete();
this->Poly->FastDelete();
}
void vtkContourHelper::Contour(vtkCell* cell, double value, vtkDataArray *cellScalars, vtkIdType cellId)
{
bool mergeTriangles = (!this->GenerateTriangles) && cell->GetCellDimension()==3;
vtkCellData* outCD;
vtkCellArray* outPoly;
if(mergeTriangles)
{
outPoly = this->Tris;
outCD = this->TriOutCd;
}
else
{
outPoly = this->Polys;
outCD = this->OutCd;
}
cell->Contour(value,cellScalars,this->Locator, this->Verts, this->Lines,
outPoly, this->InPd,this->OutPd,this->InCd,cellId, outCD);
if(mergeTriangles)
{
this->PolyBuilder.Reset();
vtkIdType cellSize;
vtkIdType* cellVerts;
while(this->Tris->GetNextCell(cellSize,cellVerts))
{
if(cellSize==3)
{
this->PolyBuilder.InsertTriangle(cellVerts);
}
else //for whatever reason, the cell contouring is already outputing polys
{
vtkIdType outCellId = this->Polys->InsertNextCell(cellSize, cellVerts);
this->OutCd->CopyData(this->InCd, cellId, outCellId);
}
}
this->PolyBuilder.GetPolygon(this->Poly);
if(this->Poly->GetNumberOfIds()!=0)
{
vtkIdType outCellId = this->Polys->InsertNextCell(this->Poly);
this->OutCd->CopyData(this->InCd, cellId, outCellId);
}
}
}