#include "stdafx.h"
#include "PGL/PGLMapZ.h"
#include "PGL/PGLMapZPropPage.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
IMPLEMENT_SERIAL(CPGLMapZ, CPGLMap,1);
void CPGLMapZ::Serialize(CArchive &archive)
{
int i;
CPGLMap::Serialize( archive );
int iCMap;
if( archive.IsStoring() )
{
iCMap=(int)m_eCMap;
archive << iCMap;
archive <<m_dMin << m_dMax;
for (i=0;i<m_iNx*m_iNy;i++)
{
archive << m_pZ[i];
}
}
else
{
if (m_pZ)
delete[] m_pZ;
m_pZ=new double[m_iNx*m_iNy];
archive>>iCMap;
archive>>m_dMin >> m_dMax;
m_eCMap=(PGL_COLORMAP)iCMap;
for (i=0;i<m_iNx*m_iNy;i++)
{
archive >> m_pZ[i];
}
}
}
#ifdef _DEBUG
void CPGLMapZ::Dump( CDumpContext& dc ) const
{
CPGLMap::Dump( dc );
dc << _T("CPGLMapZ ID ") << GetID() << endl;
}
void CPGLMapZ::AssertValid() const
{
CPGLMap::AssertValid();
}
#endif
CPGLMapZ::CPGLMapZ()
: CPGLMap()
{
m_pZ=NULL;
m_eCMap=pglCmHsv;
m_dMin=0;
m_dMax=1;
LoadBitmap(IDB_PGL_MAPZ_BITMAP);
}
CPGLMapZ::CPGLMapZ(const CPGLMapZ &l)
: CPGLMap(l)
{
m_eCMap=l.m_eCMap;
m_dMin=l.m_dMin;
m_dMax=l.m_dMax;
m_pZ=new double[m_iNx*m_iNy];
for (int i=0;i<m_iNx*m_iNy;i++)
{
m_pZ[i]=l.m_pZ[i];
}
LoadBitmap(IDB_PGL_MAPZ_BITMAP);
}
CPGLMapZ& CPGLMapZ::operator = (const CPGLMapZ& l)
{
if (&l != this)
{
this->CPGLMap::operator=(l);
m_eCMap=l.m_eCMap;
m_dMin=l.m_dMin;
m_dMax=l.m_dMax;
if (m_pZ)
delete[] m_pZ;
m_pZ=new double[m_iNx*m_iNy];
for (int i=0;i<m_iNx*m_iNy;i++)
{
m_pZ[i]=l.m_pZ[i];
}
}
return *this;
}
CPGLMapZ::~CPGLMapZ()
{
if (m_pZ)
delete[] m_pZ;
};
void CPGLMapZ::AddContextMenuItems(CMenu* pMenu)
{
ASSERT_VALID(pMenu);
CPGLMap::AddContextMenuItems(pMenu);
}
void CPGLMapZ::AddPropertyPage(CPropertySheet* pPropSheet)
{
ASSERT_VALID(pPropSheet);
CPGLMapZPropPage* propPage=new CPGLMapZPropPage(this);
pPropSheet->AddPage(propPage);
CPGLMap::AddPropertyPage(pPropSheet);
}
void CPGLMapZ::PlotGfx(gfxinterface::CGfxInterface& gfx)
{
if (!IsVisible())
return;
int i,j,k;
double xCur,yCur;
double alpha;
CPGLColor col;
CPGLMap::PlotGfx(gfx);
gfx.AddComment("--- CPGLMapZ ---");
double* pColor = new double[3*m_iNx*m_iNy];
ASSERT(pColor);
yCur=m_dY0+(m_iNy-1)*m_dDy;
k=0;
for (i=0;i<m_iNy;i++)
{
xCur=m_dX0;
for (j=0;j<m_iNx;j++)
{
alpha=(m_pZ[i*m_iNx+j]-m_dMin)/(m_dMax-m_dMin);
CPGLUtility::ColorMap(m_eCMap,alpha,col);
pColor[3*k]=col.GetRed();
pColor[3*k+1]=col.GetGreen();
pColor[3*k+2]=col.GetBlue();
xCur+=m_dDx;
k++;
}
yCur-=m_dDy;
}
gfx.DrawSurf(m_iNx, m_iNy, m_dX0, m_dY0, m_dDx, m_dDy, pColor);
delete[] pColor;
}
void CPGLMapZ::SetDatas(double *pZ)
{
int i;
if (m_pZ)
{
delete[] m_pZ;
m_pZ=NULL;
}
m_pZ=pZ;
if ((pZ==NULL) || (m_iNx==0) || (m_iNy==0))
{
m_dMin=0;
m_dMax=1;
return;
}
m_dMin=m_pZ[0];
m_dMax=m_pZ[0];
for (i=0;i<m_iNx*m_iNy;i++)
{
m_dMin=__min(m_dMin,m_pZ[i]);
m_dMax=__max(m_dMax,m_pZ[i]);
}
PostUpdateExtent();
}
void CPGLMapZ::SetDatas(const std::vector<double>& pZ)
{
ASSERT(pZ.size() == m_iNx*m_iNy);
UINT i;
if ((pZ.size()==0) || (m_iNx==0) || (m_iNy==0))
{
m_dMin=0;
m_dMax=1;
return;
}
if (m_pZ)
{
delete[] m_pZ;
m_pZ=NULL;
}
m_pZ=new double[m_iNx*m_iNy];
m_dMin=m_dMax=m_pZ[0]=pZ[0];
for (i=0;i<m_iNx*m_iNy;i++)
{
m_pZ[i]=pZ[i];
m_dMin=__min(m_dMin,m_pZ[i]);
m_dMax=__max(m_dMax,m_pZ[i]);
}
PostUpdateExtent();
}