/// <summary> /// remove os veículos da rua quando já estão no final da rua. /// se for final do trajeto finaliza percurso /// se tiver mais percurso coloca na proxima rua /// </summary> private void TrocaVeiculosRua() { foreach (var rua in RuasSimulacao) { var sema = Semaforos.Where(x => x.RuasOrigem.Contains(rua.Id)).FirstOrDefault(); bool temSem = sema != null; for (int i = 0; i < rua.NumeroFaixas; i++) { var veiculos = rua.VeiculosNaRua[i].ToList(); foreach (var veiculo in veiculos) { if ((rua.EspacoOcupado[i] + MargemErroViaLotada) >= rua.Comprimento) { bool removeVeiculo = true; if (temSem && sema.EstadoSemaforo != Entidades.Enuns.EstadosSemaforo.ABERTO) { removeVeiculo = false; } if (removeVeiculo) { var arestaRuaAt = grafo.ObtenhaAresta(rua.IdAresta); int verticeOrigemProximaRua = arestaRuaAt.Destino; veiculo.VerticeAtual = veiculo.ProximoDestinoVeiculo(); int verticeDestinoProximaRua = veiculo.ProximoDestinoVeiculo(); var procimaAresta = grafo.ObtenhaAresta(verticeOrigemProximaRua, verticeDestinoProximaRua); if (procimaAresta is object) { var prua = RuasSimulacao.Where(x => x.IdAresta == procimaAresta.Id).FirstOrDefault(); if (prua is object) { if (prua.AdicionaVeiculo(veiculo, SegundoSimulacao)) { rua.RemoveVeiculo(); } // o veículo precisa trocar de rua mas a proxima rua não tem espaço suficiente else { //veiculo permanece onde está } } }// fim percurso do veículo else { rua.RemoveVeiculo(); // veiculo removido da simulação, chegou ao destino } } } } } } }
private void TrocaVeiculosRua(int instanteSimulacao) { foreach (var rua in RuasSimulacao) { var sema = Semaforos.Where(x => x.RuasOrigem.Contains(rua.Id)).FirstOrDefault(); bool temSem = sema != null; for (int i = 0; i < rua.NumeroFaixas; i++) { var veiculos = rua.VeiculosNaRua[i].ToList(); foreach (var veiculo in veiculos) { if ((rua.EspacoOcupado[i] + MargemErroViaLotada) >= rua.Comprimento) { bool removeVeiculo = true; if (temSem && sema.EstadoSemaforo != Entidades.Enuns.EstadosSemaforo.ABERTO) { removeVeiculo = false; } if (removeVeiculo) { var arestaRuaAt = grafo.ObtenhaAresta(rua.IdAresta); int verticeOrigemProximaRua = arestaRuaAt.Destino; veiculo.VerticeAtual = veiculo.ProximoDestinoVeiculo(); int verticeDestinoProximaRua = veiculo.ProximoDestinoVeiculo(); var procimaAresta = grafo.ObtenhaAresta(verticeOrigemProximaRua, verticeDestinoProximaRua); if (procimaAresta is object) { var prua = RuasSimulacao.Where(x => x.IdAresta == procimaAresta.Id).FirstOrDefault(); if (prua is object) { if (prua.AdicionaVeiculo(veiculo, instanteSimulacao)) { rua.RemoveVeiculo(); } } } } } } } } }