// Last edited on 2000-09-05 03:03:47 by stolfi // from Trecho{,Impl}.java public abstract Servico[] entradasDeServicos(); // Os servicos que possuem entradas neste trecho. public abstract Servico[] saidasDeServicos(); // Os servicos que possuem saidas neste trecho. Vector listaEntradasDeServicos = new Vector(); Vector listaSaidasDeServicos = new Vector(); private void calculaEntradasDeServicos() { int n = listaEntradasDeServico.size(); EntradasDeServico = new Servico[n]; for(int i=0; i < n; i++) { EntradasDeServico[i] = (Servico)listaEntradasDeServico.elementAt(i); } listaEntradasDeServico = null; } private void calculaSaidasDeServicos() { int n = listaSaidasDeServico.size(); SaidasDeServico = new Servico[n]; for(int i=0; i < n; i++) { SaidasDeServico[i] = (Servico)listaSaidasDeServico.elementAt(i); } listaSaidasDeServico = null; } // from Logradouro{,Impl}.java public abstract Servico[] servicos(); // Lista dos servicos do logradouro Servico[] Servicos = null; this.Servicos = pegaServicos(this.Trechos); // Lista dos servicos do logradouro // Obte-la da lista de trechos public Servico[] servicos() { if (Servicos == null) { Servicos = pegaServicos(Trechos); } return Servicos; } private Servico[] pegaServicos(Trecho[] tr) { Vector serv = new Vector(); int n = tr.length; for(int i = 0; i < n; i++) { Servico[] s = tr[i].entradasDeServicos(); for(int j = 0; j < s.length; j++) { serv.addElement(s[j]); } } int m = serv.size(); Servico[] sv = new Servico[m]; for(int j = 0; j < m; j++) { sv[j] = (Servico) serv.elementAt(j); } return sv; } // Grafo No inicio = null; if (start instanceof Esquina) { inicio = getNoInicio((Esquina) start); } else if (start instanceof Trecho) { inicio = getNoInicio((Trecho) start); } else if (start instanceof Servico) { inicio = getNoInicio((Servico) start); } // Segundo passp pegue os nós-destino e os respectivos Caminhos: Caminho[] ret = new Caminho[fim.length]; for (int i = 0; i < fim.length; i++) { NoFim fim = (NoFim) results.elementAt(i); ret[i] = new Caminho(); ret[i].inicio = start; ret[i].fim = fim.end; ret[i].custo = getCustoCaminho(fim); Vector trechos = new Vector(); No atual = fim; No anterior = null; do { anterior = getAnterior(atual); Trecho t = getTrechoEquivalente(anterior, atual); if (t != null) { trechos.insertElementAt(t, 0); } atual = anterior; } while (!atual.equals(inicio)); ret[i].caminho = new Trecho[trechos.size()]; trechos.copyInto(ret[i].caminho); } return ret; // Desenhador.java // PlinVistaGlobal.java // Escala em pixels por unidade do mapa double xEscala = ((double) xTamanho)/((double) rTudo.width); double yEscala = ((double) yTamanho)/((double) rTudo.height); // Dimensoes do retângulo de interesse em pixels double x = ((double)(rFoco.x - rTudo.x)) * xEscala; double y = ((double)(rFoco.y - rTudo.y)) * yEscala; double dx = ((double)rFoco.width) * xEscala; double dy = ((double)rFoco.height) * yEscala; mostraRetangulo(g, (int)x, yTamanho - (int)y, (int)dx, (int)dy); private void mostraRetangulo(Graphics g, int x, int y, int w, int h) { g.setColor(Color.red); g.drawRect(x,y,w,h); g.drawRect(x+1,y+1,w-2,h-2); } // From PlinmapaComBarras.java public void mudaCaminhosDestacados(Nodo[] c) // Muda o conjunto de caminhos que estão sendo destacados. { mapa.mudaCaminhosDestacados(c); } public void mudaElementosDestacados(Elemento[] s) // Muda o conjunto de trechos e serviços que estão sendo destacados. { mapa.mudaElementosDestacados(s); } // From PlinMapa.java import PlinMapaComBarras; PlinMapaComBarras mapaComBarras; { mensagem("Criando mapa principal com barras..."); mapaComBarras = new PlinMapaComBarras(engenho, rTudo, this); layout.acrescentaComponente(mapaComBarras, 1.0,1.0, 1,1, 0,3, XYFILL, CTALIGN); } // From DesenhadorImpl.java public static final void destacaTrechos(Gravura g, Trecho[] t, int nivel) // Desenha os trechos dados no contexto gráfico "g". // Sempre que dois trechos consecutivos estiverem conectados, // desenha também a conexão. { Esquina eOrig = null; Ponto mOrig = null; Point tOrig = new Point(); Esquina eDest = null; Ponto mDest = null; Point tDest = new Point(); for (int i= 0; i< t.length; i++) { eOrig = t[i].orig(); mOrig = t[i].origPos(); e.mapaParaTela(mOrig, tOrig); if ((mDest != null) && (eDest == eOrig)) { g.drawLine(tDest.x, tDest.y, tOrig.x, tOrig.y); } eDest = t[i].dest(); mDest = t[i].destPos(); e.mapaParaTela(mDest, tDest); g.drawLine(tOrig.x, tOrig.y, tDest.x, tDest.y); } } public abstract void destacaElementos( Gravura g, double raio ); // Destaca os elementos dados no contexto gráfico "g". // Supõe que os elementos já foram desenhados. public abstract void destacaNodo(Gravura g, Nodo u, double raio); // Pinta o nodo "u" no contexto "g" na escala "e". public abstract void destacaCaminho(Gravura g, Nodo fin); // Pinta o caminho de custo mínimo até o nodo "fin" no contexto // "g" na escala "e". O caminho é definido implicitamente // pelos campos "prev"(que são preenchidos pelo Otimizador, por // exemplo). private double larguraDoTrechoEmPixels(Trecho tr, Escala e, int nivel) // Largura nominal de um trecho EM PIXELS, quando desenhado // na escala "e" no nível indicado. Retorna -1 se o // trecho não deve ser desenhado neste nível. { double np = (double)tr.numeroDePistas(); double lp = Trecho.LARGURA_NOMINAL; double larg = np * lp / e.tamanhoDoPixel(); select (nivel) { case NIVEL_CONTORNO: larg += 1; break; case NIVEL_RECHEIO: larg = -1; break; case NIVEL_DESTAQUE: larg -= 1; break; case NIVEL_ROTULO: larg = 10; break; } return larg; } public abstract desenhaTrecho(Gravura g, Trecho tr, int nivel) // Desenha o trecho "tr" no contexto gráfico "g", em estilo normal. { if (nivel <= NIVEL_DESTAQUE) { double larg = larguraDoTrechoEmPixels(tr, e); if (larg >= 0) { linha(g, e, tr.origPos(), tr.destPos(), larg/2); } } } public static void desenhaEsquina(Gravura g, Esquina esq, int nivel) // Desenha as conexoes da uma esquina. { if (nivel <= NIVEL_DESTAQUE) { double larg = larguraDoTrechoEmPixels(tr, e); if (larg >= 0) { Conexao con = esq.conexoes(); for(int i = 0; i < con.length; i++) { linha(g, e, con[i].t1.destPos(), con[i].t2.origPos(), larg/2); } } } } public void desenhaServico(Gravura g, Servico sv, int nivel) { if desenhaContornoDoServico(g, e, sv, nivel); desenhaLigacoesDoServico(g, e, sv, nivel); } private void desenhaContornoDoServico(Gravura g, Servico sv, int nivel) // Desenha o contorno (preenchido) do serviço { g.setColor(tipo().cor()); Desenhar.poligono(g, e, vertices(), true); } private void desenhaLigacoesDoServico(Gravura g, Servico sv, int nivel) // Desenha as ligações entre trechos e serviços. { Ponto[] lig = sv.ligacoes(); int ng = lig.length; double larg = 0.75*Trecho.LARGURA_NOMINAL/e.tamanhoDoPixel(); for (int i = 0; i < ng; i += 2) { linha(g, e, lig[i], lig[i+1, larg/2]); } } public abstract void destacaTrechos(Gravura g, Trecho[] t, int nivel) // Desenha os trechos dados no contexto gráfico "g". // Sempre que dois trechos consecutivos estiverem conectados, // desenha também a conexão. { Esquina eOrig = null; Ponto mOrig = null; Point tOrig = new Point(); Esquina eDest = null; Ponto mDest = null; Point tDest = new Point(); for (int i= 0; i< t.length; i++) { eOrig = t[i].orig(); mOrig = t[i].origPos(); e.mapaParaTela(mOrig, tOrig); if ((mDest != null) && (eDest == eOrig)) { g.drawLine(tDest.x, tDest.y, tOrig.x, tOrig.y); } eDest = t[i].dest(); mDest = t[i].destPos(); e.mapaParaTela(mDest, tDest); g.drawLine(tOrig.x, tOrig.y, tDest.x, tDest.y); } }