public void Render(Graphics2D renderer) { //render the stats string s = "Generation: " + m_iGenerations.ToString(); MatterHackers.Agg.UI.TextWidget GenerationText = new MatterHackers.Agg.UI.TextWidget(s, 9); GenerationText.OriginRelativeParent = new Vector2(150, 10); //GenerationText.Render(renderer); //do not render if running at accelerated speed if (!m_bFastRender) { //render the mines for (int i = 0; i < m_vecMines.Count; ++i) { //grab the vertices for the mine shape List <Vector3> mineVB = new List <Vector3>(); foreach (Vector3 vector in m_MineVB) { mineVB.Add(vector); } WorldTransform(mineVB, m_vecMines[i]); //draw the mines m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(mineVB[0].x, mineVB[0].y); for (int vert = 1; vert < mineVB.Count; ++vert) { m_LinesToDraw.LineTo(mineVB[vert].x, mineVB[vert].y); } renderer.Render(m_LinesToDraw, m_BlackPen); } RGBA_Bytes currentColor = m_RedPen; //render the sweepers for (int i = 0; i < m_vecSweepers.Count; i++) { //grab the sweeper vertices List <Vector3> sweeperVB = new List <Vector3>(); foreach (Vector3 vector in m_SweeperVB) { sweeperVB.Add(vector); } //transform the vertex buffer m_vecSweepers[i].WorldTransform(sweeperVB); //draw the sweeper left track m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[0].x, sweeperVB[0].y); for (int vert = 1; vert < 4; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } if (i == m_pGA.NumElite) { currentColor = m_BlackPen; } renderer.Render(m_LinesToDraw, currentColor); //draw the sweeper right track m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[4].x, sweeperVB[4].y); for (int vert = 5; vert < 8; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } renderer.Render(m_LinesToDraw, currentColor); // draw the body m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[8].x, sweeperVB[8].y); m_LinesToDraw.LineTo(sweeperVB[9].x, sweeperVB[9].y); m_LinesToDraw.MoveTo(sweeperVB[10].x, sweeperVB[10].y); for (int vert = 11; vert < 16; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } renderer.Render(m_LinesToDraw, currentColor); } } else { PlotStats(renderer); } }
public void Render(Graphics2D renderer) { //render the stats string s = "Generation: " + m_iGenerations.ToString(); MatterHackers.Agg.UI.TextWidget GenerationText = new MatterHackers.Agg.UI.TextWidget(s, 9); GenerationText.OriginRelativeParent = new Vector2(150, 10); //GenerationText.Render(renderer); //do not render if running at accelerated speed if (!m_bFastRender) { //render the mines for (int i = 0; i < m_vecMines.Count; ++i) { //grab the vertices for the mine shape List<Vector3> mineVB = new List<Vector3>(); foreach (Vector3 vector in m_MineVB) { mineVB.Add(vector); } WorldTransform(mineVB, m_vecMines[i]); //draw the mines m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(mineVB[0].x, mineVB[0].y); for (int vert = 1; vert < mineVB.Count; ++vert) { m_LinesToDraw.LineTo(mineVB[vert].x, mineVB[vert].y); } renderer.Render(m_LinesToDraw, m_BlackPen); } RGBA_Bytes currentColor = m_RedPen; //render the sweepers for (int i = 0; i < m_vecSweepers.Count; i++) { //grab the sweeper vertices List<Vector3> sweeperVB = new List<Vector3>(); foreach (Vector3 vector in m_SweeperVB) { sweeperVB.Add(vector); } //transform the vertex buffer m_vecSweepers[i].WorldTransform(sweeperVB); //draw the sweeper left track m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[0].x, sweeperVB[0].y); for (int vert = 1; vert < 4; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } if (i == m_pGA.NumElite) { currentColor = m_BlackPen; } renderer.Render(m_LinesToDraw, currentColor); //draw the sweeper right track m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[4].x, sweeperVB[4].y); for (int vert = 5; vert < 8; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } renderer.Render(m_LinesToDraw, currentColor); // draw the body m_LinesToDraw.remove_all(); m_LinesToDraw.MoveTo(sweeperVB[8].x, sweeperVB[8].y); m_LinesToDraw.LineTo(sweeperVB[9].x, sweeperVB[9].y); m_LinesToDraw.MoveTo(sweeperVB[10].x, sweeperVB[10].y); for (int vert = 11; vert < 16; ++vert) { m_LinesToDraw.LineTo(sweeperVB[vert].x, sweeperVB[vert].y); } renderer.Render(m_LinesToDraw, currentColor); } } else { PlotStats(renderer); } }
//this function plots a graph of the average and best fitnesses //over the course of a run private void PlotStats(Graphics2D renderer) { if (m_vecBestFitness.Count == 0) { return; } string s = "Best Fitness: " + m_pGA.BestFitness.ToString(); MatterHackers.Agg.UI.TextWidget InfoText = new MatterHackers.Agg.UI.TextWidget(s, 9); InfoText.OriginRelativeParent = new Vector2(5, 30); //InfoText.Render(renderer); s = "Average Fitness: " + m_pGA.AverageFitness.ToString(); InfoText = new MatterHackers.Agg.UI.TextWidget(s, 9); InfoText.OriginRelativeParent = new Vector2(5, 45); //InfoText.Render(renderer); //render the graph double HSlice = (double)cxClient / (m_iGenerations + 1); double VSlice = (double)(cyClient / ((m_BestFitnessYet + 1) * 2)); bool foundNewBest = false; if (m_vecBestFitness[m_vecBestFitness.Count - 1] > m_BestFitnessYet || m_BestLinesToDraw == null || LastFitnessCount != m_vecBestFitness.Count) { LastFitnessCount = m_vecBestFitness.Count; m_BestFitnessYet = m_vecBestFitness[m_vecBestFitness.Count - 1]; foundNewBest = true; } if (foundNewBest) { //plot the graph for the best fitness double x = 0; m_BestPathToDraw.remove_all(); m_BestPathToDraw.MoveTo(0, 0); for (int i = 0; i < m_vecBestFitness.Count; ++i) { m_BestPathToDraw.LineTo(x, VSlice * m_vecBestFitness[i]); x += HSlice; } m_BestLinesToDraw = new Stroke(m_BestPathToDraw); //plot the graph for the average fitness x = 0; m_AveragePathToDraw.remove_all(); m_AveragePathToDraw.MoveTo(0, 0); for (int i = 0; i < m_vecAvFitness.Count; ++i) { m_AveragePathToDraw.LineTo(x, VSlice * m_vecAvFitness[i]); x += HSlice; } m_AverageLinesToDraw = new Stroke(m_AveragePathToDraw); } else { renderer.Render(m_BestLinesToDraw, m_BluePen); renderer.Render(m_AverageLinesToDraw, m_RedPen); } }