• Sábado 21 de Diciembre de 2024, 09:55

Autor Tema:  Calcular camino entre dos coordenadas  (Leído 2298 veces)

sergiohj

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Calcular camino entre dos coordenadas
« en: Jueves 25 de Febrero de 2010, 11:18 »
0
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.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Calcular camino entre dos coordenadas
« Respuesta #1 en: Jueves 25 de Febrero de 2010, 11:42 »
0
Hay varios algoritmos que lo resuelve...
El algoritmo de Bresenham tiene la ventaja de que opera con número enteros.
http://en.wikipedia.org/wiki/Bresenham% ... _algorithm (en inglés)
«Ma non troppo»
----> ModoVacaciones = False<----

sergiohj

  • Nuevo Miembro
  • *
  • Mensajes: 4
    • Ver Perfil
Re: Calcular camino entre dos coordenadas
« Respuesta #2 en: Viernes 26 de Febrero de 2010, 09:44 »
0
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.

Nebire

  • Miembro HIPER activo
  • ****
  • Mensajes: 670
    • Ver Perfil
Re: Calcular camino entre dos coordenadas
« Respuesta #3 en: Domingo 28 de Febrero de 2010, 17:50 »
0
En otro momento reviso tu algoritmo....

...y de paso te pondré las incrementos para cada octante...
«Ma non troppo»
----> ModoVacaciones = False<----