/* * Evento paint do pictureBox mapa que exibirá as cidades e os caminhos. Desenha os pontos em cada cidade, seguindo * PreOrdem da Árvore. Também exibe um caminho selecionado pelo usuário caso ele não seja negativo. */ private void pbMapa_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; arvore.PreOrdem((Cidade c) => { float coordenadaX = c.CoordenadaX * pbMapa.Width / TAMANHOX; float coordenadaY = c.CoordenadaY * pbMapa.Height / TAMANHOY; g.FillEllipse( new SolidBrush(Color.Black), coordenadaX, coordenadaY, 10f, 10f ); g.DrawString(c.Nome, new Font("Courier New", 8, FontStyle.Bold), new SolidBrush(Color.FromArgb(32, 32, 32)), coordenadaX + 12, coordenadaY - 10); }); if (selecionado >= 0) { PilhaLista <Caminho> aux = listaCaminhos[selecionado].Clone(); while (!aux.EstaVazia()) { Caminho possivelCaminho = aux.Desempilhar(); Cidade origem = arvore.ExisteDado(new Cidade(possivelCaminho.IdOrigem)); Cidade destino = arvore.ExisteDado(new Cidade(possivelCaminho.IdDestino)); using (var pen = new Pen(Color.FromArgb(211, 47, 47), 2)) { int origemX = origem.CoordenadaX * pbMapa.Width / TAMANHOX + 5; int origemY = origem.CoordenadaY * pbMapa.Height / TAMANHOY + 5; int destinoX = destino.CoordenadaX * pbMapa.Width / TAMANHOX + 5; int destinoY = destino.CoordenadaY * pbMapa.Height / TAMANHOY + 5; AdjustableArrowCap flecha = new AdjustableArrowCap(5, 5); if (destinoX - origemX > pbMapa.Width / 2) { g.DrawLine(pen, origemX, origemY, 0, origemY); pen.CustomEndCap = flecha; g.DrawLine(pen, pbMapa.Width, origemY, destinoX, destinoY); } else { pen.CustomEndCap = flecha; g.DrawLine(pen, origemX, origemY, destinoX, destinoY); } } } } }