// CController.cpp: implementation of the CController class.
//
//////////////////////////////////////////////////////////////////////
#include "CController.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//these hold the geometry of the sweepers and the mines
const int NumSweeperVerts = 16;
const SPoint sweeper[NumSweeperVerts] = {SPoint(-1, -1),
SPoint(-1, 1),
SPoint(-0.5, 1),
SPoint(-0.5, -1),
SPoint(0.5, -1),
SPoint(1, -1),
SPoint(1, 1),
SPoint(0.5, 1),
SPoint(-0.5, -0.5),
SPoint(0.5, -0.5),
SPoint(-0.5, 0.5),
SPoint(-0.25, 0.5),
SPoint(-0.25, 1.75),
SPoint(0.25, 1.75),
SPoint(0.25, 0.5),
SPoint(0.5, 0.5)};
const int NumObjectVerts = 42;
const SPoint objects[NumObjectVerts] = {SPoint(80, 60),
SPoint(200, 60),
SPoint(200, 60),
SPoint(200, 100),
SPoint(200, 100),
SPoint(160, 100),
SPoint(160, 100),
SPoint(160, 200),
SPoint(160, 200),
SPoint(80, 200),
SPoint(80, 200),
SPoint(80, 60),
SPoint(250, 100),
SPoint(300, 40),
SPoint(300, 40),
SPoint(350, 100),
SPoint(350, 100),
SPoint(250, 100),
SPoint(220, 180),
SPoint(320, 180),
SPoint(320, 180),
SPoint(320, 300),
SPoint(320, 300),
SPoint(220, 300),
SPoint(220, 300),
SPoint(220, 180),
SPoint(12, 15),
SPoint(380, 15),
SPoint(380, 15),
SPoint(380, 360),
SPoint(380, 360),
SPoint(12, 360),
SPoint(12, 360),
SPoint(12, 340),
SPoint(12, 340),
SPoint(100, 290),
SPoint(100, 290),
SPoint(12, 240),
SPoint(12, 240),
SPoint(12, 15)};
//---------------------------------------constructor---------------------
//
// initilaize the sweepers, their brains and the GA factory
//
//-----------------------------------------------------------------------
CController::CController(HWND hwndMain) : m_NumSweepers(CParams::iNumSweepers),
m_pGA(NULL),
m_bFastRender(false),
m_iTicks(0),
m_hwndMain(hwndMain),
m_iGenerations(0),
cxClient(CParams::WindowWidth),
cyClient(CParams::WindowHeight)
{
//let's create the mine sweepers
for (int i = 0; i < m_NumSweepers; ++i)
{
m_vecSweepers.push_back(CMinesweeper());
}
//get the total number of weights used in the sweepers
//NN so we can initialise the GA
m_NumWeightsInNN = m_vecSweepers[0].GetNumberOfWeights();
//calculate the neuron placement in the weight vector
vector<int> SplitPoints = m_vecSweepers[0].CalculateSplitPoints();
//initialize the Genetic Algorithm class
m_pGA = new CGenAlg(m_NumSweepers,
CParams::dMutationRate,
CParams::dCrossoverRate,
m_NumWeightsInNN,
SplitPoints);
//Get the weights from the GA and insert into the sweepers brains
m_vecThePopulation = m_pGA->GetChromos();
for (int i = 0; i < m_NumSweepers; i++)
{
m_vecSweepers[i].PutWeights(m_vecThePopulation[i].vecWeights);
}
//create the pens for the graph drawing
m_BluePen = CreatePen(PS_SOLID, 1, RGB(0, 0, 255));
m_RedPen = CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
m_GreenPen = CreatePen(PS_SOLID, 1, RGB(0, 255, 0));
m_GreyPenDotted = CreatePen(PS_DOT, 1, RGB(200, 200, 200));
m_RedPenDotted = CreatePen(PS_DOT, 1, RGB(250, 200, 200));
m_OldPen = NULL;
//and the brushes
m_BlueBrush = CreateSolidBrush(RGB(0, 0, 244));
m_RedBrush = CreateSolidBrush(RGB(150, 0, 0));
//fill the vertex buffers
for (int i = 0; i < NumSweeperVerts; ++i)
{
m_SweeperVB.push_back(sweeper[i]);
}
for (int i = 0; i < NumObjectVerts; ++i)
{
m_ObjectsVB.push_back(objects[i]);
}
}
//--------------------------------------destructor-------------------------------------
//
//--------------------------------------------------------------------------------------
CController::~CController()
{
if (m_pGA)
{
delete m_pGA;
}
DeleteObject(m_BluePen);
DeleteObject(m_RedPen);
DeleteObject(m_GreenPen);
DeleteObject(m_OldPen);
DeleteObject(m_GreyPenDotted);
DeleteObject(m_RedPenDotted);
DeleteObject(m_BlueBrush);
DeleteObject(m_RedBrush);
}
//---------------------WorldTransform--------------------------------
//
// sets up the translation matrices for the mines and applies the
// world transform to each vertex in the vertex buffer passed to this
// method.
//-------------------------------------------------------------------
void CController::WorldTransform(vector<SPoint> &VBuffer,
SVector2D vPos,
double rotation,
double scale)
{
//create the world transformation matrix
C2DMatrix matTransform;
//scale
matTransform.Scale(scale, scale);
//rotate
matTransform.Rotate(rotation);
//translate
matTransform.Translate(vPos.x, vPos.y);
//transform the ships vertices
matTransform.TransformSPoints(VBuffer);
}
//-------------------------------------Update---------------------------------------
//
// This is the main workhorse. The entire simulation is controlled from here.
//
// The comments should explain what is going on adequately.
//--------------------------------------------------------------------------------------
bool CController::Update()
{
//run the sweepers through CParams::iNumTicks amount of cycles. During this loop each
//sweepers NN is constantly updated with the appropriate information