00001 #ifndef Impala_Visualisation_Plot_Line_h
00002 #define Impala_Visualisation_Plot_Line_h
00003
00004 #include "Visualization/Plot/Plottable.h"
00005
00006 namespace Impala
00007 {
00008 namespace Visualization
00009 {
00010 namespace Plot
00011 {
00012
00013
00014 class Line : public Plottable
00015 {
00016 public:
00017 typedef Core::Array::Array2dScalarReal64 Array2dScalarReal64;
00018
00019 Line(double z, bool normalize = false)
00020 {
00021 mData = 0;
00022 SetDimensionsZ(z,z);
00023 SetDomain();
00024 mNormalize = normalize;
00025 }
00026
00027 virtual void
00028 Draw(Plot* plot)
00029 {
00030 if (!mData || mDataLength < 2)
00031 return;
00032
00033 glColor3f(mRed, mGreen, mBlue);
00034
00035 glPushMatrix();
00036 double dx = (mMaxX - mMinX) / ((double)mDataLength-1.0);
00037 if(mNormalize)
00038 {
00039 glScaled(1, 1./dx, 1);
00040 }
00041
00042 glBegin(GL_LINE_STRIP);
00043 double x = mMinX;
00044 for (int i=0 ; i<mDataLength ; i++)
00045 {
00046 glVertex3d(x, mData[i], mMinZ);
00047 x += dx;
00048 }
00049 glEnd();
00050 glPopMatrix();
00051 }
00052
00053 void SetData(Array2dScalarReal64* data, int dataLine)
00054 {
00055 SetData(data->CPB(0, dataLine), data->W());
00056 }
00057
00058 void SetData(Array2dScalarReal64* data)
00059 {
00060 SetData(data->CPB(0, 0), data->W());
00061 }
00062
00063 void SetData(double* data, int dataLength)
00064 {
00065 mData = data;
00066 mDataLength = dataLength;
00067 UpdateDimensionsY();
00068 }
00069
00070 void
00071 SetDomain(double begin=-1, double end=1)
00072 {
00073 SetDimensionsX(begin, end);
00074 }
00075
00076 void
00077 UpdateDimensionsY()
00078 {
00079
00080 double min, max;
00081 min = max = mData[0];
00082 for (int i=1 ; i<mDataLength ; i++)
00083 {
00084 if (mData[i] < min)
00085 min = mData[i];
00086 if (mData[i] > max)
00087 max = mData[i];
00088 }
00089 SetDimensionsY(min, max);
00090 }
00091
00092 virtual bool
00093 GetDimensionsY(double& min, double& max)
00094 {
00095 double dx = 1.;
00096 if(mNormalize && mData)
00097 {
00098 dx = ((double)mDataLength-1.0)/(mMaxX - mMinX);
00099 }
00100 min = mMinY * dx;
00101 max = mMaxY * dx;
00102 return mMinY != mMaxY;
00103 }
00104
00105 protected:
00106 double* mData;
00107 int mDataLength;
00108 int mDataLine;
00109 double mZ;
00110 bool mNormalize;
00111 };
00112
00113 }
00114 }
00115 }
00116
00117 #endif Impala_Visualisation_Plot_Line_h