| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187 |
- /*******************************************************************\
- Fichier : Scale.cpp
- Date : 28/04/98
- Version : 1.005
- Description : Gestion de l'échelle pixel <-> mètres
- |*******************************************************************|
- Bugs:
- Notes:
- m_dblHor et m_dblVer sont des membres publiques uniquement pour
- la sauvegarde et le rechargement depuis la base de registre.
- A améliorer...
- |*******************************************************************|
- Historique :
- 28/04/98 1.005 : Différentes fonctions de mesure ajoutées
- 27/06/97 1.000 : Première version
- \*******************************************************************/
- /*----------------------------------------------------------\
- Includes
- \----------------------------------------------------------*/
- #include "scale.h"
- CScale::CScale (std::string pszName, double dblHor, double dblVer, bool fOrthonorme)
- : m_strName (pszName),
- m_isDicom( false )
- {
- if (m_strName.length () == 0)
- m_strName = "Default";// [JAK - 17/6/2002]
- m_fOrthonorme = fOrthonorme;
- if ( !m_strName.compare( DICOM_SCALE_NAME ) )
- m_isDicom = true;
- Update (dblHor, dblVer);
- } // end of CScale
- void CScale::Update (double dblHor, double dblVer)
- {
- m_dblHor = dblHor;
- m_dblVer = dblVer;
- m_fVerOK = (m_dblVer != 0.0);
- m_fHorOK = (m_dblHor != 0.0);
- } // end of SetHorizontalScale
- //void CScale::Load (CRegister ®)
- //{
- // Update (reg.GetDouble ("Horizontal"), reg.GetDouble ("Vertical"));
- //} // fin de Load
- //void CScale::Save (CRegister ®)
- //{
- // m_dblHor = m_dblHor * 1000000;
- // m_dblHor = floor(m_dblHor);
- // m_dblHor = m_dblHor/1000000;
- //
- // m_dblVer = m_dblVer * 1000000;
- // m_dblVer = floor(m_dblVer);
- // m_dblVer = m_dblVer/1000000;
- // reg.SetDouble ("Horizontal", m_dblHor);
- // reg.SetDouble ("Vertical", m_dblVer);
- //} // fin de Save
- /*----------------------------------------------------------\
- | SetxxxScale |
- |-----------------------------------------------------------|
- | DESCRIPTION : |
- | Détermine les échelles horizontales et verticales |
- |-----------------------------------------------------------|
- | PARAMETRES : |
- | dblReal : taille réelle de la distance mesurée |
- | vScale : vecteur servant à la définition de l'echelle |
- \----------------------------------------------------------*/
- void CScale::SetScale (double dblReal, const CVector &vScale)
- {
- SetScale (dblReal, vScale.Norm ());
- } // fin de SetScale
- void CScale::SetScale (double dblReal, double dblNorm)
- {
- double dblEchelle;
- assert (m_fOrthonorme);
- if (dblNorm)
- {
- dblEchelle = dblReal / fabs (dblNorm);
-
- dblEchelle = dblEchelle * 1000000; //recherche de la précision exp -6
- dblEchelle = floor(dblEchelle);
- dblEchelle = dblEchelle/1000000;
- m_dblHor = m_dblVer = dblEchelle;
- m_fVerOK =
- m_fHorOK = true;
- }
- } // fin de SetScale
- void CScale::SetScaleLire (double dblEchelle, double i)
- {
- assert (m_fOrthonorme);
-
- dblEchelle = dblEchelle * 1000000;
- dblEchelle = floor(dblEchelle);
- dblEchelle = dblEchelle/1000000;
-
- i = i / 1000000;
- dblEchelle = dblEchelle + i;
- m_dblVer = dblEchelle;// - reste;
- m_dblHor = m_dblVer;
- m_fVerOK = m_fHorOK = true;
- } // fin de SetScaleLire
- void CScale::SetHorizontalScale (double dblReal, const CVector &vScale)
- {
- assert (vScale.StartPoint ().y == vScale.EndPoint ().y);
- if (vScale.Norm ())
- {
- m_dblHor = dblReal / fabs (vScale.Norm ());
- m_fHorOK = (m_dblHor != 0.0);
- if (m_fOrthonorme)
- {
- m_dblVer = m_dblHor;
- m_fVerOK = m_fHorOK;
- }
- }
- } // end of SetHorizontalScale
- void CScale::SetVerticalScale (double dblReal, const CVector &vScale)
- {
- assert (vScale.StartPoint ().x == vScale.EndPoint ().x);
- if (vScale.Norm ())
- {
- m_dblVer = dblReal / fabs (vScale.Norm ());
- m_fVerOK = (m_dblVer != 0.0);
- if (m_fOrthonorme)
- {
- m_dblHor = m_dblVer;
- m_fHorOK = m_fVerOK;
- }
- }
- } // end of SetVerticalScale
- double CScale::Surface (double dblX, double dblY) const
- {
- // si l'une des direction n'est pas calibrée, on utilise
- // les valeurs de l'autre direction
- if (m_fHorOK) dblX = DistanceX (dblX);
- else dblX = DistanceY (dblX);
- if (m_fVerOK) dblY = DistanceY (dblY);
- else dblY = DistanceX (dblY);
- return (dblX * dblY);
- } // fin de Surface
- double CScale::Surface (double dblSurface) const
- {
- assert (Valid ());
- // si l'une des direction n'est pas calibrée, on utilise
- // les valeurs de l'autre direction
- if (m_fHorOK)
- {
- if (m_fVerOK)
- return (dblSurface * m_dblVer * m_dblHor);
- else
- return (dblSurface * m_dblHor * m_dblHor);
- }
- else
- return (dblSurface * m_dblVer * m_dblVer);
- } // fin de Surface
- double CScale::Distance (const Point &pt1, const Point &pt2) const
- {
- double dblX, dblY;
- // si l'une des direction n'est pas calibrée, on utilise
- // les valeurs de l'autre direction
- if (m_fHorOK) dblX = DistanceX (pt2.x - pt1.x);
- else dblX = DistanceY (pt2.x - pt1.x);
- if (m_fVerOK) dblY = DistanceY (pt2.y - pt1.y);
- else dblY = DistanceX (pt2.y - pt1.y);
- return (sqrt (dblX * dblX + dblY * dblY));
- } // fin de Distance
|