示例#1
0
        private void DesenharCaminho(PilhaLista <int> caminho, Graphics g) //desenha com base em um caminho selecionado nos DGVs ou com base no melhorCaminho
        {
            //classe que será utilizada para desenhar
            Pen caneta = new Pen(Color.Black);

            caneta.Width = 2.0F;

            //desempilhamos de caminho uma id de uma cidade, verificando sua existência na árvore de cidades
            // caso exista, a variável cidadeAnterior receberá todas as informações desta cidade
            int idCidadeAnterior = caminho.Desempilhar();

            cidades.Existe(new Cidade(idCidadeAnterior, " ", 0, 0));
            Cidade cidadeAnterior = cidades.Atual.Info;

            //enquanto houver cidades a serem percorridas
            while (!caminho.EstaVazia())
            {
                //desempilhamos de caminho uma id de uma cidade, verificando sua existência na árvore de cidades
                // caso exista, a variável cidade receberá todas as informações desta cidade
                int idCidade = caminho.Desempilhar();
                cidades.Existe(new Cidade(idCidade, " ", 0, 0));
                Cidade cidade = cidades.Atual.Info;

                //refazemos as proporções do mapa de acordo com as coordenadas da cidade
                int x1 = (cidadeAnterior.CoordenadaX * pbMapa.Width) / 4096;
                int y1 = (cidadeAnterior.CoordenadaY * pbMapa.Height) / 2048 + 3;

                //refazemos as proporções do mapa de acordo com as coordenadas da cidade
                int x2 = (cidade.CoordenadaX * pbMapa.Width) / 4096;
                int y2 = (cidade.CoordenadaY * pbMapa.Height) / 2048 + 3;

                // caso a distância entre x1 e x2 seja maior que a distância "por trás",
                // deve -se desenhar as retas entre as cidades passando por trás
                // (por exemplo Gondor e Arrakeen
                if (x1 - x2 > (pbMapa.Width - x1) + x2)
                {
                    g.DrawLine(caneta, x1, y1, pbMapa.Width, (y1 + y2) / 2);
                    g.DrawLine(caneta, x2, y2, 0, (y1 + y2) / 2);
                }
                else if (x2 - x1 > (pbMapa.Width - x2) + x1)
                {
                    g.DrawLine(caneta, x1, y1, 0, (y1 + y2) / 2);
                    g.DrawLine(caneta, x2, y2, pbMapa.Width, (y1 + y2) / 2);
                }
                //se não for o caso da linha ter de passar por trás
                else
                {
                    //desenhamos uma linha entre as duas cidades, cidadeAnterior representando a posição atual, e cidade representando aonde é necessário ir
                    g.DrawLine(caneta, x1, y1, x2, y2); //utilizando as localizações "x" e "y" das cidades
                }

                //fazemos com que o destino se torne a origem, para refazer o processo
                cidadeAnterior = cidade;
            }
        }