// Matt Streeter
// 2/27/00
// MATRIX.CPP
// Implementation of class TMatrixView, providing compact matrix display of
// networks.
// Copyright Matt Streeter, 2000. All rights reserved
#include "matrix.h"
#include "nvis.h"
// Amount of horizontal space, in pixels, between successive matrices in
// compact matrix representation
#define MATRIX_HSPACING 2
// Number of pixels vertically separating matrices and edge of window.
#define MATRIX_VSPACING 2
TMatrixView::TMatrixView(Network *pNetwork,int iPixelsPerSquare,
double dMaxWeight)
{
mpNetwork=pNetwork;
miHeight=-1;
miWidth=-1;
miPixelsPerSquare=iPixelsPerSquare;
mdMaxWeight=dMaxWeight;
}
void TMatrixView::Paint(TDC& dc,int iXPos,int iYPos,Chromosome *pChromosome)
{
CalculateSize();
if(!miPixelsPerSquare)
return;
int iXCursor=iXPos,x,y;
int iWeight=0;
iXCursor+=MATRIX_HSPACING+1;
for(int iLayer=1;iLayer<mpNetwork->GetLayers();iLayer++)
{
for(x=0;x<mpNetwork->GetLayerSize(iLayer);x++)
{
for(y=0;y<mpNetwork->GetLayerSize(iLayer-1);y++)
{
int iThisX=iXCursor+x*miPixelsPerSquare;
int iThisY=iYPos+1+miHeight-MATRIX_VSPACING
-mpNetwork->GetLayerSize(iLayer-1)*miPixelsPerSquare
+y*miPixelsPerSquare;
double dWeight=pChromosome->GetGene(iWeight++);
TBrush FillBrush(WeightToColor(dWeight/mdMaxWeight));
dc.FillRect(iThisX,iThisY,iThisX+miPixelsPerSquare,
iThisY+miPixelsPerSquare,FillBrush);
}
}
iXCursor+=mpNetwork->GetLayerSize(iLayer)*miPixelsPerSquare
+MATRIX_HSPACING;
}
}
int TMatrixView::SetPixelsPerSquare(int iPixelsPerSquare)
{
miPixelsPerSquare=iPixelsPerSquare;
CalculateSize();
return(0);
}
int TMatrixView::GetHeight()
{
if(miHeight==-1)
CalculateSize();
return(miHeight);
}
int TMatrixView::GetWidth()
{
if(miWidth==-1)
CalculateSize();
return(miWidth);
}
int TMatrixView::GetVSpacing()
{
return(MATRIX_VSPACING);
}
int TMatrixView::GetHSpacing()
{
return(MATRIX_HSPACING);
}
int TMatrixView::CalculateSize()
{
if(!miPixelsPerSquare)
{
miWidth=1;
miHeight=1;
return(0);
}
miWidth=0;
miHeight=0;
for(int n=1;n<mpNetwork->GetLayers();n++)
{
miWidth+=mpNetwork->GetLayerSize(n)*miPixelsPerSquare;
int iLayerHeight=mpNetwork->GetLayerSize(n-1)*miPixelsPerSquare;
if(iLayerHeight>miHeight)
miHeight=iLayerHeight;
}
miWidth+=(mpNetwork->GetLayers())*MATRIX_HSPACING;
miHeight+=2*MATRIX_VSPACING;
return(0);
}