示例#1
0
        /*
         * 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);
                        }
                    }
                }
            }
        }