scale.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*******************************************************************\
  2. Fichier : Scale.cpp
  3. Date : 28/04/98
  4. Version : 1.005
  5. Description : Gestion de l'échelle pixel <-> mètres
  6. |*******************************************************************|
  7. Bugs:
  8. Notes:
  9. m_dblHor et m_dblVer sont des membres publiques uniquement pour
  10. la sauvegarde et le rechargement depuis la base de registre.
  11. A améliorer...
  12. |*******************************************************************|
  13. Historique :
  14. 28/04/98 1.005 : Différentes fonctions de mesure ajoutées
  15. 27/06/97 1.000 : Première version
  16. \*******************************************************************/
  17. /*----------------------------------------------------------\
  18. Includes
  19. \----------------------------------------------------------*/
  20. #include "scale.h"
  21. CScale::CScale (std::string pszName, double dblHor, double dblVer, bool fOrthonorme)
  22. : m_strName (pszName),
  23. m_isDicom( false )
  24. {
  25. if (m_strName.length () == 0)
  26. m_strName = "Default";// [JAK - 17/6/2002]
  27. m_fOrthonorme = fOrthonorme;
  28. if ( !m_strName.compare( DICOM_SCALE_NAME ) )
  29. m_isDicom = true;
  30. Update (dblHor, dblVer);
  31. } // end of CScale
  32. void CScale::Update (double dblHor, double dblVer)
  33. {
  34. m_dblHor = dblHor;
  35. m_dblVer = dblVer;
  36. m_fVerOK = (m_dblVer != 0.0);
  37. m_fHorOK = (m_dblHor != 0.0);
  38. } // end of SetHorizontalScale
  39. //void CScale::Load (CRegister &reg)
  40. //{
  41. // Update (reg.GetDouble ("Horizontal"), reg.GetDouble ("Vertical"));
  42. //} // fin de Load
  43. //void CScale::Save (CRegister &reg)
  44. //{
  45. // m_dblHor = m_dblHor * 1000000;
  46. // m_dblHor = floor(m_dblHor);
  47. // m_dblHor = m_dblHor/1000000;
  48. //
  49. // m_dblVer = m_dblVer * 1000000;
  50. // m_dblVer = floor(m_dblVer);
  51. // m_dblVer = m_dblVer/1000000;
  52. // reg.SetDouble ("Horizontal", m_dblHor);
  53. // reg.SetDouble ("Vertical", m_dblVer);
  54. //} // fin de Save
  55. /*----------------------------------------------------------\
  56. | SetxxxScale |
  57. |-----------------------------------------------------------|
  58. | DESCRIPTION : |
  59. | Détermine les échelles horizontales et verticales |
  60. |-----------------------------------------------------------|
  61. | PARAMETRES : |
  62. | dblReal : taille réelle de la distance mesurée |
  63. | vScale : vecteur servant à la définition de l'echelle |
  64. \----------------------------------------------------------*/
  65. void CScale::SetScale (double dblReal, const CVector &vScale)
  66. {
  67. SetScale (dblReal, vScale.Norm ());
  68. } // fin de SetScale
  69. void CScale::SetScale (double dblReal, double dblNorm)
  70. {
  71. double dblEchelle;
  72. assert (m_fOrthonorme);
  73. if (dblNorm)
  74. {
  75. dblEchelle = dblReal / fabs (dblNorm);
  76. dblEchelle = dblEchelle * 1000000; //recherche de la précision exp -6
  77. dblEchelle = floor(dblEchelle);
  78. dblEchelle = dblEchelle/1000000;
  79. m_dblHor = m_dblVer = dblEchelle;
  80. m_fVerOK =
  81. m_fHorOK = true;
  82. }
  83. } // fin de SetScale
  84. void CScale::SetScaleLire (double dblEchelle, double i)
  85. {
  86. assert (m_fOrthonorme);
  87. dblEchelle = dblEchelle * 1000000;
  88. dblEchelle = floor(dblEchelle);
  89. dblEchelle = dblEchelle/1000000;
  90. i = i / 1000000;
  91. dblEchelle = dblEchelle + i;
  92. m_dblVer = dblEchelle;// - reste;
  93. m_dblHor = m_dblVer;
  94. m_fVerOK = m_fHorOK = true;
  95. } // fin de SetScaleLire
  96. void CScale::SetHorizontalScale (double dblReal, const CVector &vScale)
  97. {
  98. assert (vScale.StartPoint ().y == vScale.EndPoint ().y);
  99. if (vScale.Norm ())
  100. {
  101. m_dblHor = dblReal / fabs (vScale.Norm ());
  102. m_fHorOK = (m_dblHor != 0.0);
  103. if (m_fOrthonorme)
  104. {
  105. m_dblVer = m_dblHor;
  106. m_fVerOK = m_fHorOK;
  107. }
  108. }
  109. } // end of SetHorizontalScale
  110. void CScale::SetVerticalScale (double dblReal, const CVector &vScale)
  111. {
  112. assert (vScale.StartPoint ().x == vScale.EndPoint ().x);
  113. if (vScale.Norm ())
  114. {
  115. m_dblVer = dblReal / fabs (vScale.Norm ());
  116. m_fVerOK = (m_dblVer != 0.0);
  117. if (m_fOrthonorme)
  118. {
  119. m_dblHor = m_dblVer;
  120. m_fHorOK = m_fVerOK;
  121. }
  122. }
  123. } // end of SetVerticalScale
  124. double CScale::Surface (double dblX, double dblY) const
  125. {
  126. // si l'une des direction n'est pas calibrée, on utilise
  127. // les valeurs de l'autre direction
  128. if (m_fHorOK) dblX = DistanceX (dblX);
  129. else dblX = DistanceY (dblX);
  130. if (m_fVerOK) dblY = DistanceY (dblY);
  131. else dblY = DistanceX (dblY);
  132. return (dblX * dblY);
  133. } // fin de Surface
  134. double CScale::Surface (double dblSurface) const
  135. {
  136. assert (Valid ());
  137. // si l'une des direction n'est pas calibrée, on utilise
  138. // les valeurs de l'autre direction
  139. if (m_fHorOK)
  140. {
  141. if (m_fVerOK)
  142. return (dblSurface * m_dblVer * m_dblHor);
  143. else
  144. return (dblSurface * m_dblHor * m_dblHor);
  145. }
  146. else
  147. return (dblSurface * m_dblVer * m_dblVer);
  148. } // fin de Surface
  149. double CScale::Distance (const Point &pt1, const Point &pt2) const
  150. {
  151. double dblX, dblY;
  152. // si l'une des direction n'est pas calibrée, on utilise
  153. // les valeurs de l'autre direction
  154. if (m_fHorOK) dblX = DistanceX (pt2.x - pt1.x);
  155. else dblX = DistanceY (pt2.x - pt1.x);
  156. if (m_fVerOK) dblY = DistanceY (pt2.y - pt1.y);
  157. else dblY = DistanceX (pt2.y - pt1.y);
  158. return (sqrt (dblX * dblX + dblY * dblY));
  159. } // fin de Distance