Return to Appendix B.

MATRIX.CPP
// 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);
}

Return to Appendix B.