// Método que por pesquisa binária a partir do id, procura a cidade desejada private CidadeMarte VisitarCidades(NoArvore <CidadeMarte> atual, int idCidade, CidadeMarte cm) { CidadeMarte ret = null; if (atual == null) { return(ret); } if (atual.Info.Id == idCidade) { ret = atual.Info; return(ret); } if (atual.Info.Id.CompareTo(idCidade) > 0) { ret = VisitarCidades(atual.Esq, idCidade, ret); } else { ret = VisitarCidades(atual.Dir, idCidade, ret); } return(ret); }
// DESENHA MAPA private void pbMapa_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; SizeF tamanho = new SizeF(12, 12); Point ponto; List <CidadeMarte> listaCidades = arvoreCidades.ParaLista(); for (int i = 0; i < listaCidades.Count; i++) { ponto = new Point(); ponto.X = listaCidades.ElementAt(i).CoordX *pbMapa.Width / 4096 - 5; ponto.Y = listaCidades.ElementAt(i).CoordY *pbMapa.Height / 2048 - 5; RectangleF rect = new RectangleF(ponto, tamanho); g.DrawString(listaCidades.ElementAt(i).Nome, new Font(this.Font, FontStyle.Bold), Brushes.Black, ponto.X - 18, ponto.Y + 15); g.DrawString(listaCidades.ElementAt(i).Id + "", new Font(this.Font, FontStyle.Bold), Brushes.WhiteSmoke, ponto.X, ponto.Y + 28); g.FillEllipse(Brushes.Black, rect); lsbOrigem.Items.Add((i) + " - " + listaCidades.ElementAt(i).Nome); lsbDestino.Items.Add((i) + " - " + listaCidades.ElementAt(i).Nome); } if (pilhaMenorCaminho != null) { var aux = pilhaMenorCaminho.Copia(); while (!aux.EstaVazia()) { CaminhoMarte c = aux.Desempilhar(); CidadeMarte origem = listaCidades.ElementAt(c.IdCidadeOrigem); CidadeMarte destino = listaCidades.ElementAt(c.IdCidadeDestino); Point ori = new Point(); Point dest = new Point(); ori.X = origem.CoordX * pbMapa.Width / 4096 - 5; ori.Y = origem.CoordY * pbMapa.Height / 2048 - 5; dest.X = destino.CoordX * pbMapa.Width / 4096 - 5; dest.Y = destino.CoordY * pbMapa.Height / 2048 - 5; g.DrawLine(new Pen(Color.Black), ori.X + 5, ori.Y + 5, dest.X + 5, dest.Y + 5); //destaca a origem e o destino em azul RectangleF rectOri = new RectangleF(ori, tamanho); RectangleF rectDest = new RectangleF(dest, tamanho); g.FillEllipse(Brushes.Blue, rectOri); g.FillEllipse(Brushes.Blue, rectDest); } } }
// Método que lê de um arquivo texto e constroe uma árvore a partir dele private void ConstruirArvore(string nomeArquivo) { if (nomeArquivo == null || nomeArquivo.Equals("")) { throw new Exception("Nome de arquivo invalido"); } var arquivo = new StreamReader(nomeArquivo); arvoreBinaria = new ArvoreBinaria <CidadeMarte>(); while (!arquivo.EndOfStream) { string linha = arquivo.ReadLine(); int id = int.Parse(linha.Substring(0, 3)); string nomeCidade = linha.Substring(3, 15); int x = int.Parse(linha.Substring(18, 5)); int y = int.Parse(linha.Substring(23, 5)); var cidadeMarte = new CidadeMarte(id, nomeCidade, x, y); arvoreBinaria.InserirInfo(cidadeMarte); } arquivo.Close(); }
// Método que encontra uma cidade na da árvore a partir do id public CidadeMarte GetCidade(int idCidade) { CidadeMarte ret = null; return(VisitarCidades(arvoreBinaria.Raiz, idCidade, ret)); }