Duda sobre el funcionamiento de path find

Started by Danielo515, April 06, 2011, 07:20:34 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

Me parece, que, con las pruebas que he realizado path find crea una única instancia. Es decir, se ejecuta solo un proceso por cada programa.

Lo digo porque cuando más de un proceso utiliza path find de manera simultánea, todos se "teletrasportan" a donde está el otro proceso.

¿Hay alguna forma de solucionar esto? Porque la verdad es que me fastidia todo el invento!

GRacias.

SplinterGU

es una unica corrida de path_find a la vez, deberias consumir todos los resultados antes de llamarla desde otro proceso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Entonces la única posibilidad que me queda es guardar en un array privado de cada proceso todos los puntos que haya encontrado ¿no? Mientras no haga un frame ese proceso monopolizará el pathfind y no habrá problemas ¿Estoy en lo cierto?

Y ya para saberlo ¿Como puedo averiguar cuantos puntos encontró? lo digo para el tamaño del array.

Gracias splinter.

Danielo515

Este código se cuelga, pues a cada segundo  :P
[code language="bennu"]

repeat //bucle principal
         say("BUcle principal");
         px=x+rand(-80,80);
         if(y<=105)   py=y+rand(0,20); else py=y+rand(-10,20); end //esto es para que si está en la superficie, solo busque por abajo, y si no, busque en las dos direcciones.
         if(   map_get_pixel(0,0,px,py)!=blanco   )
            if( path_find(0,0,x,y,px,py,1)  ) //buscamos el punto aleatorio
                     say("encontrado camino");
                     i=0;
                     while( PATh_GETXY(puntos
  • ,puntos[1])  and i<300); //y lo recorremos
                            say("guardando camino");
                            long_camino+=1;
                            i++;
                         end
                         
                         from i=0 to long_camino;
                            x=puntos
    • ;
                              y=puntos[1];
                              frame;
                           end
                           
                  end
               end
               dig();//esto lo único que hace es un agujero debajo del proceso
               frame;
         until(exit_status);[/code]

Danielo515

Vale, ya encontré el error, o eso creo...

A parte del desbordamiento de pila, que ya lo he corregido, resulta que el path find no entiende el negro rgb como espacio vacío, por lo que los agujeros que hago con ese color no le parecen puntos válidos, sin embargo al resto del programa sí, y he ahí el conflicto. Entonces ¿Como puedo hacer esos agujeros? porque si pongo drawing_color(0) no me pinta nada. ¿Una ayudita please?

Danielo515

#5
Esto sigue sin funcionar.

Estoy probando con nuevas y excitantes formas de hacerlo y ni para atrás.

Estoy probando a hacer los agujeros con draw_fcircle en lugar de con map put utilizando el 0 como color, y sí, los agujeros los hace, pero a la hora de buscar el camino hacia algún punto que esté en un agujero, se queda trabado otra vez. Me estoy volviendo mico.


EDIT

Ya está muy claro, cualquier punto que caiga dentro de un agujero hecho con draw_fcircle provoca que el programa se quede conjelado buscando el camino, y la verdad es que no llego a entender el motivo.

¡Esto me trae loco!

SplinterGU

posiblemente se consuma mucho tiempo analizando.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Suele pasar con puntos cercanos.

Aquí el código completo, por si hay algo que se me escapa
[code language="bennu"]Program ants;

import "mod_key"
import "mod_grproc"
import "mod_video"
import "mod_map"
import "mod_say"
import "mod_wm"
import "mod_rand"
import "mod_text"
import "mod_timers"
import "mod_draw"
import "mod_path"
import "mod_chipmunk"
import "mod_proc"

global

white;
hormiga;
blanco;
marron;
bujero;
alto=600;
ancho=800;

ant_alto=1;//estas medidas deben ser la mitad en números enteros de lo que mida la figura para detectar colisiones
ant_ancho=2;//esto es por comodidad de calcular los bordes de la figura los cuales se miden desde el medio de la misma
   
begin
set_mode(ancho,alto,16);
marron=rgb(00,00,00);
blanco=rgb(255,255,255);
white=new_map(800,500,16);
bujero=new_map(12,12,16);
hormiga=new_map(4,3,16);
map_clear(0,white,rgb(255,255,255));
map_clear(0,hormiga,rgb(155,95,95));
//map_clear(0,0,rgb(80,80,255)); cielo azul
//map_clear(0,bujero,marron);
drawing_map(0,bujero);
drawing_color(marron);
draw_fcircle(6,6,6);
map_put(0,0,white,(800/2),350);

/********bujeraco*/
drawing_map(0,0);
drawing_color(0);
draw_fcircle(300,100,150);



   from x=0 to 1;
      ant();
   end
      
   
   Repeat
      frame;
   until(exit_status);


end

process ant()
private
   boca=0;
   int i;
   estado;
   int PX,PY,xx,yy;
   puntos[300][2];
   long_camino=0;
begin
   x=rand(400,600);
   graph=hormiga;
   y=99;
   repeat //bucle principal
         say("BUcle principal");
         px=x+rand(-80,80);
         if(y<=105)   py=y+rand(-10,20); else py=y+rand(-10,20); end //esto es para que si está en la superficie, solo busque por abajo, y si no, busque en las dos direcciones.
         if(   map_get_pixel(0,0,px,py) ==0   )
            say("El punto"+px+" "+py+" parece válido "+map_get_pixel(0,0,px,py));
            if( path_find(0,0,x,y,px,py,1)  ) //buscamos el punto aleatorio
                     say("encontrado camino");
                     i=0;long_camino=0;
                     while( PATh_GETXY(&xx,&yy)  )
                         puntos
  • =xx;puntos[1]=yy;  //y lo recorremos
                            //say("guardando punto: "+i);
                            long_camino++;
                            i++;
                         end
                         
                         from i=0 to long_camino-1;
                            x=puntos
    • ;
                              y=puntos[1];
                              //say("Caminando a punto: "+i);
                              frame;
                           end
                           
                  end
               end
               dig();//esto lo único que hace es un agujero debajo del proceso
               frame;
         until(exit_status);

      end

      function dig()
      private
      dead_end=0;
      begin

      drawing_map(0,0);
      drawing_color(0);


            if(      map_get_pixel(0,0,father.x+ant_ancho+1,father.y)==blanco   ) //si hay un hueco blanco
                  dead_end+=10; //aumentamos la posibilidad de cabar
            end
            if(      map_get_pixel(0,0,father.x-(ant_ancho+1),father.y)==blanco )    //si hay un hueco blanco
                  dead_end+=10; //aumentamos la posibilidad de cabar
            end
            if(      map_get_pixel(0,0,father.x+ant_ancho+1,father.y)==blanco   )    //si hay un hueco blanco
                  dead_end+=10; //aumentamos la posibilidad de cabar
            end

            if(      map_get_pixel(0,0,father.x,father.y+ant_alto+1)==blanco      ) //si hay un hueco blanco
                  dead_end+=10; //aumentamos la posibilidad de cabar
            end
            if(      map_get_pixel(0,0,father.x,father.y-(ant_alto+1))==blanco   ) //si hay un hueco blanco
                  dead_end+=10; //aumentamos la posibilidad de cabar
            end
            
            if( rand(0,200) < dead_end) //ahora en función de la posibilidad de estar en un callejón
                  draw_fcircle(father.x+rand(-4,4),father.y+rand(-2,2),6);
                  //map_put(  0,0,bujero,father.x+rand(-4,4),father.y+rand(-2,2)  );
            end
      end




      [/code]

      Gracias splinter  :D

SplinterGU

#8
el problema es que no estas usando 0 para dibujar los caminos... debes usar 0... rgb(0,0,0) no es 0.

put_pixel y todas las demas, con drawing_color(0); funciona bien.

edit: perdon, si veo el drawing_map a 0, voy a revisar el codigo
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

que idiota que soy, el mapa de caminos solo puede ser de 8bits de profundidad...

y no deberias usar el mapa 0,0 para eso, mejor es usar un mapa especial para eso.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Tienes razón splinter!

Llevava un rato pensando justo eso, pero por no se que motivo no me atrevía a probar, creo que el principal era la pereza.

Ahora sí que va como la seda.

Desde luego el mayor valor añadido que tiene bennu eres tú.

Muchas gracias.

Danielo515

Por cierto splinter, me parece que si se aplica move_text a un write_var me parece que el valor de la variable no se actualiza. ¿es eso posible?

SplinterGU

move_text solo cambia las coordenadas, no tiene que ver con el lo que muestra... debe ser otra cosa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

Tienes razón, el problema estará en mi programa, no te preocupes, lo revisaré.

Por cierto, volviendo al tema del path find. ¿Tiene alguna limitación especial que yo no sepa?

Es que para un punto dado en una ocasión me funciona sin problemas, pero sin embargo al intentar llegar a ese punto desde otro más lejano me da un error que me provoca un crash.

Creo que había una limitación de distancia, o eso ya se corrigió?

Abram

Creo que crashea si intentas hacer un path_find entre dos puntos que no se pueden conectar