示例#1
0
    private List <Antena> EncontrarGrupo(Antena antenaInicial, int numeroDeGrupo)
    {
        foreach (var antena in Antenas)
        {
            antena.Visitada = false;
        }
        List <Antena> antenasPorVisitar = new List <Antena>();

        antenasPorVisitar.Add(antenaInicial);
        List <Antena> antenasEnGrupo = new List <Antena>();

        while (antenasPorVisitar.Any())
        {
            Antena antenaActual = antenasPorVisitar.First();
            antenasPorVisitar.RemoveAt(0);
            antenaActual.Visitada = true;
            antenaActual.Grupo    = numeroDeGrupo;
            antenasEnGrupo.Add(antenaActual);

            foreach (var conexion in antenaActual.Conexiones)
            {
                if (conexion.Visitada)
                {
                    continue;
                }

                antenasPorVisitar.Add(conexion);
            }
        }

        return(antenasEnGrupo);
    }
        public IHttpActionResult modificarAntena(Antena antena)
        {
            try
            {
                var accion = SessionController.getInstance().Antena.Where(w => w.idAntena == antena.idAntena).FirstOrDefault();

                if (accion == null)
                {
                    return(Ok(false));
                }

                accion.idEstado  = antena.idEstado;
                accion.idCiudad  = antena.idCiudad;
                accion.idCP      = antena.idCP;
                accion.idColonia = antena.idColonia;
                accion.calle     = antena.calle;
                accion.numExt    = antena.numExt;
                accion.lat       = antena.lat;
                accion.lon       = antena.lon;
                accion.activo    = antena.activo;

                SessionController.getInstance().SaveChanges();

                return(Ok(true));
            }
            catch (Exception)
            {
                return(BadRequest());
            }
        }
示例#3
0
 public int GetDistancia(Antena destino)
 {
     if (!_tablaDeRuteo.ContainsKey(destino.Id))
     {
         Red.CalcularRutas(destino);
     }
     return(_tablaDeDistancias[destino.Id]);
 }
示例#4
0
 public Antena GetRuta(Antena destino)
 {
     if (!_tablaDeRuteo.ContainsKey(destino.Id))
     {
         Red.CalcularRutas(destino);
     }
     return(_tablaDeRuteo[destino.Id]);
 }
示例#5
0
    void Start()
    {
        MensajePing.text = "";

        Random = new Random(GenerationSeed);

        RedCom = new RedCom();
        RedCom.Generar(Random);
        _antenaTransmisoraMensaje = RedCom.AntenaEmisora;
        _antenaTransmisoraMensaje.MensajeTrasnmitido = true;

        foreach (var nodo in RedCom.Antenas)
        {
            GameObject antenaFisica = Instantiate(AntenaFisicaPrefab, new Vector3(nodo.X, nodo.Y, 0), Quaternion.identity);
            _antenasFisicas.Add(antenaFisica);

            if (nodo == RedCom.AntenaEstacion)
            {
                CambiarMaterialAntena(antenaFisica, MaterialEstacion);
                antenaFisica.transform.localScale *= 2.0f;
            }

            if (nodo == _antenaTransmisoraMensaje)
            {
                CambiarMaterialAntena(antenaFisica, MaterialTransmitiendo);
            }

            PropiedadesAntena propiedadesAntena = antenaFisica.GetComponent <PropiedadesAntena>();
            propiedadesAntena.IdAntena = nodo.Id;
            propiedadesAntena.Grupo    = nodo.Grupo;

            if (nodo.AntenaGrande)
            {
                antenaFisica.transform.localScale *= 1.5f;
            }

            foreach (var conexion in nodo.Conexiones)
            {
                GameObject objetoLinea  = new GameObject();
                var        lineRenderer = objetoLinea.AddComponent <LineRenderer>();
                lineRenderer.positionCount = 2;
                lineRenderer.SetPosition(0, new Vector3(nodo.X, nodo.Y, 5));
                lineRenderer.SetPosition(1, new Vector3(conexion.X, conexion.Y, 5));

                lineRenderer.startWidth = 0.05f;
                lineRenderer.endWidth   = 0.02f;

                lineRenderer.material   = new Material(Shader.Find("Particles/Additive"));
                lineRenderer.startColor = Color.red;
                lineRenderer.endColor   = Color.black;
            }
        }

        if (DebugMode)
        {
            RefreshTextosDistancias();
        }
    }
示例#6
0
    private void UnirGrupos()
    {
        int cantidadGrupos = int.MaxValue;

        while (cantidadGrupos > 1)
        {
            foreach (var antena in Antenas)
            {
                antena.Grupo = -1;
            }
            int numeroDeGrupo = 0;
            foreach (var antena in Antenas)
            {
                if (antena.Grupo != -1)
                {
                    continue;
                }

                List <Antena> grupoDeAntenas       = EncontrarGrupo(antena, numeroDeGrupo);
                List <Antena> antenasFueraDelGrupo = Antenas.Where(a => !grupoDeAntenas.Contains(a)).ToList();

                float  distanciaMinima = float.MaxValue;
                Antena conexionInterna = null;
                Antena conexionExterna = null;
                foreach (var antenaEnGrupo in grupoDeAntenas)
                {
                    foreach (var antenaOtroGrupo in antenasFueraDelGrupo)
                    {
                        float dX = antenaOtroGrupo.X - antenaEnGrupo.X;
                        float dY = antenaOtroGrupo.Y - antenaEnGrupo.Y;
                        float d2 = dX * dX + dY * dY;

                        if (d2 < distanciaMinima)
                        {
                            distanciaMinima = d2;
                            conexionInterna = antenaEnGrupo;
                            conexionExterna = antenaOtroGrupo;
                        }
                    }
                }

                if (conexionInterna != null)
                {
                    conexionInterna.Conexiones.Add(conexionExterna);
                    conexionExterna.Conexiones.Add(conexionInterna);
                    conexionInterna.AntenaGrande = true;
                    conexionExterna.AntenaGrande = true;

                    // Agrega la sección conectada al grupo actual
                    EncontrarGrupo(conexionExterna, numeroDeGrupo);
                }


                numeroDeGrupo++;
            }
            cantidadGrupos = numeroDeGrupo;
        }
    }
示例#7
0
    private void GenerarGrafoAleatorio(Random random, int numeroNodos, float x0, float x1, float y0, float y1)
    {
        int   idNodo    = 0;
        float anchoMapa = Math.Abs(x1 - x0);
        float altoMapa  = Math.Abs(y1 - y0);

        for (int i = 0; i < numeroNodos; i++)
        {
            Antena nuevaAntena     = new Antena(idNodo++, this);
            bool   posicionExitosa = false;
            while (!posicionExitosa && i < GenAleatoriaMaxIntentosPonerNodo)
            {
                nuevaAntena.X = anchoMapa * (float)random.NextDouble() + x0;
                nuevaAntena.Y = altoMapa * (float)random.NextDouble() + y0;

                posicionExitosa = true;
                foreach (Antena nodo in Antenas)
                {
                    double dX        = nuevaAntena.X - nodo.X;
                    double dY        = nuevaAntena.Y - nodo.Y;
                    float  distancia = Mathf.Sqrt((float)(dX * dX + dY * dY));
                    if (distancia < GenAleatoriaMinDistanciaEntreNodos)
                    {
                        posicionExitosa = false;
                        break;
                    }
                }

                if (posicionExitosa)
                {
                    break;
                }
                i++;
            }

            if (posicionExitosa)
            {
                Antenas.Add(nuevaAntena);
            }
        }

        foreach (Antena n in Antenas)
        {
            foreach (Antena m in Antenas)
            {
                double dX        = n.X - m.X;
                double dY        = n.Y - m.Y;
                float  distancia = Mathf.Sqrt((float)(dX * dX + dY * dY));
                if (distancia < GenAleatoriaDistanciaDeConexion)
                {
                    n.Conexiones.Add(m);
                    m.Conexiones.Add(n);
                }
            }
        }

        UnirGrupos();
    }
示例#8
0
 public void Post([FromBody] Antena antena)
 {
     if (antena != null)
     {
         using (var db = new AntenaRep())
         {
             db.Insert(antena);
         }
     }
 }
示例#9
0
    public void DestruirAntena(Antena antenaADestruir)
    {
        Antenas.Remove(antenaADestruir);
        foreach (var a in Antenas)
        {
            a.Conexiones.Remove(antenaADestruir);
        }

        CalcularTodasLasRutas();
    }
示例#10
0
 public void Put([FromBody] Antena antena)
 {
     if (antena != null)
     {
         using (var db = new AntenaRep())
         {
             db.Update(antena);
         }
     }
 }
示例#11
0
 public bool todasLasAntenasEncendidas()
 {
     for (int i = 0; i < CantidadDeAntenas; i++)
     {
         Antena antenaScript = Antenas[i].GetComponent <Antena>();
         if (!antenaScript.Encendida)
         {
             return(false);
         }
     }
     return(true);
 }
示例#12
0
    private void DestruirAntena(Antena antenaADestruir)
    {
        RedCom.DestruirAntena(antenaADestruir);
        GameObject antenaFisica = GetAntenaFisica(antenaADestruir);

        _antenasFisicas.Remove(antenaFisica);
        Destroy(antenaFisica);

        if (DebugMode)
        {
            RefreshTextosDistancias();
        }
    }
示例#13
0
    private void GenerarGrafoRectangular(Random random, int anchoGrafo, int altoGrafo, float anchoMapa, float altoMapa)
    {
        float distanciaHorizontal = anchoMapa / (anchoGrafo - 1);
        float distanciaVertical   = altoMapa / (altoGrafo - 1);

        int idNodo = 0;

        for (int y = 0; y < altoGrafo; y++)
        {
            for (int x = 0; x < anchoGrafo; x++)
            {
                Antena nuevoAntena = new Antena(idNodo++, this)
                {
                    X = x * distanciaHorizontal - anchoMapa / 2,
                    Y = -y * distanciaVertical + altoMapa / 2
                };
                Antenas.Add(nuevoAntena);
            }
        }

        for (int y = 0; y < altoGrafo; y++)
        {
            for (int x = 0; x < anchoGrafo; x++)
            {
                int index        = y * anchoGrafo + x;
                int indexDerecha = y * anchoGrafo + x + 1;
                int indexAbajo   = (y + 1) * anchoGrafo + x;

                Antena antenaActual             = Antenas.ElementAt(index);
                ICollection <Antena> conexiones = antenaActual.Conexiones;

                if (random.Next(4) == 0)
                {
                    continue;
                }

                if (x + 1 < anchoGrafo)
                {
                    conexiones.Add(Antenas.ElementAt(indexDerecha));
                    Antenas.ElementAt(indexDerecha).Conexiones.Add(antenaActual);
                }


                if (y + 1 < altoGrafo)
                {
                    conexiones.Add(Antenas.ElementAt(indexAbajo));
                    Antenas.ElementAt(indexAbajo).Conexiones.Add(antenaActual);
                }
            }
        }
    }
示例#14
0
    private void PingAntena(Antena antenaAPinguear)
    {
        if (_pinging || antenaAPinguear == RedCom.AntenaEstacion)
        {
            return;
        }

        _antenaOrigenPing      = RedCom.AntenaEstacion;
        _antenaTransmisoraPing = _antenaOrigenPing;
        _antenaDestinoPing     = antenaAPinguear;
        _timerPing             = 0;
        _pinging = true;

        _pingFisico = Instantiate(PingPrefab, new Vector3(_antenaOrigenPing.X, _antenaOrigenPing.Y, 0), Quaternion.identity);
    }
示例#15
0
    public void Generar(Random random)
    {
        Camera cam    = Camera.main;
        float  height = 2f * cam.orthographicSize;
        float  width  = height * cam.aspect;

        GenerarGrafoAleatorio(random, 90, -width / 2 + 1, width / 2 - 1, -height / 2 + 2, height / 2 - 1);
        // GenerarGrafoRectangular(random, 8, 8, width - 1, height - 1);

        CalcularTodasLasRutas();

        AntenaReceptora = Antenas.ElementAt(random.Next(Antenas.Count));
        AntenaEmisora   = ElegirAntenaEmisora(random, 6, 10);
        AntenaEstacion  = ElegirAntenaEstacion(random, 3, 3);
    }
示例#16
0
    private void TransmitirMensaje()
    {
        GameObject antenaFisicaTransmisora = GetAntenaFisica(_antenaTransmisoraMensaje);

        antenaFisicaTransmisora.GetComponent <Animator>().SetBool("Emitiendo", false);

        _antenaTransmisoraMensaje = _antenaTransmisoraMensaje.GetRuta(RedCom.AntenaReceptora);
        _antenaTransmisoraMensaje.MensajeTrasnmitido = true;
        if (_antenaTransmisoraMensaje == RedCom.AntenaReceptora)
        {
            MensajeEnDestino();
        }

        antenaFisicaTransmisora = GetAntenaFisica(_antenaTransmisoraMensaje);
        antenaFisicaTransmisora.GetComponent <Animator>().SetBool("Emitiendo", true);
    }
示例#17
0
    void Update()
    {
        if (Input.GetButtonDown ("Fire1")) {
            Ray mousePosition = Camera.main.ScreenPointToRay (Input.mousePosition);
            RaycastHit _Hit;

            if(Physics.Raycast (mousePosition,out _Hit,100f)){
                if (_Hit.collider.CompareTag ("Antena")) {
                    if (vecesTocado >= cantidadDeToquesParaDesactivar) {
                        AntenaScript = _Hit.collider.GetComponent <Antena> ();
                        AntenaScript.DesactivarAntena();
                        Debug.Log("veces tocado: " + vecesTocado);
                        Debug.Log("cantidad para desactivar: " + cantidadDeToquesParaDesactivar);
                        vecesTocado = 0;
                    } else {
                        vecesTocado++;
                    }
                }
            }

        }
    }
示例#18
0
    public void CalcularRutas(Antena antenaDestino)
    {
        foreach (var antena in Antenas)
        {
            antena.Visitada = false;
            antena.SetRuta(antenaDestino, null);
            antena.SetDistancia(antenaDestino, DistanciaSinConexion);
        }

        List <Antena> antenasPorVisitar = new List <Antena>();

        antenaDestino.SetDistancia(antenaDestino, 0);
        antenaDestino.Visitada = true;

        antenasPorVisitar.Add(antenaDestino);
        while (antenasPorVisitar.Any())
        {
            Antena antenaActual = antenasPorVisitar.First();
            antenasPorVisitar.RemoveAt(0);
            antenaActual.Visitada = true;

            foreach (var conexion in antenaActual.Conexiones)
            {
                if (conexion.Visitada)
                {
                    continue;
                }

                int distanciaConexion = antenaActual.GetDistancia(antenaDestino) + 1;
                if (distanciaConexion < conexion.GetDistancia(antenaDestino))
                {
                    conexion.SetDistancia(antenaDestino, distanciaConexion);
                    conexion.SetRuta(antenaDestino, antenaActual);
                }

                antenasPorVisitar.Add(conexion);
            }
        }
    }
示例#19
0
 public Antena[] GetProximasAntenasScripts()
 {
     Antena[] antenasScript = new Antena[antenasGeneradasEnParalelo];
     for (int i = 0; i < antenasScript.Length; i++)
     {
         if (todasLasAntenasEncendidas())
         {
             SceneManager.LoadScene(0);
             CancelInvoke("activarAntenas");
             return(new Antena[0]);
         }
         int posNextAntena = Random.Range(0, CantidadDeAntenas);
         Debug.Log(posNextAntena);
         Antena antena = Antenas [posNextAntena].GetComponent <Antena>();
         while (antena.Encendida)
         {
             posNextAntena = Random.Range(0, CantidadDeAntenas);
             antena        = Antenas [posNextAntena].GetComponent <Antena> ();
         }
         antenasScript[i] = antena;
     }
     return(antenasScript);
 }
        public IHttpActionResult agregarAntena(Antena antena)
        {
            try
            {
                var accion = SessionController.getInstance().Antena.Where(w => w.numExt == antena.numExt).FirstOrDefault();

                if (accion != null)
                {
                    return(Ok(false));
                }

                var datos = new Antena
                {
                    idAntena  = Guid.NewGuid(),
                    idEstado  = antena.idEstado,
                    idCiudad  = antena.idCiudad,
                    idCP      = antena.idCP,
                    idColonia = antena.idColonia,
                    calle     = antena.calle,
                    numExt    = antena.numExt,
                    lat       = antena.lat,
                    lon       = antena.lon,
                    activo    = antena.activo
                };

                SessionController.getInstance().Antena.Add(datos);

                SessionController.getInstance().SaveChanges();

                return(Ok(true));
            }
            catch (Exception)
            {
                return(BadRequest());
            }
        }
示例#21
0
 public void SetRuta(Antena destino, Antena ruta)
 {
     _tablaDeRuteo[destino.Id] = ruta;
 }
示例#22
0
 public void SetDistancia(Antena destino, int distancia)
 {
     _tablaDeDistancias[destino.Id] = distancia;
 }
示例#23
0
 private GameObject GetAntenaFisica(Antena antena)
 {
     return(_antenasFisicas.FirstOrDefault(a => a.GetComponent <PropiedadesAntena>().IdAntena == antena.Id));
 }
示例#24
0
 public Estacion(int id, Antena antenaPing)
 {
     Id         = id;
     AntenaPing = antenaPing;
 }
示例#25
0
    private void TransmitirPing()
    {
        _antenaTransmisoraPing = _antenaTransmisoraPing.GetRuta(_antenaDestinoPing);

        if (_pingingLlegoADestino && _antenaTransmisoraPing == _antenaOrigenPing)
        {
            ResultadoPing();
            Destroy(_pingFisico);
            _pinging = false;
        }
        else
        {
            if (_antenaTransmisoraPing == _antenaDestinoPing)
            {
                _pingingLlegoADestino = true;
                _pingExitoso          = _antenaDestinoPing.MensajeTrasnmitido || _antenaTransmisoraMensaje.GetRuta(RedCom.AntenaReceptora) == _antenaDestinoPing;

                _pingMensaje = "---INFORMACIÓN EN DESTINO / ANTENA #" + _antenaDestinoPing.Id + " ---\n";
                int anchoMensaje = _pingMensaje.Count();
                if (_pingExitoso)
                {
                    RedCom.CalcularRutas(_antenaTransmisoraMensaje);
                    int distancia = _antenaDestinoPing.GetDistancia(_antenaTransmisoraMensaje);
                    if (_antenaDestinoPing.MensajeTrasnmitido)
                    {
                        if (distancia == 0)
                        {
                            _pingMensaje += " ! EMITIENDO MENSAJE !\n";
                        }
                        else
                        {
                            _pingMensaje += "MENSAJE REEMITIDO - Distancia: " + distancia;
                            if (distancia == 1)
                            {
                                _pingMensaje += " salto.\n";
                            }
                            else
                            {
                                _pingMensaje += " saltos.\n";
                            }
                        }
                    }
                    else
                    {
                        _pingMensaje += "! RECIBIENDO MENSAJE !\n";
                    }
                }
                else
                {
                    _pingMensaje += "El mensaje no paso por aquí.\n";
                }

                for (int i = 0; i < anchoMensaje - 1; i++)
                {
                    _pingMensaje += "-";
                }

                _antenaDestinoPing = _antenaOrigenPing;
            }
        }
    }