File: vtkRadiusOutlierRemoval.cxx

package info (click to toggle)
vtk7 7.1.1%2Bdfsg1-12
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 125,776 kB
  • sloc: cpp: 1,539,582; ansic: 106,521; python: 78,038; tcl: 47,013; xml: 8,142; yacc: 5,040; java: 4,439; perl: 3,132; lex: 1,926; sh: 1,500; makefile: 122; objc: 83
file content (152 lines) | stat: -rw-r--r-- 4,908 bytes parent folder | download | duplicates (3)
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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkRadiusOutlierRemoval.cxx

  Copyright (c) Kitware, Inc.
  All rights reserved.
  See LICENSE file 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 "vtkRadiusOutlierRemoval.h"

#include "vtkObjectFactory.h"
#include "vtkAbstractPointLocator.h"
#include "vtkStaticPointLocator.h"
#include "vtkPointSet.h"
#include "vtkPoints.h"
#include "vtkIdList.h"
#include "vtkSMPTools.h"
#include "vtkSMPThreadLocalObject.h"


vtkStandardNewMacro(vtkRadiusOutlierRemoval);
vtkCxxSetObjectMacro(vtkRadiusOutlierRemoval,Locator,vtkAbstractPointLocator);

//----------------------------------------------------------------------------
// Helper classes to support efficient computing, and threaded execution.
namespace {

//----------------------------------------------------------------------------
// The threaded core of the algorithm (first pass)
template <typename T>
struct RemoveOutliers
{
  const T *Points;
  vtkAbstractPointLocator *Locator;
  double Radius;
  int NumNeighbors;
  vtkIdType *PointMap;

  // Don't want to allocate working arrays on every thread invocation. Thread local
  // storage lots of new/delete.
  vtkSMPThreadLocalObject<vtkIdList> PIds;

  RemoveOutliers(T *points, vtkAbstractPointLocator *loc, double radius, int numNei,
                 vtkIdType *map) : Points(points), Locator(loc), Radius(radius),
                                   NumNeighbors(numNei), PointMap(map)
  {
  }

  // Just allocate a little bit of memory to get started.
  void Initialize()
  {
    vtkIdList*& pIds = this->PIds.Local();
    pIds->Allocate(128); //allocate some memory
  }

  void operator() (vtkIdType ptId, vtkIdType endPtId)
  {
      const T *p = this->Points + 3*ptId;
      vtkIdType *map = this->PointMap + ptId;
      double x[3];
      vtkIdList*& pIds = this->PIds.Local();

      for ( ; ptId < endPtId; ++ptId)
      {
        x[0] = static_cast<double>(*p++);
        x[1] = static_cast<double>(*p++);
        x[2] = static_cast<double>(*p++);

        this->Locator->FindPointsWithinRadius(this->Radius, x, pIds);
        vtkIdType numPts = pIds->GetNumberOfIds();

        // Keep in mind that The FindPoints method will always return at
        // least one point (itself).
        *map++ = ( numPts > this->NumNeighbors ? 1 : -1 );
      }
  }

  void Reduce()
  {
  }

  static void Execute(vtkRadiusOutlierRemoval *self, vtkIdType numPts,
                      T *points, vtkIdType *map)
  {
      RemoveOutliers remove(points, self->GetLocator(), self->GetRadius(),
                            self->GetNumberOfNeighbors(), map);
      vtkSMPTools::For(0, numPts, remove);
  }

}; //RemoveOutliers

} //anonymous namespace

//================= Begin class proper =======================================
//----------------------------------------------------------------------------
vtkRadiusOutlierRemoval::vtkRadiusOutlierRemoval()
{
  this->Radius = 1.0;
  this->NumberOfNeighbors = 2;
  this->Locator = vtkStaticPointLocator::New();
}

//----------------------------------------------------------------------------
vtkRadiusOutlierRemoval::~vtkRadiusOutlierRemoval()
{
  this->SetLocator(NULL);
}

//----------------------------------------------------------------------------
// Traverse all the input points to see how many neighbors each point has
// within a specified radius, and populate the map which indicates how points
// are to be copied to the output.
int vtkRadiusOutlierRemoval::FilterPoints(vtkPointSet *input)
{
  // Perform the point removal
  // Start by building the locator
  if ( !this->Locator )
  {
    vtkErrorMacro(<<"Point locator required\n");
    return 0;
  }
  this->Locator->SetDataSet(input);
  this->Locator->BuildLocator();

  // Determine which points, if any, should be removed. We create a map
  // to keep track. The bulk of the algorithmic work is done in this pass.
  vtkIdType numPts = input->GetNumberOfPoints();
  void *inPtr = input->GetPoints()->GetVoidPointer(0);
  switch (input->GetPoints()->GetDataType())
  {
    vtkTemplateMacro(RemoveOutliers<VTK_TT>::
                     Execute(this, numPts, (VTK_TT *)inPtr, this->PointMap));
  }

  return 1;
}

//----------------------------------------------------------------------------
void vtkRadiusOutlierRemoval::PrintSelf(ostream& os, vtkIndent indent)
{
  this->Superclass::PrintSelf(os,indent);

  os << indent << "Radius: " << this->Radius << "\n";
  os << indent << "Number of Neighbors: " << this->NumberOfNeighbors << "\n";
  os << indent << "Locator: " << this->Locator << "\n";
}