OGS
VtkImageDataToLinePolyDataFilter.cpp
Go to the documentation of this file.
1 
15 // ** INCLUDES **
17 
18 #include <vtkIdList.h>
19 #include <vtkImageData.h>
20 #include <vtkInformation.h>
21 #include <vtkInformationVector.h>
22 #include <vtkLine.h>
23 #include <vtkObjectFactory.h>
24 #include <vtkPointData.h>
25 #include <vtkPolyData.h>
26 #include <vtkSmartPointer.h>
27 
30 
31 {
32  this->SetLengthScaleFactor(1.0);
33 }
34 
36 
37 void VtkImageDataToLinePolyDataFilter::PrintSelf(ostream& os, vtkIndent indent)
38 {
39  this->Superclass::PrintSelf(os, indent);
40  os << indent << "LengthScaleFactor: " << this->LengthScaleFactor << "\n";
41 }
42 
44  int /*port*/, vtkInformation* info)
45 {
46  info->Set(vtkAlgorithm::INPUT_REQUIRED_DATA_TYPE(), "vtkImageData");
47  return 1;
48 }
49 
51  vtkInformation* /*request*/,
52  vtkInformationVector** inputVector,
53  vtkInformationVector* outputVector)
54 {
55  vtkDebugMacro(<< "Executing VtkImageDataToPolyDataFilter");
56 
57  vtkInformation* inInfo = inputVector[0]->GetInformationObject(0);
58  vtkInformation* outInfo = outputVector->GetInformationObject(0);
59  vtkImageData* input =
60  vtkImageData::SafeDownCast(inInfo->Get(vtkDataObject::DATA_OBJECT()));
61  vtkPolyData* output =
62  vtkPolyData::SafeDownCast(outInfo->Get(vtkDataObject::DATA_OBJECT()));
63 
64  void* inScalarPtr = input->GetScalarPointer();
65  int numScalarComponents = input->GetNumberOfScalarComponents();
66 
67  double spacing[3];
68  input->GetSpacing(spacing);
69  this->ImageSpacing = spacing[0];
70 
71  int dimensions[3];
72  input->GetDimensions(dimensions);
73 
74  // Skip execution if there are no points
75  vtkIdType numPts = input->GetNumberOfPoints();
76  if (numPts < 1)
77  {
78  vtkDebugMacro("No data to extract lines!");
79  return 1;
80  }
81 
82  // Allocate the space needed for the output cells.
83  output->Allocate(numPts);
84 
85  // Allocate space for a new set of points
86  vtkSmartPointer<vtkPoints> newPts = vtkSmartPointer<vtkPoints>::New();
87  newPts->SetNumberOfPoints(numPts * 2);
88 
89  // Allocate space for the data associated with the new set of points
90  vtkPointData* inPD = input->GetPointData();
91  vtkPointData* outPD = output->GetPointData();
92  outPD->CopyAllocate(inPD, numPts * 16, numPts);
93 
94  // Compute scaling factor that max height is 0.1 * longest image dimension
95  double range[2];
96  inPD->GetArray(0)->GetRange(range);
97  double const scalingFactor =
98  (std::max(dimensions[0], dimensions[1]) * spacing[0] * 0.1) /
99  std::max(range[0], range[1]);
100 
101  double dir[3] = {0, 0, 1};
102 
103  // Traverse all points creating another point with scalar distance in Z
104  // direction
105  for (vtkIdType ptId = 0; ptId < numPts; ++ptId)
106  {
107  // Skip translucent pixels
108  float opacity =
109  (static_cast<float*>(inScalarPtr))[ptId * numScalarComponents + 1];
110  if (opacity < 0.00000001f)
111  {
112  continue;
113  }
114 
115  // Compute length of the new line (scalar * LengthScaleFactor)
116  double const length =
117  (static_cast<float*>(inScalarPtr))[ptId * numScalarComponents] *
118  scalingFactor * this->LengthScaleFactor;
119 
120  // Skip this line if length is zero
121  if (length < 0.00000001f)
122  {
123  continue;
124  }
125 
126  // Get the old point location
127  double p[3];
128  input->GetPoint(ptId, p);
129 
130  // Compute the new point location
131  double newPt[3];
132  for (std::size_t i = 0; i < 3; ++i)
133  {
134  newPt[i] = p[i] + dir[i] * length;
135  }
136 
137  // Copy the old point
138  newPts->SetPoint(ptId * 2, p);
139  outPD->CopyData(inPD, ptId, ptId * 2);
140 
141  // Create the new point
142  newPts->SetPoint(ptId * 2 + 1, newPt);
143  outPD->CopyData(inPD, ptId, ptId * 2 + 1);
144 
145  // Create the line
146  vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();
147  line->GetPointIds()->SetId(0, ptId * 2);
148  line->GetPointIds()->SetId(1, ptId * 2 + 1);
149  output->InsertNextCell(line->GetCellType(), line->GetPointIds());
150  }
151 
152  // Store the new set of points in the output
153  output->SetPoints(newPts);
154  output->GetPointData()->GetArray(0)->SetName("Colors");
155 
156  // Avoid keeping extra memory around
157  output->Squeeze();
158 
159  vtkDebugMacro(<< "Created: " << newPts->GetNumberOfPoints() << " points, "
160  << output->GetNumberOfCells() << " lines");
161 
162  return 1;
163 }
vtkStandardNewMacro(VtkImageDataToLinePolyDataFilter)
Definition of the VtkImageDataToLinePolyDataFilter class.
Creates lines that stand on top of the image with the length of the corresponding first sub-pixel val...
int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector) override
Converts the image data to lines.
double ImageSpacing
The spacing of the image.
void PrintSelf(ostream &os, vtkIndent indent) override
Prints information about itself.
int FillInputPortInformation(int port, vtkInformation *info) override
Sets input port to vtkImageData.
~VtkImageDataToLinePolyDataFilter() override
Destructor.
static const double p