ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ScalarField.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 // Local
11 #include "CVConst.h"
12 #include "CVShareable.h"
13 
14 // System
15 #include <vector>
16 
17 namespace cloudViewer {
18 
20 
25 class ScalarField : public std::vector<ScalarType>, public CCShareable {
26 public:
28 
31  CV_CORE_LIB_API explicit ScalarField(const char* name = nullptr);
32 
34 
38 
40  CV_CORE_LIB_API void setName(const char* name);
41 
43  inline const char* getName() const { return m_name; }
44 
46  static inline ScalarType NaN() { return NAN_VALUE; }
47 
50 
55  ScalarType& mean, ScalarType* variance = nullptr) const;
56 
58  CV_CORE_LIB_API virtual void computeMinAndMax();
59 
61  static inline bool ValidValue(ScalarType value) {
62  return std::isfinite(value);
63  }
64 
66  inline void flagValueAsInvalid(std::size_t index) { at(index) = NaN(); }
67 
69  CV_CORE_LIB_API std::size_t countValidValues() const;
70 
72  inline ScalarType getMin() const { return m_minVal; }
74  inline ScalarType getMax() const { return m_maxVal; }
75 
77  inline void fill(ScalarType fillValue = 0) {
78  if (empty())
79  resize(capacity(), fillValue);
80  else
81  std::fill(begin(), end(), fillValue);
82  }
83 
85  CV_CORE_LIB_API bool reserveSafe(std::size_t count);
87  CV_CORE_LIB_API bool resizeSafe(std::size_t count,
88  bool initNewElements = false,
89  ScalarType valueForNewElements = 0);
90 
91  // Shortcuts (for backward compatibility)
92  inline ScalarType& getValue(std::size_t index) { return at(index); }
93  inline const ScalarType& getValue(std::size_t index) const {
94  return at(index);
95  }
96  inline void setValue(std::size_t index, ScalarType value) {
97  at(index) = value;
98  }
99  inline void addElement(ScalarType value) { push_back(value); }
100  inline unsigned currentSize() const {
101  return static_cast<unsigned>(size());
102  }
103  inline void swap(std::size_t i1, std::size_t i2) {
104  std::swap(at(i1), at(i2));
105  }
106 
107 public: // methods
109 
111  CV_CORE_LIB_API ~ScalarField() override = default;
112 
113 protected: // members
115  char m_name[256];
116 
118  ScalarType m_minVal;
120  ScalarType m_maxVal;
121 };
122 
124  ScalarType minVal = 0.0f;
125  ScalarType maxVal = 0.0f;
126 
127  bool minMaxInitialized = false;
128  for (std::size_t i = 0; i < size(); ++i) {
129  const ScalarType& val = at(i);
130  if (ValidValue(val)) {
131  if (minMaxInitialized) {
132  if (val < minVal)
133  minVal = val;
134  else if (val > maxVal)
135  maxVal = val;
136  } else {
137  // first valid value is used to init min and max
138  minVal = maxVal = val;
139  minMaxInitialized = true;
140  }
141  }
142  }
143 
144  if (minMaxInitialized) {
145  m_minVal = minVal;
146  m_maxVal = maxVal;
147  } else // particular case: zero valid values
148  {
149  m_minVal = m_maxVal = 0;
150  }
151 }
152 
153 } // namespace cloudViewer
constexpr ScalarType NAN_VALUE
NaN as a ScalarType value.
Definition: CVConst.h:76
#define CV_CORE_LIB_API
Definition: CVCoreLibWin.h:15
int size
std::string name
int count
A simple scalar field (to be associated to a point cloud)
Definition: ScalarField.h:25
void fill(ScalarType fillValue=0)
Fills the array with a particular value.
Definition: ScalarField.h:77
virtual void computeMinAndMax()
Determines the min and max values.
Definition: ScalarField.h:123
ScalarType getMin() const
Returns the minimum value.
Definition: ScalarField.h:72
std::size_t countValidValues() const
Returns the number of valid values in this scalar field.
Definition: ScalarField.cpp:29
~ScalarField() override=default
Default destructor.
void addElement(ScalarType value)
Definition: ScalarField.h:99
static ScalarType NaN()
Returns the specific NaN value.
Definition: ScalarField.h:46
ScalarType & getValue(std::size_t index)
Definition: ScalarField.h:92
void computeMeanAndVariance(ScalarType &mean, ScalarType *variance=nullptr) const
Definition: ScalarField.cpp:41
void setValue(std::size_t index, ScalarType value)
Definition: ScalarField.h:96
void flagValueAsInvalid(std::size_t index)
Sets the value as 'invalid' (i.e. NAN_VALUE)
Definition: ScalarField.h:66
const char * getName() const
Returns scalar field name.
Definition: ScalarField.h:43
char m_name[256]
Scalar field name.
Definition: ScalarField.h:115
bool reserveSafe(std::size_t count)
Reserves memory (no exception thrown)
Definition: ScalarField.cpp:71
ScalarField(const char *name=nullptr)
Default constructor.
Definition: ScalarField.cpp:16
void setName(const char *name)
Sets scalar field name.
Definition: ScalarField.cpp:22
bool resizeSafe(std::size_t count, bool initNewElements=false, ScalarType valueForNewElements=0)
Resizes memory (no exception thrown)
Definition: ScalarField.cpp:81
ScalarType m_maxVal
Maximum value.
Definition: ScalarField.h:120
static bool ValidValue(ScalarType value)
Returns whether a scalar value is valid or not.
Definition: ScalarField.h:61
void swap(std::size_t i1, std::size_t i2)
Definition: ScalarField.h:103
unsigned currentSize() const
Definition: ScalarField.h:100
ScalarType m_minVal
Minimum value.
Definition: ScalarField.h:118
ScalarType getMax() const
Returns the maximum value.
Definition: ScalarField.h:74
const ScalarType & getValue(std::size_t index) const
Definition: ScalarField.h:93
Generic file read and write utility for python interface.
Rgb at(size_t color_id)
void swap(cloudViewer::core::SmallVectorImpl< T > &LHS, cloudViewer::core::SmallVectorImpl< T > &RHS)
Implement std::swap in terms of SmallVector swap.
Definition: SmallVector.h:1370