Files
q3DMASC/NeighborhoodFeature.h
T

184 lines
4.7 KiB
C++
Raw Normal View History

#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
{
//! Neighborhood-based feature
struct NeighborhoodFeature : public Feature
{
public: //NeighborhoodFeatureType
2018-12-01 22:40:04 +01:00
typedef QSharedPointer<NeighborhoodFeature> Shared;
enum NeighborhoodFeatureType
{
Invalid = 0
, PCA1
, PCA2
2019-03-22 14:50:45 +01:00
, PCA3
, SPHER
, LINEA
, PLANA
2019-03-29 21:36:35 +01:00
, Dip
, DipDir
, ROUGH
, NBPTS
, CURV
, ZRANGE
, Zmax
, Zmin
, ANISO
, FOM
2024-08-05 12:46:09 +02:00
, VERT
2018-12-02 19:32:47 +01:00
//, LINEF
//, ORIENF
};
static QString ToString(NeighborhoodFeatureType type)
{
switch (type)
{
case Invalid:
return "Invalid";
case PCA1:
return "PCA1";
case PCA2:
return "PCA2";
2019-03-22 14:50:45 +01:00
case PCA3:
return "PCA3";
case SPHER:
return "SPHER";
case LINEA:
return "LINEA";
case PLANA:
return "PLANA";
2019-03-29 21:36:35 +01:00
case Dip:
return "Dip";
case DipDir:
return "DipDir";
case ROUGH:
return "ROUGH";
case NBPTS:
return "NBPTS";
case CURV:
return "CURV";
case ZRANGE:
return "ZRANGE";
case Zmax:
return "Zmax";
case Zmin:
return "Zmin";
case ANISO:
return "ANISO";
case FOM:
return "FOM";
2024-08-05 12:46:09 +02:00
case VERT:
return "VERT";
2018-12-02 19:32:47 +01:00
//case LINEF:
// return "LINEF";
//case ORIENF:
// return "ORIENF";
default:
assert(false);
break;
}
return "Invalid";
}
static inline NeighborhoodFeatureType FromString(const QString& token) { return FromUpperString(token.toUpper()); }
static NeighborhoodFeatureType FromUpperString(const QString& token)
{
if (token == "PCA1")
return PCA1;
else if (token == "PCA2")
return PCA2;
2019-03-22 14:50:45 +01:00
else if (token == "PCA3")
return PCA3;
else if (token == "SPHER")
return SPHER;
else if (token == "LINEA")
return LINEA;
else if (token == "PLANA")
return PLANA;
2019-03-29 21:36:35 +01:00
else if (token == "DIP")
return Dip;
else if (token == "DIPDIR")
return DipDir;
else if (token == "ROUGH")
return ROUGH;
else if (token == "NBPTS")
return NBPTS;
else if (token == "CURV")
return CURV;
else if (token == "ZRANGE")
return ZRANGE;
else if (token == "ZMAX")
return Zmax;
else if (token == "ZMIN")
return Zmin;
else if (token == "ANISO")
return ANISO;
else if (token == "FOM")
return FOM;
2024-08-05 12:46:09 +02:00
else if (token == "VERT")
return VERT;
2018-12-02 19:32:47 +01:00
//else if (token == "LINEF")
// return LINEF;
//else if (token == "ORIENF")
// return ORIENF;
return Invalid;
}
public: //methods
//! Default constructor
NeighborhoodFeature(NeighborhoodFeatureType p_type)
: type(p_type)
2018-12-01 22:40:04 +01:00
, sf1(nullptr)
, sf2(nullptr)
{
}
2018-12-01 22:40:04 +01:00
//inherited from Feature
virtual Type getType() const override { return Type::NeighborhoodFeature; }
virtual Feature::Shared clone() const override { return Feature::Shared(new NeighborhoodFeature(*this)); }
2020-06-04 00:32:27 +02:00
virtual bool prepare(const CorePoints& corePoints, QString& error, CCCoreLib::GenericProgressCallback* progressCb = nullptr, SFCollector* generatedScalarFields = nullptr) override;
2018-12-01 22:40:04 +01:00
virtual bool finish(const CorePoints& corePoints, QString& error) override;
virtual bool checkValidity(QString corePointRole, QString &error) const override;
2018-12-01 22:40:04 +01:00
virtual QString toString() const override;
2018-12-15 20:40:58 +01:00
//! Compute the feature value on a set of points
2020-06-04 00:32:27 +02:00
bool computeValue(CCCoreLib::DgmOctree::NeighboursSet& pointsInNeighbourhood, const CCVector3& queryPoint, double& outputValue) const;
public: //members
//! Neighborhood feature type
/** \warning different from the feature type
**/
NeighborhoodFeatureType type;
2018-12-01 22:40:04 +01:00
//! Feature values
2020-06-04 00:32:27 +02:00
CCCoreLib::ScalarField *sf1, *sf2;
};
2023-05-29 12:45:02 +02:00
}