/** @(#) utilpos/coordinatepos.cpp */
// #include "coordinatepos.h"
/** @(#) coordinatepos.h */
#ifndef COORDINATEPOS_H
#define COORDINATEPOS_H
//----------------------------------------------------------------------------
#include <algorithm> // swap
#include <stdexcept> // runtime_exception
using namespace std;
/**
* Convierte coordenadas logicas(double) a graficas(int).
* @author Omar Posada Villarreal
* @version 1.0, 22/05/2002
*/
class CoordinatePos {
private:
/** Coordenadas logicas. */
double xMin, xMax, yMin, yMax;
/** Rango logico. */
double logicX, logicY;
/** Coordenadas graficas. */
int xMinG, xMaxG, yMinG, yMaxG;
/** Rango grafico. */
double graphX, graphY; //no int para ahorrar conversion de datos
/** Evita conversiones de tipo. */
double xMinGD, yMinGD; //no int para ahorrar conversion de datos
public:
// constructor, ~, friend-----------------------------------------------------
/** Construye. Valida rangos. */
CoordinatePos :: CoordinatePos(double theXMin, double theXMax,
double theYMin, double theYMax,
int theXMinG, int theXMaxG, int theYMinG, int theYMaxG) {
xMin = theXMin;
xMax = theXMax;
yMin = theYMin;
yMax = theYMax;
xMinG = theXMinG;
xMaxG = theXMaxG;
yMinG = theYMinG;
yMaxG = theYMaxG;
// Si rango invertido, revertirlo
if (xMin > xMax) {
swap(xMin, xMax);
}
if (yMin > yMax) {
swap(yMin, yMax);
}
if (xMinG > xMaxG) {
swap(xMinG, xMaxG);
}
if (yMinG > yMaxG) {
swap(yMinG, yMaxG);
}
logicX = xMax - xMin;
logicY = yMax - yMin;
graphX = static_cast<double>(xMaxG - xMinG + 1);
graphY = static_cast<double>(yMaxG - yMinG + 1);
xMinGD = static_cast<double>(xMinG);
yMinGD = static_cast<double>(yMinG);
}
/* Destructor predeterminado. */
/** Libera recursos. */
// operator-------------------------------------------------------------------
//----------------------------------------------------------------------------
/** Convierte una coordenada logica a una grafica. Trunca el resultado. */
inline int toGraphX(double x) {
return static_cast<int>
(xMinGD + graphX * (x - xMin) / logicX);
}
/** Convierte una coordenada logica a una grafica. Trunca el resultado.
* Recordar que Y logica "sube", mientras que Y grafica "baja".*/
inline int toGraphY(double y) {
return static_cast<int>
( yMinGD + graphY * ( 1.0 - ((y - yMin) / logicY) ) );
}
}; // class
//----------------------------------------------------------------------------
#endif
// Fin------------------------------------------------------------------------