Autor Tema: Ayuda con interpolacion  (Leído 4977 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Ayuda con interpolacion
« en: 17 de Septiembre de 2006, 22:16:01 »
Hola, estoy a vueltas con mi GLCD de 128x64. Primeramente prove a usar la libreria que incorpora CCS y no obtube el resultado deseado, en realidad con esa libreria me encendia pixeles al azar, por lo que me he aventurado en hacer mi propia libreria.

Despues de mucha busqueda en internet acerca de como funciona mi cacharrito, mi libreria ya consigue con exito inicializar el GLCD, rellenar la pantalla y vaciarla y lo que me ha costado mas, iluminar el pixel que quiera, dandole previamente las coordenadas X e Y.

Ahora mi proximo paso es darle dos puntos y que me dibuje una recta, pero ahi es donde me doy de bruces con la matematica discreta xD, se me da muy bien sacar ecuaciones de rectas, pero con puntos infinitos :mrgreen: , necesito toda la informacion que pueda sobre interpolacion de rectas, ya que no puedo decir que me ilumine pixel y medio jajaja.

Os pongo el ejemplo sobre el que estoy haciendo las pruebas, a ver si a alguien se le ocurre algo:

Quiero unir los puntos (3,1) y (7,10). Para ello saco la ecuacion de la recta que me da (comprobado) Y=(9/4)X -(23/4)

Sacando valores:

X | Y
3 | 1
4 | 3.25
5 | 5.5
6 | 7.75
7 | 10

Con estos valores ilumino los puntos (3,1)(4,3)(5,5)(6,7)(7,10), pero se ve el hueco entre puntos y ahi es donde no se como seguir. Espero haber sido bueno en la explicacion de lo que quiero hacer.

Muchas gracias por anticipado y saludos.

Tutoriales y proyectos de electrónica

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
Re: Ayuda con interpolacion
« Respuesta #1 en: 17 de Septiembre de 2006, 22:27:54 »
No necesitas interpolar.Una opción sería aplicar la función de tu recta con cada uno de los puntos del intervalo (en X ó en Y,lo mismo da) y redondear hacia arriba o hacia abajo,dependiendo de si el resultado es más cercano al entero inmediatamente inferior ó al inmediatamente superior.
¿Cómo lo ves?


Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Ayuda con interpolacion
« Respuesta #2 en: 17 de Septiembre de 2006, 22:52:17 »
No es efectivo en todos los casos, en el mismo ejemplo en todos los puntos cumpliria su funcion el redondeo, pero fijate en los dos ultimos puntos (6, 7.75) y (7,10). Si redondeara podria cojer los puntos (6,7) (6,8) y (7,10) con lo que me quedaria una fila (la de la coordenada y=9) sin pixel encendido, con lo que me quedaria un hueco.

Muchas gracias, a ver si entre todos sacamos algo en claro y cuando tenga la libreria os la pongo para el uso general.

Saludos.

Tutoriales y proyectos de electrónica

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: Ayuda con interpolacion
« Respuesta #3 en: 17 de Septiembre de 2006, 23:46:07 »
Lo que necesitas se conoce como algoritmo de Bresenham y se utiliza desde hace mucho tiempo. Es la forma más óptima de trazar una recta entre dos puntos. El algoritmo te lo dejo en un fichero que puedes descargar desde aquí:

http://www.4shared.com/file/3806647/2dbdd41e/algoritmo_de_bresenham.html

Tiene explicado el algoritmo e implementado en pascal (no es muy dificil pasarlo a "C" u otro lenguaje).

Un saludo
« Última modificación: 17 de Septiembre de 2006, 23:49:05 por jfh900 »
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: Ayuda con interpolacion
« Respuesta #4 en: 18 de Septiembre de 2006, 02:32:01 »
Cuando yo he tenido que resolver ese problema, siempre he mirado cuál es el eje con más pixeles por recorrer, que en tu caso es el eje Y.

A continuación hago un bucle desde Y=1 hasta Y=10 y que me vayan saliendo todas las X redondeadas; muchas X serán repetidas pero como las Y son distintas los píxeles serán diferentes.

No conozco al tal Bresenham pero supongo que su método no distará mucho.

Desconectado Azicuetano

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1020
    • Aplicaciones Electrónicas en Alicante.
Re: Ayuda con interpolacion
« Respuesta #5 en: 18 de Septiembre de 2006, 04:26:36 »
El algorítmo Bresenham lo tube que implementar en mi proyecto hace unos años y es la forma más precisa y rápida, como dice jfh900, de trazar una recta entre 2 puntos.

Un saludo desde Alicante.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Ayuda con interpolacion
« Respuesta #6 en: 18 de Septiembre de 2006, 10:20:59 »
Muchas gracias compañeros, no tenia ni idea de tal algoritmo. Ahora a entenderlo e implementarlo en C y despues a por las curvas.

Saludos.

Tutoriales y proyectos de electrónica

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: Ayuda con interpolacion
« Respuesta #7 en: 18 de Septiembre de 2006, 15:26:30 »
Jeje, tras leerlo me alegro ver que mi algoritmo y el del famoso Bresenham son el mismo.
Lástima que a él se le ocurrió resolverlo y ponerle nombre, y a mí sólo resolverlo :D

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Ayuda con interpolacion
« Respuesta #8 en: 19 de Septiembre de 2006, 00:01:25 »
Pues si nocturno xD, me lei el pdf e intente convertir a C el codigo en pascal. Como de pascal ni idea y de C soy aun neofito pues no me dio resultado. Entonces recorde tus sabias palabras y las traduje punto por punto a lenguaje C y asi si funciono (bueno, a medias, pero no era esta la que falla sino la de pintar un pixel). Muchas gracias a todos por la ayuda.

Os cuento mi problema con la funcion pixel, recien descubierto tras probar la funcion de dibujar una linea. El chipset de mi glcd es el ks0108, para el que le sirva de ayuda comento brevemente como funciona. El display tiene 8 pines de datos, uno de R/W, el  E (enable), el de D/I(instrucciones o datos),  CS1 y CS2 (la pantalla va dividia en dos partes iguales, es decir lleva dos chipset y seleccionas el que quieres poniendo a nivel alto uno u otro) y una patilla de reset.

Primero hay que inicializarlo, pero eso no es problema, solo hay que seguir el datasheet y hacer lo que dice para inicializar. Ademas, despues descubri que era la unica funcion de glcd.c de ccs que me valia ya que me salio igual que esta.

Luego viene lo interesante, que es encender el pixel. La pantalla es de 128x64 y esta dividida de la siguiente forma. CS1 y CS" actuan como si fueran 2 pantallas distintas de 64x64, cada una de estas pantallas se subdivide de la siguiente forma: el eje y tiene 64 direcciones de memoria, una por coordenada (es el facil), el raro es el x que esta dividido en 8 paginas de direcciones y cada pagina en otras 8 direcciones.

La manera de pintar el pixel es la siguiente:

-Selecciono modo instruccion (D/I)
-Meto la direccion de la coordenada Y (0-63)
-Meto la pagina de direcciones de X (0-7)
-Selecciono modo datos
-Meto el byte de direccion. Como solo quiero activar un pixel de los 8 posibles en realidad lo que meto es un byte donde todo son 0 excepto el que quiero iluminar.

Con esto me funcionaba muy bien, he conectado la pantalla por USB y me he hecho un programita en VC++ en el que escribo una coordenada y sale en el display, hasta aqui todo perfecto. El problema es cuando quiero hacer la linea, mientras lo que varie sea la coordenada Y, no hay problema, me sigue pintando los pixeles, el problema es cuando quiero pintar dos pixeles de la misma pagina de direcciones de X. Como dije el byte de dirreccion esta formado por todo 0 y el uno que quiera encender, al volver a introducir una nueva coordenada, el que antes era un 1 ahora es 0 con lo que no me deja ese pixel iluminado. Asi que me toca seguir pegandome con ello, ya os contare.

PD:La verdad es que me esta picando bastante el tema, me lo estoy pasando como un enano y me da que como llegue a buen puerto me voy a por una touch screen o un TFT xD.

Saludos.

Tutoriales y proyectos de electrónica

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: Ayuda con interpolacion
« Respuesta #9 en: 19 de Septiembre de 2006, 02:23:55 »
¿Tienes la posibilidad de leer lo que hay en la pantalla antes de escribir?, si es así podrías hacer un OR de tu byte con el que has leído y volver a escribirlo, de esta manera no borrarías el pixel que ya hubiera en la pantalla.

Si no tienes la posibilidad de leerlo, lo único que se me ocurre es que hagas una "memoria de vídeo virtual" en tu PIC, o sea, un array con todos los bytes del display. Compones la imagen en la memoria del PIC y luego vuelcas todos los bytes de un golpe.

En una ocasión estuve escribiendo una librería para un LCD gráfico sin controlador, parecido al tuyo, y con el método de la memoria de vídeo todo salía perfectamente y se disminuían los parpadeos.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Ayuda con interpolacion
« Respuesta #10 en: 19 de Septiembre de 2006, 19:26:33 »
Si, como dije tiene la funcion R/W. Lo de hacer una OR es la solucion, el tema es que solo debe hacer OR cuando deba xD, pero con esta idea que me has dado se me esta ocurriendo como hacerlo.

Muchas gracias.

Tutoriales y proyectos de electrónica

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18271
    • MicroPIC
Re: Ayuda con interpolacion
« Respuesta #11 en: 20 de Septiembre de 2006, 02:26:35 »
No tienes porqué hacer un OR cuando haya algo pintado; lo puedes hacer siempre con independencia de lo que haya.

Desconectado 5GTT

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 915
Re: Ayuda con interpolacion
« Respuesta #12 en: 20 de Septiembre de 2006, 19:31:53 »
Me refiero a esto:

http://img54.imageshack.us/my.php?image=paginaswu4.jpg

Solo me interesa el OR mientras la coordenada X vaya variando (sin variar Y) dentro de la misma pagina, si se cambia de pagina deberia empezar de nuevo y asi sucesivamente.

EDITO: Ya entiendo nocturno lo que quieres decir, el tema esta en leer la pagina que este usando en ese momento y hacer OR, asi si cambio de pagina al leer el BYTE sera 0 y no tendre que preocuparme de los cambios de pagina. Estoy espesito xD
« Última modificación: 20 de Septiembre de 2006, 19:35:03 por 5GTT »

Tutoriales y proyectos de electrónica