00001 //* Módulo : xyax.h 00002 // _Desc_ : Declara classe XYAxis. 00003 // _Autores_ : Carlos Henrique Levy e Jaudênia Cavalcante. 00004 // _Data_ : 27 fev 96. 00005 00006 #ifndef __XYAXIS_H 00007 #define __XYAXIS_H 00008 00009 #include "xyobj.h" 00010 #include "xytext.h" 00011 #include "xymath.h" 00012 00013 class XYScaleDecorator; 00014 class XYGraph; 00015 00016 //* XYAxis 00017 // Classe abstrata que define as características de um eixo. Um eixo 00018 // representa a escala de um tipo de coordenada. A sua representação visual é 00019 // composta de uma linha reta podendo ter ou não terminador (seta), textos 00020 // próximo a reta indicando a escala e por último um título para o eixo. 00021 class XYAxis : public XYObject 00022 { 00023 public: 00024 00025 //* Construtores e Destrutor 00026 //* Construtor A 00027 XYAxis ( 00028 double mn, // valor mínimo que o eixo representa (assume) 00029 double mx, // valor máximo que o eixo representa (assume) 00030 XYCoordinate x, // referência para a coordenada x 00031 XYCoordinate y, // referência para a coordenada y 00032 long color, // cor do eixo 00033 double size, // tamanho normalizado do eixo 00034 double rot, // ângulo, em graus, no sentido anti-horário 00035 double step, // passo normalizado dos ticks da escala 00036 XYScaleDecorator* decor, // decorador da escala 00037 XYText* title, // texto a ser desenhado com o eixo 00038 xybool arrow = xytrue, // seta terminadora (xytrue or xyfalse) 00039 xybool visible = xytrue); // visibilidade 00040 00041 //* Construtor B 00042 XYAxis ( 00043 double mn, // valor mínimo que o eixo representa (assume) 00044 double mx, // valor máximo que o eixo representa (assume) 00045 XYCoordinate x, // referência para a coordenada x 00046 XYCoordinate y, // referência para a coordenada y 00047 long color, // cor do eixo 00048 double size, // tamanho normalizado do eixo 00049 double rot, // ângulo, em graus, no sentido anti-horário 00050 xybool arrow = xytrue, // seta terminadora (xytrue or xyfalse) 00051 xybool visible = xytrue); // visibilidade 00052 00053 //* Construtor C 00054 XYAxis ( 00055 double mn, // valor mínimo que o eixo representa (assume) 00056 double mx, // valor máximo que o eixo representa (assume) 00057 XYCoordinate x, // referência para a coordenada x 00058 XYCoordinate y, // referência para a coordenada y 00059 long color, // cor do eixo 00060 double size, // tamanho normalizado do eixo 00061 double rot, // ângulo, em graus, no sentido anti-horário 00062 double step, // passo normalizado dos ticks da escala 00063 xybool arrow = xytrue, // seta terminadora (xytrue or xyfalse) 00064 xybool visible = xytrue); // visibilidade 00065 00066 //* Destrutor da classe XYAxis 00067 virtual ~XYAxis (void) {}; 00068 00069 //* Mínimos/Máximos 00070 //* Calcula valores melhores para mínimos, máximos e passos dos eixos 00071 virtual void calcMinMax (double *min, double* max, double* step) const; 00072 00073 #ifdef min 00074 #undef min 00075 #endif 00076 //* Define valor mínimo que o eixo representa (assume) 00077 virtual void min (double m); 00078 //* Consulta valor mínimo que o eixo representa (assume) 00079 virtual double min (void) const; 00080 00081 #ifdef max 00082 #undef max 00083 #endif 00084 //* Define valor máximo que o eixo representa (assume) 00085 virtual void max (double m); 00086 //* Consulta valor máximo que o eixo representa (assume) 00087 virtual double max (void) const; 00088 00089 //* Método que calcula o valor mínimo do eixo quando um determinado valor sobre ele, anteriormente numa determinada posição, é deslocado para a nova posição (x0, y0) 00090 virtual double defineMinPoint(double value, int x0, int y0) const; 00091 00092 //* Método que calcula o valor máximo do eixo quando um determinado valor sobre ele, anteriormente numa determinada posição, é deslocado para a nova posição (x0, y0) 00093 virtual double defineMaxPoint(double value, int x0, int y0) const; 00094 00095 //* Define/Consulta atributos 00096 //* Define a cor do eixo 00097 virtual void color (long c); 00098 //* Consulta a cor do eixo 00099 virtual long color (void) const; 00100 00101 //* Define a posição de desenho do tick: xytrue (default) tick é desenhado a esquerda do eixo; xyfalse tick é desenhado a direita 00102 virtual void leftTick (xybool left); 00103 //* Retorna xytrue se tick é desenhado a esquerda do eixo, xyfalse a direita 00104 virtual xybool leftTick (void) const; 00105 00106 //* Define o tamanho do eixo entre [0.0, 1.0], onde 1.0 significa tamanho da área de visualização 00107 virtual void size (double sz); 00108 //* Consulta o tamanho do eixo entre [0.0, 1.0], onde 1.0 significa tamanho da área de visualização 00109 virtual double size (void) const; 00110 00111 //* Define a rotação do eixo 00112 virtual void rotation (double rot); 00113 //* Consulta a rotação do eixo 00114 virtual double rotation (void) const; 00115 00116 //* Define o valor normalizado do passo dos ticks da escala 00117 virtual void step (double s); 00118 //* Consulta o valor normalizado do passo dos ticks da escala 00119 virtual double step (void) const; 00120 00121 //* Define a posição de referência para o desenho dos ticks 00122 virtual void referenceTick (double f); 00123 //* Consulta a posição de referência para o desenho dos ticks 00124 virtual double referenceTick (void) const; 00125 00126 //* Consulta a primeira posição para desenho dos ticks da escala entre os valores mínimo e máximo que o eixo representa é o primeiro tick após o valor mínimo do eixo 00127 virtual double first (void) const; 00128 00129 //* Define o decorador da escala 00130 virtual void scaleDecorator(XYScaleDecorator* decor); 00131 //* Consulta o decorador da escala 00132 virtual XYScaleDecorator* scaleDecorator(void) const; 00133 00134 //* Define presença de seta terminadora 00135 virtual void arrow (xybool a); 00136 //* Consulta presença de seta terminadora 00137 virtual xybool arrow (void) const; 00138 00139 //* Define título de um eixo 00140 virtual void title (XYText* t); 00141 //* Consulta título de um eixo 00142 virtual XYText* title (void) const; 00143 00144 //* Ajusta tamanho do eixo para evitar erros na aplicação da função scroll, através do aumento ou redução no valor desse atributo de modo a permitir o casamento dos ticks sobre o eixo qualquer que seja o deslocamento definido pelo usuário para essa função 00145 virtual void adjustSize (void); 00146 00147 //* Retorna a coordenada do primeiro tick do eixo 00148 virtual void firstTick (double& tx1, double& ty1, double& tx2, double& ty2) const; 00149 00150 //* Acao realizado quando da insercao de uma mascara no grafico 00151 virtual void insertAction (XYGraph* /* graph */ ) {}; 00152 00153 //* Acao realizado quando da romcao de uma mascara no grafico 00154 virtual void removeAction (XYGraph* /* graph */ ) {}; 00155 00156 //* Métodos de Pick 00157 //* Retorna xytrue se o ponto estiver sobre o eixo 00158 virtual xybool pick (int px, int py); 00159 00160 //* Retorna xytrue se o eixo estiver interior a região de "fence" 00161 virtual xybool fence (int x0, int y0, int x1, int y1); 00162 00163 //* Axis Arrow 00164 //* Desenha seta do eixo 00165 virtual void drawArrow (double x0, double y0, double x1, double y1) const; 00166 00167 //* Retorna menor retângulo que contém a seta do eixo 00168 virtual void boxArrow(double x0, double y0, double x1, double y1, double& 00169 xmin, double& ymin, double& xmax, double& ymax) const; 00170 00171 //* Transformações 00172 //* Transforma coordenada de acordo com o tipo do eixo envolvido 00173 virtual double transform (double e) const; 00174 00175 //* Método que retorna o valor sobre o eixo no ponto dado 00176 virtual double valueInPoint(int x0, int y0) const; 00177 //* Método que retorna o valor sobre o eixo no ponto dado 00178 virtual double valueInPoint(double x0, double y0) const; 00179 //* Método que retorna o ponto sobre o eixo no valor dado 00180 virtual void pointInValue(double , int& , int&) const {}; 00181 //* Método que retorna o ponto sobre o eixo no valor dado 00182 virtual void pointInValue(double, double&, double&) const {}; 00183 00184 protected: 00185 00186 static const double _arrow_size; // tamanho da seta terminadora 00187 double _mn, _mx; // valores que o eixo representa (assume) 00188 long _color; // cor do eixo 00189 double _size; // tamanho do eixo, em coordenadas normalizadas 00190 double _rot; // ângulo do eixo, em graus, sentido anti-horário 00191 double _step; // passo dos ticks em coordendas normalizadas 00192 double _referenceTick; // posição de referência para desenho dos ticks 00193 XYScaleDecorator* _decor; // define o decorador da escala 00194 XYText* _title; // texto a ser desenhado com o eixo 00195 xybool _arrow; // indica se a seta deve ser desenhada 00196 xybool _leftTick; // indica se o tick e'desenhado a esq. (xytrue) ou a dir. (xyfalse) do eixo 00197 00198 }; 00199 00200 #endif 00201