#ifndef _OTB_TRISKELE_MOI_ATTRIBUTES_TPP #define _OTB_TRISKELE_MOI_ATTRIBUTES_TPP using namespace boost::chrono; inline MoIAttributes::MoIAttributes (const Tree &tree, const AreaAttributes &areaAttributes, const XYAttributes &xyAttributes) : CompAttribute (tree) { compute (areaAttributes, xyAttributes); } inline MoIAttributes::~MoIAttributes () { } template inline void MoIAttributes::cut (vector > &allBands, const AttributeProfiles &attributeProfiles, const vector &thresholds) const { DEF_LOG ("MoIAttributes::cut", "thresholds:" << thresholds.size ()); if (!thresholds.size ()) return; auto start = high_resolution_clock::now (); double maxValue = CompAttribute::getMaxValue (); cerr << "moi max value:" << maxValue << endl; CompAttribute::cut (allBands, attributeProfiles, 0, CompAttribute::getScaledThresholds (thresholds, maxValue)); globalTreeStats.addTime (filteringStats, duration_cast > (high_resolution_clock::now ()-start).count ()); } inline void MoIAttributes::compute (const AreaAttributes &areaAttributes, const XYAttributes &xyAttributes) { auto start = high_resolution_clock::now (); const AverageXY *xy = xyAttributes.getValues (); const DimImg *areas = areaAttributes.getValues (); computeSameCompLevel ([this, &xy, &areas] (const DimImg &parentId) { double tmpMoI = 0.; const double xa = xy[parentId].x; const double ya = xy[parentId].y; tree.forEachChildTI (parentId, [this, &tmpMoI, &xa, &ya, &xy, &areas, &parentId] (const bool &isLeaf, const DimImg &childId) { if (isLeaf) return; const double dx = xy[childId].x - xa; const double dy = xy[childId].y - ya; tmpMoI += (dx*dx+dy*dy)*areas[childId]; }); const double card = areas[parentId]; CompAttribute::values[parentId] = tmpMoI/(card*card); }); globalTreeStats.addTime (moiStats, duration_cast > (high_resolution_clock::now ()-start).count ()); } #endif // _OTB_TRISKELE_MOI_ATTRIBUTES_TPP