forked from dgirardeau/q3DMASC
/
ContextBasedFeature.h
107 lines (92 loc) · 3.44 KB
/
ContextBasedFeature.h
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
#pragma once
//##########################################################################
//# #
//# CLOUDCOMPARE PLUGIN: q3DMASC #
//# #
//# This program is free software; you can redistribute it and/or modify #
//# it under the terms of the GNU General Public License as published by #
//# the Free Software Foundation; version 2 or later of the License. #
//# #
//# This program is distributed in the hope that it will be useful, #
//# but WITHOUT ANY WARRANTY; without even the implied warranty of #
//# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
//# GNU General Public License for more details. #
//# #
//# COPYRIGHT: Dimitri Lague / CNRS / UEB #
//# #
//##########################################################################
//Local
#include "FeaturesInterface.h"
namespace masc
{
//! Context-based feature
struct ContextBasedFeature : public Feature
{
public: //ContextBasedFeatureType
typedef QSharedPointer<ContextBasedFeature> Shared;
enum ContextBasedFeatureType
{
Invalid = 0
, DZ
, DH
};
static QString ToString(ContextBasedFeatureType type)
{
switch (type)
{
case Invalid:
return "Invalid";
case DZ:
return "DZ";
case DH:
return "DH";
default:
assert(false);
break;
}
return "Invalid";
}
static inline ContextBasedFeatureType FromString(const QString& token) { return FromUpperString(token.toUpper()); }
static ContextBasedFeatureType FromUpperString(const QString& token)
{
if (token.startsWith("DZ"))
return DZ;
else if (token.startsWith("DH"))
return DH;
return Invalid;
}
public: //methods
//! Default constructor
ContextBasedFeature(ContextBasedFeatureType p_type,
int p_kNN = 1,
double p_scale = std::numeric_limits<double>::quiet_NaN(),
int p_ctxClassLabel = 0)
: type(p_type)
, kNN(p_kNN)
, ctxClassLabel(p_ctxClassLabel)
, sf(nullptr)
{
scale = p_scale;
}
//inherited from Feature
virtual Type getType() const override { return Type::ContextBasedFeature; }
virtual Feature::Shared clone() const override { return Feature::Shared(new ContextBasedFeature(*this)); }
virtual bool prepare(const CorePoints& corePoints, QString& error, CCCoreLib::GenericProgressCallback* progressCb = nullptr, SFCollector* generatedScalarFields = nullptr) override;
virtual bool finish(const CorePoints& corePoints, QString& error) override;
virtual bool checkValidity(QString corePointRole, QString &error) const override;
virtual QString toString() const override;
//! Compute the feature value on a set of points
bool computeValue(CCCoreLib::DgmOctree::NeighboursSet& pointsInNeighbourhood, const CCVector3& queryPoint, ScalarType& outputValue) const;
public: //members
//! Neighborhood feature type
/** \warning different from the feature type
**/
ContextBasedFeatureType type;
//Number of neighbors
int kNN;
//! Context class (label)
int ctxClassLabel;
//! The computed scalar
CCCoreLib::ScalarField* sf;
};
}