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; } }