locked
¿Como pintar en pantalla la trayectoria de una imagen? RRS feed

  • Pregunta

  • Hola que tal mi idea es pintar en patalla la trayectoria de una imagen que manipula el usuario y que esa imagen que se pinte en pantalla la compare con otra imagen y checar si son parecidas para asi realizar acciones en el juego muchas gracias espero puedan ayudarme saludos si no me explique adecuadamente he grabado lo que quiero realizar aqui:

    http://www.youtube.com/watch?v=U-AIpDzC2v0

    gracias

    sábado, 30 de abril de 2011 16:25

Respuestas

  • Buenas,

    Intentaré a responderte a las 2 que he entendido que has hecho:

    1 ¿Cómo pintar lineas 2D con XNA?

    La API de XNA no trae nada para pintar lineas 2D, pero eso no significa que no se pueda hacer simplemente es que la API en ese tema es más de bajo nivel y tendrás que implementarte tu esa funcionalidad, puedes hacerlo de 2 formas:

     - Usando el spriteBatch a modo de raster y utilizando algoritmos de raster para pintar en 2D, en este enlace hay código fuente de como hacer eso: http://forums.create.msdn.com/forums/t/7414.aspx

    Simplemente vas pintando sobre una especie de matrix pixel a pixel.

     

    - La otra forma de hacer, más eficiente es usando geometría en 3D (vertices y aristas) pero con Z = 0 de forma que da la sensación que está en 2D.

    Aquí te dejo un enlace donde explica como hacerlo y hay código fuente: http://blogs.msdn.com/b/manders/archive/2007/01/07/lines-2d-thick-rounded-line-segments-for-xna-programs.aspx

     

    2 ¿Cómo comparar dos trazos en XNA?

    Para comparar trazos te recomiendo una simplificación de algoritmos OCR, es decir tienes la lista de puntos de los dos trazos que quieres comparar, pues una forma de hacerlo sería:

    - Transladas la lista de puntos al mismo sitio, por ejemplo transladando el primer punto al origen (0, 0).

    - Para poder comprar las listas de puntos necesitas tener el mismo número de puntos en los dos conjuntos, por lo que el siguiente paso sería coger ambos trazos y sustituirlos por una lista de un número de puntos fijo por ejemplo 32 equidistantes en el espacio.

    - Por último podríamos calcula la distancia euclidea entre los 32 puntos de un trazo con los 32 puntos del otro trazo, y si esta distancia es mejor de un umbral de presición lo puedes dar por correcto.

     

    Saludos


    MVP XNA/DirectX

    Blog

    XNACommunity

    domingo, 1 de mayo de 2011 7:53
    Moderador

Todas las respuestas

  • Buenas,

    Intentaré a responderte a las 2 que he entendido que has hecho:

    1 ¿Cómo pintar lineas 2D con XNA?

    La API de XNA no trae nada para pintar lineas 2D, pero eso no significa que no se pueda hacer simplemente es que la API en ese tema es más de bajo nivel y tendrás que implementarte tu esa funcionalidad, puedes hacerlo de 2 formas:

     - Usando el spriteBatch a modo de raster y utilizando algoritmos de raster para pintar en 2D, en este enlace hay código fuente de como hacer eso: http://forums.create.msdn.com/forums/t/7414.aspx

    Simplemente vas pintando sobre una especie de matrix pixel a pixel.

     

    - La otra forma de hacer, más eficiente es usando geometría en 3D (vertices y aristas) pero con Z = 0 de forma que da la sensación que está en 2D.

    Aquí te dejo un enlace donde explica como hacerlo y hay código fuente: http://blogs.msdn.com/b/manders/archive/2007/01/07/lines-2d-thick-rounded-line-segments-for-xna-programs.aspx

     

    2 ¿Cómo comparar dos trazos en XNA?

    Para comparar trazos te recomiendo una simplificación de algoritmos OCR, es decir tienes la lista de puntos de los dos trazos que quieres comparar, pues una forma de hacerlo sería:

    - Transladas la lista de puntos al mismo sitio, por ejemplo transladando el primer punto al origen (0, 0).

    - Para poder comprar las listas de puntos necesitas tener el mismo número de puntos en los dos conjuntos, por lo que el siguiente paso sería coger ambos trazos y sustituirlos por una lista de un número de puntos fijo por ejemplo 32 equidistantes en el espacio.

    - Por último podríamos calcula la distancia euclidea entre los 32 puntos de un trazo con los 32 puntos del otro trazo, y si esta distancia es mejor de un umbral de presición lo puedes dar por correcto.

     

    Saludos


    MVP XNA/DirectX

    Blog

    XNACommunity

    domingo, 1 de mayo de 2011 7:53
    Moderador
  • Para hacer la parte 2, puedes usar una red neuronal, por ejemplo de Kohonen. No deberia ser demasiado complicada de entrenar y validar y funciona muy bien para algo sencillo como tienes en mente.
    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    domingo, 1 de mayo de 2011 13:00
    Moderador
  • red neuronal de kohonen? xD   tiene que ser fuertecita...  xD
    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    martes, 3 de mayo de 2011 6:22
  • Bueno, no lo he hecho nunca, pero a mi lo que se me ocurre es discretizar la imagen, y coger parte de la idea de javi.

     

    Basicamente, divides la imagen en cuadros grandes, por ejemplo 32x32, para cada cuadro determinas cuantos pixeles has pintado y cuantos no, y en funcion del porcentaje de pixeles del cuadro que esten pintados, activaras el ese cuadro o no. Pufff.... vaya explicacion... voy a hacer un dibujo.

    Free Image Hosting by FreeImageHosting.net

     

    Pues eso, que primero hacemos el gris, y marcamos los cuadros segun el porcentaje de imagen que contengan.

     

    Y luego, haria un algoritmo de forma, que marque como correctos los cuadros que coinciden entre la imagen del usuario y la que quiera llegar, y el resto los validaria si estan a un cuadro de distancia de uno valido, o algo asi.

    Si las imagenes que quieres contrastar son muy diferentes entre si no deberia de dar muchos problemas, aunque haya que ajustar un poco el metodo y sobre todo definir cuando esta ok, se podrian hacer mil cosas para ajustar, como hacer los cuadros mas pequeños o mas grandes, es cuestion de probar.

    Esto es por donde yo hubiera empezado, solo lo pongo por si te aporta algo. :)

     

     


    Tambien conocido como Blau www.youtube.com/malditis www.charcostudios.com
    martes, 3 de mayo de 2011 18:31
  • Una vez tienes lo de los cuadros que comenta Blau, en serio, con una red neuronal es muy facil decidir si el trazo representa el patron esperado o no :) La wikipedia cuenta bastante del tema, y hay mil enlances por internet.

    http://en.wikipedia.org/wiki/Self-organizing_map


    Vicente Cartas Espinel - MVP XNA/DirectX

    Twitter - VicenteCartas

    Blog about C# and XNA Development

    Blog about Role Playing Games

    martes, 3 de mayo de 2011 20:26
    Moderador
  • Hey muchas gracias a todos por sus sugerencias en breve les mostrare si pude realizarlo saludos
    sábado, 7 de mayo de 2011 3:36