// Last edited on 2000-09-05 03:06:04 by stolfi import java.util.Vector; import java.lang.Math; import Ponto; import Retangulo; import Esquina; import Logradouro; import Bairro; import Servico; import Trecho; public class TrechoImpl extends Trecho { double _pcusto; int _id; int _numeracaoInicial; int _numeracaoFinal; int _numeroDePistas; Logradouro _logradouro; Esquina _orig; Esquina _dest; String _codPostal; Bairro _bairro; boolean _podeEstacionar = true; Trecho _oposto; Ponto _origPos = null; Ponto _destPos = null; Ponto _centro = null; Servico[] _entradasDeServicos = null; Servico[] _saidasDeServicos = null; // ** MÉTODOS DE CONSTRUÇÃO ** public TrechoImpl(int id) { this._id = id; } public void inicializa( Esquina orig, Esquina dest, Trecho oposto, double pcusto, int nPistas, Bairro br, Logradouro lg, int numIni, int numFin, String cep, boolean est, Vector listaDeEntradas, Vector listaDeSaidas ) { this._pcusto = pcusto; this._logradouro = lg; this._orig = orig; this._dest = dest; this._numeroDePistas = nPistas; this._numeracaoInicial = numIni; this._numeracaoFinal = numFin; this._codPostal = cep; this._podeEstacionar = est; this._bairro = br; this._oposto = oposto; this._entradasDeServicos = pegaServicos(listaDeEntradas); this._saidasDeServicos = pegaServicos(listaDeSaidas); } // ** MÉTODOS PÚBLICOS GERAIS DE ELEMENTOS ** public int id() { return this._id; } public String nome() { Logradouro lg = logradouro(); return(lg.nome() + ", " + numeracaoInicial() + ".." + numeracaoFinal()); } public String toString() { return "t" + id(); } public Bairro bairro() { return this._bairro; } public Ponto centro() { if (this._centro == null) { calculaExtremidades(); } return _centro; } public void insere(Retangulo r) { { Ponto p = origPos(); r.insereBola(p.x, p.y, LARGURA_NOMINAL); } { Ponto p = destPos(); r.insereBola(p.x, p.y, LARGURA_NOMINAL); } } public boolean intercepta(Retangulo r) { Ponto a = origPos(); Ponto b = destPos(); double xMin = (a.x < b.x ? a.x : b.x); double xMax = (a.x > b.x ? a.x : b.x); double yMin = (a.y < b.y ? a.y : b.y); double yMax = (a.y > b.y ? a.y : b.y); return (xMax >= r.xMin) && (xMin <= r.xMax) && (yMax >= r.yMin) && (yMin <= r.yMax); } public double distancia(Ponto p) { return Ponto.distanciaASegmento(p, origPos(), destPos()); } // ** MÉTODOS PÚBLICOS ESPECÍFICOS ** public double pcusto() { return this._pcusto; } public Logradouro logradouro() { return this._logradouro; } public Esquina orig() { return this._orig; } public Esquina dest() { return this._dest; } public int numeroDePistas() { return this._numeroDePistas; } public int numeracaoInicial() { return this._numeracaoInicial; } public int numeracaoFinal() { return this._numeracaoFinal; } public String codPostal() { return this._codPostal; } public boolean podeEstacionar() { return this._podeEstacionar; } public Trecho oposto() { return this._oposto; } public Ponto origPos() { if (_origPos == null) { calculaExtremidades(); } return(this._origPos); } public Ponto destPos() { if (_destPos == null) { calculaExtremidades(); } return(this._destPos); } public Servico[] entradasDeServicos() { return this._entradasDeServicos; } public Servico[] saidasDeServicos() { return this._saidasDeServicos; } // ** MÉTODOS USADOS INTERNAMENTE ** private void calculaExtremidades() // Calcula _origPos e _destPos = // origem e destino do trecho para desenho, // deslocados lateral e longitudinalmente. // também calcula _centro. { _origPos = new Ponto(); _destPos = new Ponto(); Ponto a = this.orig().centro(); Ponto b = this.dest().centro(); double rx = b.x - a.x; double ry = b.y - a.y; double d = Math.sqrt(rx*rx + ry*ry); if (d == 0) d=1; rx = rx/d; ry = ry/d; double tx = -ry; double ty = rx; double dt = LARGURA_NOMINAL/2.0; double dr = Esquina.RAIO_NOMINAL; if (dr > d/3.0) { dr = d/3.0; } _origPos.x = a.x - dt*tx + dr*rx; _origPos.y = a.y - dt*ty + dr*ry; _destPos.x = b.x - dt*tx - dr*rx; _destPos.y = b.y - dt*ty - dr*ry; _centro = new Ponto ( (_origPos.x + _destPos.x)/2.0, (_origPos.y + _destPos.y)/2.0 ); } private Servico[] pegaServicos(Vector listaServicos) { int n = listaServicos.size(); Servico[] sv = new Servico[n]; for(int i = 0; i < n;i++) { sv[i] = (Servico) listaServicos.elementAt(i); } listaServicos = null; return sv; } }