//////////////////////////////////////////////////////////////////////////////////// /// Fichier EIMBase.h /// //////////////////////////////////////////////////////////////////////////////////// #ifndef _EIMBase_h_ #define _EIMBase_h_ /*----------------------------------------------------------\ Includes \----------------------------------------------------------*/ #include "scale.h" #include "vector.h" #include "CEIMInfo.h" #include #include /*----------------------------------------------------------\ Constantes \----------------------------------------------------------*/ #define THICKNESS 300 // epaisseur sur laquelle le calcul est effectue //#define QI_MIN 60 #define QI_MIN 5 // Provisoire : pour tests EIM Live #define MAX_POINTS_EIM_AUTO 1024 /*----------------------------------------------------------\ Classes \----------------------------------------------------------*/ class CEIMResult; class ExtendedImage; class CEIMBase { private: enum enumDirection { enumUp, enumDown }; bool LookForFirstPoint (long &, long, long &, unsigned char*); bool LookForVariation (long &, char *, long, enumDirection, long &); bool AddVector (sParoi &); bool FindOpposite (sParoi &, sParoi &); void SetMiddlePoint (sSlope &, CVector &, bool reverseSlope=false); int MeasureLineBuffer (sParoi &, unsigned char*, char *, long); void ComputeEIM (CEIMInfo *); void Paroi (void); void Diameter(); void ParallelismeEIM(); void ParallelismeDistensibilite(); // élements liés à la mesure public: CEIMInfo *m_pMeasures; // pointeur sur mesures d'EIM. double m_coeff_a, m_coeff_b, m_coeff_c; // Coefficient pour la courbe approximée protected: CVector m_vUser; // vecteur parallèle à la paroi (normalement ...) ExtendedImage *m_image; double m_minx_curve; double m_max_curve; int m_nbpoints_curve; bool m_bNearWall; // Indique si la mesure est pour le Near Wall ou le FarWall int m_Max_Alignement; // Indique la longueur utilisé pour l'alignement int m_indexParoi; int m_diag; // Pour le diagnostic de l'arret de l'algorithme public: Point m_ptDebut; Point m_ptFin; protected: Point m_pt1perp[MAX_POINTS_EIM_AUTO], m_pt2perp[MAX_POINTS_EIM_AUTO]; Point m_perpap1, m_perpap2; std::vector m_arVariance, m_arVarianceINT, m_arVarianceAA, m_arVarianceII; unsigned int m_uErrorID; // ID de la chaîne à afficher en cas d'erreur public: unsigned char m_bDelta1, m_bDelta2; unsigned char m_bSeuil1; protected: unsigned char m_bBuffer [THICKNESS];// stockage d'une ligne/colonne char m_cOffsets [THICKNESS];// stockage de la variation de densite d'une ligne/colonne bool m_fDiameter; // type de la derniere mesure : diametre ou EIM static char Delta (unsigned char b1, unsigned char b2); virtual bool GfxImageValid() { return m_image != NULL; } public: bool m_Assist; // Horizontalisation automatique ou non! // Version de mesure de l'EIM qui améliore les résultats de l'EIM // Uniquement pour Tomtec pour la version 3.0 bool m_versionTomtecAout08; CEIMBase(void); virtual ~CEIMBase(void); virtual void Release(void); inline bool Valid(void) const { return (m_dwValidPoints ? true : false); }; bool Measure(ExtendedImage *, const Point &, const Point &, bool, CEIMResult *m_res = NULL); double Direction(); bool Update(CEIMResult *m_res = NULL); virtual unsigned char IQ(void) { assert (m_pMeasures && m_image); return (unsigned char )(100 * m_dblQI); } virtual void GraphMeanInit() { } virtual void GraphMeanAddMeasure( bool, double ) { } virtual void PrintDiameter() { } virtual void PrintErrorQIMin() { } virtual void PrintResult() { } virtual void SetEimAssisted(bool valide); // [JAK - 27/1/2003]Mesure de paroi assistée bool GetEimAssisted(); // [JAK - 27/1/2003] int CalculEimAutomatique(int mode, bool bActionDiametre, Point *ptClick0, Point *ptClick1, Point *ptLastClick, unsigned char *bClicks, ExtendedImage* img,bool *fBackToNone); int CalculEimAutomatique(int mode, bool bActionDiametre, Point *ptClick0, Point *ptClick1, Point *ptLastClick, unsigned char *bClicks, bool *fBackToNone); bool Measure(const Point &, const Point &, bool, CEIMResult *m_res = NULL); Point m_StartPoint; Point m_EndPoint; bool m_bDisplay; enum enumAlgo { algoProfile, algoSymmetry }; long m_dwPoints, // nombre total de points (d'éléments de m_pMeasures) m_dwValidPoints; // nombre de points ayant présenté le bon profil double m_dblEIMMax, m_dblEIMMean, m_dblEIMMin, // EIM //#ifdef VERSION_SHOW_VARIANCE // [JAK - 17/6/2002] m_dblVariance, // [JAK - 13/5/2002] //#endif m_dblINTMax, m_dblINTMean, m_dblINTMin, // Intima Max , Moyenne , et Min. m_dblEIMdMean, m_dblINTdMean, m_dblMEDdMean, // Media Max , m_dblDiaAAMax, m_dblDiaAAMean, m_dblDiaAAMin, // diamètre Adventice/Adventice Max , Moyen et Minimum m_dblDiaIIMax, m_dblDiaIIMean, m_dblDiaIIMin, // diamètres Intima/Intima Max , Moyen et Minimum m_dblDistance, m_dblQI,m_dblQIMean, m_dblIA, m_dblIAd; std::string m_strInfo; // chaîne de résultat enumAlgo m_algoDiameter; // méthode utilisé pour le diamètre double m_dblVarianceAA, m_dblVarianceII; bool m_parallelismeDiametre; //returns the last error generated. //Use CString.LoadString() to get the corresponding text unsigned int GetErrorID(void); virtual bool PointInBuffer(const Point& pt); virtual unsigned char GetIntensity(const Point& pt); }; #endif // EIMBASE_H__10EE0714_09E1_11D2_B0D4_00A024B882A7__INCLUDED_