4 m_subset(0), m_lowerBound(0), m_upperBound(0), m_level(0), m_hasConnectedComponent(false)
14 m_hasConnectedComponent(false)
25 m_hasConnectedComponent =
false;
41 for (; i < m_indices->
size(); ++i)
42 if (newIndices[(*m_indices)[i]] < minInvalidIndex)
44 (*m_indices)[j++] = newIndices[(*m_indices)[i]];
46 if (m_subset <= mergedSubsets)
48 m_hasConnectedComponent =
false;
59 m_subset -= mergedSubsets;
60 if (m_subset >= subsetSizes.
size())
66 size_t sampledPoints = 0, endi =
std::min(m_subset, subsetSizes.
size());
68 for (i = 0; i < endi; ++i)
70 sampledPoints += subsetSizes[i];
73 GetBounds(sampledPoints, currentSize);
79 size_t reindexSize = reindex.
size();
80 for (
size_t i = 0; i < m_indices->
size(); ++i)
81 if (m_indices->
at(i) < reindexSize)
83 m_indices->
at(i) = reindex[m_indices->
at(i)];
91 #pragma omp parallel for schedule(static) reduction(+ : score)
92 for (intptr_t i = 0; i < (intptr_t)m_indices->
size(); ++i)
102 size_t oldSize = m_indices->
size();
103 size_t connectedSize =
105 m_indices->
resize(connectedSize);
106 m_lowerBound = m_upperBound = (
float)m_indices->
size();
113 float normalThresh)
const
115 if (m_shape->
Identifier() !=
c.m_shape->Identifier())
121 for (
size_t i = 0; i < size; ++i)
123 std::pair<float, float> dn;
125 c.m_shape->DistanceAndNormalDeviation(
127 if (dn.first < epsilon &&
abs(dn.second) > normalThresh)
132 size_t tested = size;
133 size =
std::min(
c.m_indices->size(), (
size_t)9);
134 for (
size_t i = 0; i < size; ++i)
136 std::pair<float, float> dn;
140 if (dn.first < epsilon &&
abs(dn.second) > normalThresh)
146 return correct >= 2 * tested / 3;
152 float variance = 0.0f;
155 if (m_indices->
size() > 0)
158 float expectancy = 0.0f;
159 for (
int i = 0; i < m_indices->
size(); ++i)
165 expectancy /=
static_cast<float>(m_indices->
size());
168 for (
int i = 0; i < m_indices->
size(); ++i)
173 variance += dev * dev;
176 variance /=
static_cast<float>(m_indices->
size());
189 float variance = 0.0f;
192 for (
int i = 0; i < m_indices->
size(); ++i)
196 variance += dev * dev;
198 variance /=
static_cast<float>(m_indices->
size());
204 Candidate::GetScore(
const PointCloud&
pc,
float bitmapEpsilon,
bool doFiltering)
206 GetScoreMaxCCSize(
pc, bitmapEpsilon, doFiltering);
210 Candidate::GetScoreMaxCCSize(
const PointCloud&
pc,
float bitmapEpsilon,
bool doFiltering)
213 m_indices->
resize(connectedSize);
215 m_score = connectedSize;
219 Candidate::GetScoreMaxCCMinBorder(
const PointCloud&
pc,
float bitmapEpsilon,
bool doFiltering)
222 size_t connectedSize =
224 m_indices->
resize(connectedSize);
226 m_score = connectedSize * size_t((1.0f - borderRatio) * (1.0f - GetVariance(
pc)));