• Sábado 18 de Abril de 2026, 06:38

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - sergiohj

Páginas: [1]
1
Diseño de Algoritmos / Re: Calcular camino entre dos coordenadas
« en: Viernes 26 de Febrero de 2010, 09:44 »
Muchas gracias,

ya lo tengo más o menos desarrollado aunque tengo que hacer pruebas puesto que he tenido que hacer cambios al algoritmo:

class Program
    {
        static void Main(string[] args)
        {
            int xOrigen,yOrigen,xDestino,yDestino,metros;
            xOrigen=80;
            yOrigen =10;
            xDestino=34;
            yDestino =23;
            metros=5;
            while ((xOrigen != xDestino)||(yOrigen!=yDestino))
            {
                Console.WriteLine("X: " + xOrigen + "Y: " + yOrigen);
            SiguientePosicion(xOrigen,yOrigen,xDestino,yDestino, metros, out xOrigen, out yOrigen);
            }
            Console.ReadLine();
        }

       

        static void SiguientePosicion(int x0, int y0, int x1, int y1, int metros, out int x, out int y)
        {            
            int deltax = x1 - x0;
            int deltay = Math.Abs(y1 - y0);
            int error = deltax / 2;
            int ystep, xstep,xdirection;
            y = y0;

            if (x0 < x1)
            {
                xdirection = 1;
            }
            else
            {
                xdirection = -1;
            }

            x = x0;

                ystep = 0;
                xstep = 0;
                error = error - deltay;
                if (error < 0)
                {
                    if (y < y1)
                    {
                        if (Math.Abs(x - x1) > metros)
                        {
                            if (Math.Abs(y - y1) < metros / 2)
                            {
                                ystep = Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = metros / 2;
                            }
                        }
                        else
                        {
                            if (Math.Abs(y - y1) < metros)
                            {
                                ystep = Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = metros -(Math.Abs(x-x1));
                            }
                        }
                    }
                    else if (y > y1)
                    {
                        if (Math.Abs(x - x1) > metros)
                        {
                            if (Math.Abs(y - y1) < metros / 2)
                            {
                                ystep = -1*Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = -1*metros / 2;
                            }
                        }
                        else
                        {
                            if (Math.Abs(y - y1) < metros)
                            {
                                ystep = -1*Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = -1*metros - (Math.Abs(x - x1));
                            }
                        }
                    }
                    else
                    {
                        ystep = 0;
                    }
                    y = y + ystep;
                    if (Math.Abs(x - x1) < metros - Math.Abs(ystep))
                    {
                        xstep = Math.Abs(x - x1) * xdirection;
                    }
                    else
                    {
                        xstep = ((metros - Math.Abs(ystep)) * xdirection);
                    }
                    x = x+xstep;
                    error = error + deltax;
                }
                else
                {
                    if (Math.Abs(x - x1) < metros - Math.Abs(ystep))
                    {
                        xstep = Math.Abs(x - x1) * xdirection;
                    }
                    else
                    {
                        xstep = ((metros - Math.Abs(ystep)) * xdirection);
                    }
                    x = x + xstep;
                }

                 
        }
       

        static void swap(out int x1, out int y1, int x2, int y2)
        {
            x1=y2;
            y1=x2;      

        }

    }


Un saludo.

2
C# / Re: Camino entre dos coordenadas
« en: Viernes 26 de Febrero de 2010, 09:43 »
Hola,

muchas gracias a todos por la respuesta. El tema está en que no tengo posiciones decimales por lo que al final he utilizado el algoritmo de Bresenham puesto que tiene la ventaja de que opera con número enteros.

Os dejo el código para el que le sirva:


class Program
    {
        static void Main(string[] args)
        {
            int xOrigen,yOrigen,xDestino,yDestino,metros;
            xOrigen=80;
            yOrigen =10;
            xDestino=34;
            yDestino =23;
            metros=5;
            while ((xOrigen != xDestino)||(yOrigen!=yDestino))
            {
                Console.WriteLine("X: " + xOrigen + "Y: " + yOrigen);
            SiguientePosicion(xOrigen,yOrigen,xDestino,yDestino, metros, out xOrigen, out yOrigen);
            }
            Console.ReadLine();
        }

       

        static void SiguientePosicion(int x0, int y0, int x1, int y1, int metros, out int x, out int y)
        {            
            int deltax = x1 - x0;
            int deltay = Math.Abs(y1 - y0);
            int error = deltax / 2;
            int ystep, xstep,xdirection;
            y = y0;

            if (x0 < x1)
            {
                xdirection = 1;
            }
            else
            {
                xdirection = -1;
            }

            x = x0;

                ystep = 0;
                xstep = 0;
                error = error - deltay;
                if (error < 0)
                {
                    if (y < y1)
                    {
                        if (Math.Abs(x - x1) > metros)
                        {
                            if (Math.Abs(y - y1) < metros / 2)
                            {
                                ystep = Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = metros / 2;
                            }
                        }
                        else
                        {
                            if (Math.Abs(y - y1) < metros)
                            {
                                ystep = Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = metros -(Math.Abs(x-x1));
                            }
                        }
                    }
                    else if (y > y1)
                    {
                        if (Math.Abs(x - x1) > metros)
                        {
                            if (Math.Abs(y - y1) < metros / 2)
                            {
                                ystep = -1*Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = -1*metros / 2;
                            }
                        }
                        else
                        {
                            if (Math.Abs(y - y1) < metros)
                            {
                                ystep = -1*Math.Abs(y - y1);
                            }
                            else
                            {
                                ystep = -1*metros - (Math.Abs(x - x1));
                            }
                        }
                    }
                    else
                    {
                        ystep = 0;
                    }
                    y = y + ystep;
                    if (Math.Abs(x - x1) < metros - Math.Abs(ystep))
                    {
                        xstep = Math.Abs(x - x1) * xdirection;
                    }
                    else
                    {
                        xstep = ((metros - Math.Abs(ystep)) * xdirection);
                    }
                    x = x+xstep;
                    error = error + deltax;
                }
                else
                {
                    if (Math.Abs(x - x1) < metros - Math.Abs(ystep))
                    {
                        xstep = Math.Abs(x - x1) * xdirection;
                    }
                    else
                    {
                        xstep = ((metros - Math.Abs(ystep)) * xdirection);
                    }
                    x = x + xstep;
                }

                 
        }
       

        static void swap(out int x1, out int y1, int x2, int y2)
        {
            x1=y2;
            y1=x2;      

        }

    }

3
Diseño de Algoritmos / Calcular camino entre dos coordenadas
« en: Jueves 25 de Febrero de 2010, 11:18 »
Hola,

estoy desarrollando una aplicación que necesita calcular el camino que debería de recorrerse entre dos puntos y saber los puntos por los que voy pasando. Por ejemplo, imaginar que me encuentro en la posicion x=2 e Y=3 y mi objetivo es x=10 e y=6. Yo sé calcular la distancia entre estos dos puntos que sería de 8,54 unidades. Pues bien, mi problema viene al calcular el camino a seguir puesto que yo sólo puedo moverme 2 metros de mi posición cada vez. Por lo tanto, se que necesito 5 movimientos para llegar pero no sé como calcular los puntos intermedios por los que paso de la recta que une ambos puntos, que es el camino más corto. ¿Alguna idea o sugerencia para calcular dicho camino en coordenadas que se debe seguir para llegar al destino?

Gracias y un saludo.

4
C# / Camino entre dos coordenadas
« en: Jueves 25 de Febrero de 2010, 11:14 »
Hola,

estoy desarrollando una aplicación que necesita calcular el camino que debería de recorrerse entre dos puntos y saber los puntos por los que voy pasando. Por ejemplo, imaginar que me encuentro en la posicion x=2 e Y=3 y mi objetivo es x=10 e y=6. Yo sé calcular la distancia entre estos dos puntos que sería de 8,54 unidades. Pues bien, mi problema viene al calcular el camino a seguir puesto que yo sólo puedo moverme 2 metros de mi posición cada vez. Por lo tanto, se que necesito 5 movimientos para llegar pero no sé como calcular los puntos intermedios por los que paso de la recta que une ambos puntos, que es el camino más corto. ¿Alguna idea o sugerencia para calcular dicho camino en coordenadas que se debe seguir para llegar al destino?

Gracias y un saludo.

Páginas: [1]