From dcafc1bdcaafd036f5d5f857b66eb911153ff42b Mon Sep 17 00:00:00 2001 From: Guillaume Borrut <guillaume.borrut@c-s.fr> Date: Thu, 29 Jan 2009 18:30:51 +0100 Subject: [PATCH] BUG : SpectralAngleFunctor, arcos(x) gives us a nan value if x>1 --- .../otbSpectralAngleFunctor.h | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/Code/FeatureExtraction/otbSpectralAngleFunctor.h b/Code/FeatureExtraction/otbSpectralAngleFunctor.h index 5b724980f4..a234f6e710 100644 --- a/Code/FeatureExtraction/otbSpectralAngleFunctor.h +++ b/Code/FeatureExtraction/otbSpectralAngleFunctor.h @@ -40,28 +40,29 @@ class SpectralAngleFunctor ~SpectralAngleFunctor(){}; inline TOutputValue operator()(const TInput& inPix) { - TOutputValue out; + TOutputValue out; double dist=0.0; double scalarProd=0.0; double normProd=0.0; double normProd1=0.0; + double sqrtNormProd = 0.0; for (unsigned int i=0; i<std::min(inPix.Size(),m_ReferencePixel.Size()); i++) - { - scalarProd += inPix[i]*m_ReferencePixel[i]; - normProd1 += inPix[i]*inPix[i]; - } + { + scalarProd += inPix[i]*m_ReferencePixel[i]; + normProd1 += inPix[i]*inPix[i]; + } normProd = normProd1 * m_RefNorm*m_RefNorm; - - if ( normProd == 0.0) - { - dist = 0.0; - } + sqrtNormProd = vcl_sqrt(normProd); + if ( (sqrtNormProd == 0.0) || ( scalarProd / sqrtNormProd > 1) ) + { + dist = 0.0; + } else - { - dist = vcl_acos(scalarProd/vcl_sqrt(normProd)); - } - + { + dist = vcl_acos(scalarProd/sqrtNormProd); + } + out = static_cast<TOutputValue>(dist); return out; -- GitLab