示例#1
0
        void animarParticulas()
        {
            if (!esDijk)
            {
                bool     vuelta   = false;
                int      vueltas  = 0;
                Graphics graphics = Graphics.FromImage(iTransp);
                Brush    brochaP  = new SolidBrush(Color.BlueViolet);
                Brush    brochaD  = new SolidBrush(Color.Gold);
                Point    point    = new Point();

                Particula p = new Particula();
                while (lParticulas.Count > 0)
                {
                    if (vueltas == 2)
                    {
                        vuelta = true;
                    }
                    for (int i = 0; i < lParticulas.Count; i++)
                    {
                        p = lParticulas[i];
                        p.setIndPos(p.getContador());

                        Arista  a   = new Arista();
                        Vertice ori = p.getLVertices()[p.getCOri()];
                        Vertice des = p.getLVertices()[p.getCDes()];
                        for (int j = 0; j < ori.getLA().Count; j++)
                        {
                            if (ori.getLA()[j].getDestino().getId() == des.getId())
                            {
                                a = ori.getLA()[j];
                                break;
                            }
                        }

                        if (p.getIndPos() < a.getListaP().Count)                         //Si la particula no ha terminado los puntos en la arista donde esta
                        {
                            Point po = a.getListaP()[p.getIndPos()];
                            if (p.esDepre() == true)
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            else
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            //COMPROBAR COLISIONES
                            if (vuelta)
                            {
                                Particula p1 = new Particula();
                                Particula p2 = new Particula();

                                for (int z = 0; z < lParticulas.Count; z++)
                                {
                                    for (int x = 0; x < lParticulas.Count; x++)
                                    {
                                        if (z < lParticulas.Count && x < lParticulas.Count)
                                        {
                                            p1 = lParticulas[z];                                             // Es depredadora
                                            p2 = lParticulas[x];                                             // Es presa
                                        }

                                        if (p1.esDepre() && !p2.esDepre())
                                        {
                                            if (p1.getPosActual() == p2.getPosActual() ||
                                                (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||                                           //Aqui ya captura en x lineal
                                                (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||

                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) ||                                           //Aqui ya captura en Y lineal
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X)
                                                )
                                            {
                                                p1.setR(p1.getR() + 5);
                                                lParticulas.Remove(p2);
                                                //i--;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else                           //si ya termino cambio el origen
                        {
                            p.setCOri(p.getCOri() + 1);
                            p.setCDes(p.getCDes() + 1);
                            p.setContador(0);
                            if (p.getCDes() == p.getLVertices().Count)                             //Si el destino es el ultimo en la lista elimino la particula
                            {
                                point.X = 0;
                                point.Y = 0;
                                p.setPosActual(point);
                                lParticulas.Remove(p);
                                i--;
                            }
                        }
                        p.setContador(p.getContador() + 5);
                    }
                    pictureImageGrafo.Refresh();
                    graphics.Clear(Color.Transparent);
                    vueltas++;
                }
                totalVertices = disponibles = g.getLV().Count;                 //< Reinicio el contador para insertar más
                vOcupados.Clear();
            }
            else
            {
                bool vuelta  = false;
                bool viva    = true;
                bool refresh = true;
                int  vueltas = 0;
                //labelLlego.Text = "--";
                Graphics graphics = Graphics.FromImage(iTransp);
                Brush    brochaP  = new SolidBrush(Color.BlueViolet);
                Brush    brochaD  = new SolidBrush(Color.Gold);
                Point    point    = new Point();

                Particula p = new Particula();
                while (lParticulas.Count > 0)
                {
                    if (vueltas == 2)
                    {
                        vuelta = true;
                    }
                    if (!viva)
                    {
                        MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-");
                        totalVertices = disponibles = g.getLV().Count;                         //< Reinicio el contador para insertar más
                        vOcupados.Clear();
                        break;
                    }
                    for (int i = 0; i < lParticulas.Count; i++)
                    {
                        p = lParticulas[i];
                        p.setIndPos(p.getContador());

                        Arista  a   = new Arista(null, null, double.MaxValue, null);
                        Vertice ori = p.getLVertices()[p.getCOri()];
                        Vertice des = p.getLVertices()[p.getCDes()];

                        for (int j = 0; j < ori.getLA().Count; j++)
                        {
                            if (ori.getLA()[j].getDestino() == des)
                            {
                                a = ori.getLA()[j];
                                break;
                            }
                        }

                        if (p.getIndPos() < a.getListaP().Count)                         //Si la particula no ha terminado los puntos en la arista donde esta
                        {
                            Point po = a.getListaP()[p.getIndPos()];
                            if (p.esDepre() == true)
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaD, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            else
                            {
                                point.X = po.X;
                                point.Y = po.Y;
                                p.setPosActual(point);
                                graphics.FillEllipse(brochaP, po.X - p.getR(), po.Y - p.getR(), 2 * p.getR(), 2 * p.getR());
                            }
                            //COMPROBAR COLISIONES
                            if (vuelta)
                            {
                                Particula p1 = new Particula();
                                Particula p2 = new Particula();

                                for (int z = 0; z < lParticulas.Count; z++)
                                {
                                    for (int x = 0; x < lParticulas.Count; x++)
                                    {
                                        if (z < lParticulas.Count && x < lParticulas.Count)
                                        {
                                            p1 = lParticulas[z];                                             // Es depredadora
                                            p2 = lParticulas[x];                                             // Es presa
                                        }

                                        if (p1.esDepre() && !p2.esDepre())
                                        {
                                            if (p1.getPosActual() == p2.getPosActual() ||
                                                (p1.getPosActual().X - 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 3 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 2 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||                                           //Aqui ya captura en x lineal
                                                (p1.getPosActual().X - 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 4 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X + 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X - 1 == p2.getPosActual().X&& p1.getPosActual().Y == p2.getPosActual().Y) ||

                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y + 4 == p2.getPosActual().Y) ||                                           //Aqui ya captura en Y lineal
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 1 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 2 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 3 == p2.getPosActual().Y) ||
                                                (p1.getPosActual().X == p2.getPosActual().X&& p1.getPosActual().Y - 4 == p2.getPosActual().Y) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y + 1 == p2.getPosActual().Y&& p1.getPosActual().X + 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 2 == p2.getPosActual().Y&& p1.getPosActual().X + 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 3 == p2.getPosActual().Y&& p1.getPosActual().X + 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y + 4 == p2.getPosActual().Y&& p1.getPosActual().X + 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X) ||

                                                (p1.getPosActual().Y - 1 == p2.getPosActual().Y&& p1.getPosActual().X - 1 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 2 == p2.getPosActual().Y&& p1.getPosActual().X - 2 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 3 == p2.getPosActual().Y&& p1.getPosActual().X - 3 == p2.getPosActual().X) ||
                                                (p1.getPosActual().Y - 4 == p2.getPosActual().Y&& p1.getPosActual().X - 4 == p2.getPosActual().X))
                                            {
                                                p1.setR(p1.getR() + 5);
                                                lParticulas.Clear();
                                                //TODO: Si se comieron la presa detengo todo el proceso
                                                numericUpPosPresa.Enabled = true;
                                                viva = false;
                                                MessageBox.Show("-=LA PARTICULA FUE DEVORADA=-");
                                                totalVertices = disponibles = g.getLV().Count;                                                 //< Reinicio el contador para insertar más
                                                vOcupados.Clear();
                                                pictureImageGrafo.Refresh();
                                                graphics.Clear(Color.Transparent);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        else                           //si ya termino cambio el origen
                        {
                            p.setCOri(p.getCOri() + 1);
                            p.setCDes(p.getCDes() + 1);
                            p.setContador(0);
                            int auxPos = p.getLVertices()[p.getCDes() - 1].getId();
                            if (p.getCDes() == p.getLVertices().Count)                             //Si el destino es el ultimo en la lista elimino la particula
                            {
                                point.X = 0;
                                point.Y = 0;
                                p.setPosActual(point);
                                lParticulas.Clear();

                                //TODO: Si llego al final el vertice final será el nuevo origen, deberia cambiar los numericUp
                                viva = false;
                                //MessageBox.Show("La presa llego a su destino, seleccione uno nuevo");
                                numericUpPosPresa.Value   = auxPos;
                                numericUpPosPresa.Enabled = false;
                                refresh = false;
                                MessageBox.Show("-=LA PARTICULA LLEGO A SU DESTINO=-");
                                totalVertices = disponibles = g.getLV().Count;                                 //< Reinicio el contador para insertar más
                                vOcupados.Clear();

                                buttonDepre.Enabled = false;
                            }
                        }
                        p.setContador(p.getContador() + 5);
                    }
                    if (refresh)
                    {
                        pictureImageGrafo.Refresh();
                        graphics.Clear(Color.Transparent);
                    }
                    vueltas++;
                }
            }
        }