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)
94 score +=
weigh(m_shape->Distance(pc[(*m_indices)[i]].pos), epsilon);
102 size_t oldSize = m_indices->size();
103 size_t connectedSize =
104 m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices,
true, borderRatio);
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())
120 size_t size = std::min(m_indices->size(), (
size_t)9);
121 for (
size_t i = 0; i < size; ++i)
123 std::pair<float, float> dn;
125 c.m_shape->DistanceAndNormalDeviation(
126 pc[m_indices->at(idx)].pos, pc[m_indices->at(idx)].normal, &dn);
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;
138 m_shape->DistanceAndNormalDeviation(
139 pc[
c.m_indices->at(idx)].pos, pc[
c.m_indices->at(idx)].normal, &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)
162 abs(m_shape->
NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal));
165 expectancy /=
static_cast<float>(m_indices->size());
168 for (
int i = 0; i < m_indices->size(); ++i)
171 abs(m_shape->NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal)) -
173 variance += dev * dev;
176 variance /=
static_cast<float>(m_indices->size());
187Candidate::GetPseudoVariance(
const PointCloud& pc)
189 float variance = 0.0f;
192 for (
int i = 0; i < m_indices->size(); ++i)
194 dev =
abs(m_shape->NormalDeviation(pc[(*m_indices)[i]].pos, pc[(*m_indices)[i]].normal)) -
196 variance += dev * dev;
198 variance /=
static_cast<float>(m_indices->size());
204Candidate::GetScore(
const PointCloud& pc,
float bitmapEpsilon,
bool doFiltering)
206 GetScoreMaxCCSize(pc, bitmapEpsilon, doFiltering);
210Candidate::GetScoreMaxCCSize(
const PointCloud& pc,
float bitmapEpsilon,
bool doFiltering)
212 size_t connectedSize = m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices, doFiltering);
213 m_indices->resize(connectedSize);
215 m_score = connectedSize;
219Candidate::GetScoreMaxCCMinBorder(
const PointCloud& pc,
float bitmapEpsilon,
bool doFiltering)
222 size_t connectedSize =
223 m_shape->ConnectedComponent(pc, bitmapEpsilon, m_indices, doFiltering, &borderRatio);
224 m_indices->resize(connectedSize);
226 m_score = connectedSize * size_t((1.0f - borderRatio) * (1.0f - GetVariance(pc)));
float weigh(const float d, const float eps)
bool IsEquivalent(const Candidate &c, const PointCloud &pc, float epsilon, float normalThresh) const
void Reindex(const MiscLib::Vector< int > &newIndices, int minInvalidIndex, size_t mergedSubsets, const MiscLib::Vector< size_t > &subsetSizes, const PointCloud &pc, size_t currentSize, float epsilon, float normalThresh, float bitmapEpsilon)
void ConnectedComponent(const PointCloud &pc, float bitmapEpsilon, float *borderRatio=0)
float WeightedScore(const PointCloud &pc, float epsilon, float normalThresh) const
PrimtiveShape is a shape primitive in conjunction with a parametrization.
virtual float NormalDeviation(const Vec3f &p, const Vec3f &n) const =0
std::vector< T > abs(const std::vector< T > &v)