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;
};
}
|