Autor Tema: Calcular código para GLCD  (Leído 15293 veces)

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

Desconectado Picavid

  • PIC12
  • **
  • Mensajes: 89
    • www.seguridomo.es
Re: Calcular código para GLCD
« Respuesta #15 en: 25 de Noviembre de 2006, 02:52:35 »
Hola,

  Gracias a los dos. Bruno, ya he entendido lo que me habías explicado, gracias.
  PalitroqueZ, creo que lo que quieres hacer, lo puedes hacer con el programa. Te cuento:
   -Apretando el boton izq., trazas lineas,
   - con el derecho, haces puntos,
   - Y, manteniendo pulsada la tecla shift mientras mueves el ratón, trazas a mano alzada.

Saludos,
« Última modificación: 25 de Noviembre de 2006, 02:58:21 por Picavid »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #16 en: 25 de Noviembre de 2006, 05:14:57 »
Bueno, me alegro que hayas comprendido.
Ni vi lo del SHIFT para graficar a mano alzada. Tenes que cambiar los Pset por los rectangle. las coordenadas X1,Y1,X2,Y2 del rectangulo son iguales a las que uso para el click del boton derecho en Picture1_mousedown.

Espero que termine en buen puerto.
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #17 en: 27 de Noviembre de 2006, 15:33:44 »
Bueno amigos, probé el código que ustedes hicieron (GLCD Grafico + Picavid) y le hice una pequeña adaptación de lo que yo quería hacer:



-para dibujar un pixel (un punto cuadrado), usé la api Rectangles y de acuerdo al la escala escogida (Picture1.DrawWidth = Picture1.ScaleWidth / 35) seleccioné como coordenadas del pixel X,Y,X+2,Y+2 y efectivamente dibuja correctamente.

nota: si utilizaba X+1,Y+1 en vez de mostrar rectangulos aparecian circulos, así que fuí tanteando e incrementrando a 2 me aparecía el mínimo necesario para mostrar un punto cuadrado. Creo que esa es la duda que tenía Picavid.

-también le añadí el mismo código al evento mouse_down para dibujar el píxel sin mover
el ratón.

- otra observación, tuve que usar Picture1.Refresh después de la llamada de la api para que dibujara en cada evento.

ahora intento probar como ajustar el picturebox de manera que si ya dibujé en una determinada coordenada no vuelva a tocar ese punto y dibuje el rectángulo completo en la coordenada de al lado.

es que quisiera modificar el programita de caracteres y hacerlo de la manera como ustedes lo estan trabajando, así que iré contestando por aquí 8).

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #18 en: 27 de Noviembre de 2006, 19:13:34 »
Hola Pedro.

- otra observación, tuve que usar Picture1.Refresh después de la llamada de la api para que dibujara en cada evento.

Efectivamente, parecería tener algun bug con el Pen o algo nos falta para poder dibujar más de un rectángulo sin necesidad de tener que poner una función que lo arregle. Yo en el programa en lugar del refresh utilice el Pset en un lugar invisible del PictureBox. Lo hice asi porque me parece que es mas rápido que el Refresh(al menos en mi pc y esto depende mucho de la placa gráfica de cada computadora).

ahora intento probar como ajustar el picturebox de manera que si ya dibujé en una determinada coordenada no vuelva a tocar ese punto y dibuje el rectángulo completo en la coordenada de al lado.

Esto no me quedó claro.
Si usas 3 colores: color de fondo(por defecto) color de pixel apagado y color de pixel encendido, con un Picture1.Point podrías leer el color del pixel acutal y fijarte si corresponde al color de fondo. Si corresponde, dibujas sobre el mísmo. Sino dibujas en el pixel de al lado.

Si sólo usas dos colores: color de pixel apagado y color de pixel encendido(es decir que el color de fondo seria pixel apagado) y deseas que si apagas un pixel no se vuelva a modificar el mísmo sino el pixel de al lado, tendrás que recurrir a una matriz que almacene los pixels ya dibujados para poder comprobarlo.

Saludos.
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #19 en: 28 de Noviembre de 2006, 14:11:41 »
Te comento que en mi pc ambas funciones (Pset y rctangle) me dan el  mismo resultado, si pasas muy rápido el mouse se dibujaran puntos muy separados.

En realidad me estoy basando un poco en el programa fastlcd, supongamos que tienes una coordenda (usando rectangles)

X1,Y1=30,30
X2,Y2=32,32

si yo quisiera dibujar en esa misma coordenada, con una bandera se solucionaría:

if pixel =verde then
 pixel=negro
else
 pixel=verde

pero supongamos que se quiere dibujar el pixel vecino habría que determinar la posición del cursor para que el programa dibuje el pixel vecino y no quede entre 2 pixeles y así no dibuje un pixel entre 2 puntos ¿me explico?

volviendo al fastlcd (que me parece excelente programa) me parece que el picturebox grande lo dividieron en puntos cuadrados que dependen de zoom y otros parametros que el usuario puede cambiar, claro yo no me quiero complicar mucho, solo estoy averiguando como dividir un picturebox en 7x5 puntos cuadrados y que mediante las tecnicas para dibujar que ustedes explican creo que se puede usar también en este caso.

voy a utilizar la propiedad point que mencionas para agregarlo al código que estoy construyendo.

definición:
pixel=punto cuadrado, unidad mínima que forma parte del caracter y es activado al clicar sobre el picturebox

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #20 en: 28 de Noviembre de 2006, 18:07:55 »
Hola PalitroqueZ.

Si miras el codigo fuente del ultimo programa que he hecho, podras ver por ejemplo en el evento mouse_down del Picturebox que el cálculo se hace exactamente como vos lo necesitas.
Yo he utilizado el método del resto(mod) para hacerlo.

Si necesitas hacerlo de 7x5(7 filas, 5 columnas) entonces te recomiendo que el ancho del PictureBox sea múltiplo de 5 y el alto múltiplo de 7. Y ambos en las mismas proporciones:
Ejemplo:
si decides un ancho del PictureBox=10(pixels) el alto del PictureBox debe ser =14(pixels)
si decides un ancho del PictureBox=15(pixels) el alto del PictureBox debe ser =21(pixels)
si decides un ancho del PictureBox=20(pixels) el alto del PictureBox debe ser =28(pixels)

y asi todos los múltipos posibles hasta encontrar el que más cercano se ajuste al tamaño que deseas que tenga el PictureBox.
De esta manera logras cuadrados y perfectamente escalados.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #21 en: 29 de Noviembre de 2006, 12:47:46 »
¡Que barbaro! BrunoF, ¿de donde sacas esas formulas para manejar graficos? :)), muy cierto lo que mencionaste, cambié la resolución a 5 de ancho y 7 de alto y gracias a esa ecuación (la que usa el MOD) los puntos se ajustan a las dimensiones del picturebox.

Bueno ya sé como se hace, lo que voy averiguar ahora, es porque lo hace.

observa que al pintar un punto (en el adjunto de abajo), mientras el cursor se mantenga dentro del punto las coordenadas X1,Y1,X2,Y2 seran constantes, aunque las coordenadas del cursor varien, o sea, esa ecuación hace exactamente eso , de alguna manera, que no  se porque lo hace, mantiene las coordenadas constantes en un rectangulo y por eso es que cuando se está fuera de ese rectangulo, se pinta el punto vecino sin afectar al ya dibujado porque existe una coordenada para cada rectangulo y ningun punto puede tocar al siguiente.

Yo estuve buscando por allí en las paginas de código fuente de VB, todo lo relacionado a manejar graficos mediante estos controles, pero ya me dí cuenta que no revisé bien, jeje. Si tienes algún link donde hablen sobre programación gráfica, sería de ayuda.

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #22 en: 29 de Noviembre de 2006, 18:20:41 »
Hola Pedro.
Pues no las saco de ningun lado...salen de mi cerebrito :P.

Analicé lo que necesitaba, plantié el problema, generé una ecuación que demostraba el comportamiento requerido, y la apliqué al VB.

Te explico cómo funciona.

Supongamos que tienes un PictureBox con un ancho de 20 pixels. Como tu tienes en realidad sólo 5 elementos verticales(columnas) por caracter del LCD, sabemos que cada pixel en realidad debe ocupar 4(20/5)pixels de ancho.

Plantiemos el problema en la recta numérica:

    Pixel 1                 Pixel 2                Pixel 3              Pixel 4               Pixel 5
!------------------!------------------!-------------------!--------------------!-------------------!------------->
0    1    2    3    4    5    6    7    8    9    10   11   12   13   14   15   16   17   18   19  20

Verás que la fórmula que realice es: X - X mod (Picture1.ScaleWidth / 5)

(Picture1.ScaleWidth/5) es una constante siempre y cuando no redimensiones el tamaño o cambies las escalas del PictureBox1.
En este caso sería 20/5= 4.

Entonces tenemos: X1= X- X mod 4
Si te fijas rápidamente, y comienzas a asignar valores a X podrás ver cómo se comporta la función rápidamente:

Si X = 0
X1 = 0 - 0 mod 4
X1 = 0 - 0
X1 = 0

Si X = 1
X1 = 1 - 1 mod 4
X1 = 1 - 1
X1 = 0

Si X = 2
X1 = 2 - 2 mod 4
X1 = 2 - 2
X1 = 0

Si X = 3
X1 = 3 - 3 mod 4
X1 = 3 - 3
X1 = 0

Si X = 4
X1 = 4 - 4 mod 4
X1 = 4 - 0
X1 = 4

Si X = 5
X1 = 5 - 5 mod 4
X1 = 5 - 1
X1 = 4

Si X = 6
X1 = 6 - 6 mod 4
X1 = 6 - 2
X1 = 4

Si X = 7
X1 = 7 - 7 mod 4
X1 = 7 - 3
X1 = 4

Si X = 8
X1 = 8 - 8 mod 4
X1 = 8 - 0
X1 = 8

Si X = 9
X1 = 9 - 9 mod 4
X1 = 9 - 1
X1 = 8

.....

Como puedes ver, X1 sólo adquiere 5 valores posibles: 0, 4, 8, 12 ó 16.
Justamente estos valores son las coordenadas X1 del rectángulo que dibujarás.

La coordenada X2 se hace exactamente igual, solamente que define hasta dónde dibujar el rectángulo. Y siempre será X1 + 4 en este caso.
En fórmulas:
Si X1 =  X - X mod (Picture1.ScaleWidth / 5)
Y X2 = X - X mod (Picture1.ScaleWidth / 5) + (Picture1.ScaleWidth / 5)

Reemplazando X1 en X2 obtenemos:

X2 = X1 + (Picture1.ScaleWidth / 5)

Sabiendo que (Picture1.ScaleWidth / 5) es una constante y vale 4 en este caso, nos queda:

X2= X1 + 4

Lo mísmo hice para el eje Y del PictureBox.


PD. Si utilizas un borde fixed single para el rectángulo(que lo estoy viendo en tu programa), debes añadirle 2 pixels más al ancho y alto del rectángulo, ya que el borde ocupa 1 pixel de cada lado del rectángulo del PictureBox.

Por lo tanto, si por ejemplo tenes un width = 20 y un height = 28, sumale dos a ambos quedando un width = 22 y un height = 30 para que las escalas sean perfectas. Estos son los valores correctos.

Saludos.
« Última modificación: 29 de Noviembre de 2006, 18:23:08 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #23 en: 30 de Noviembre de 2006, 10:58:32 »
Hola BrunoF, con la magistral explicación que das, ya tengo superclaro el porqué usaste la función MOD (yo tengo varios topicos del VB algo crudo y el de los graficos es uno de ellos)

nota: recién acabo de leer tu mensaje, así que tendré en cuenta el ajuste del picturebox.

te comento que hice unos avances anoche, referente al código del que me has ayudado bastante, y lo modifiqué un poco en la parte donde toma el valor del pixel, esta vez jugando con la escala del cual estoy conociendo poco a poco.


pues bien, usé el método point de la siguiente manera:

En el código original usabas una matriz para asignarle las coordenadas X e Y a point
y dependendiendo del resultado de éste (el número del color en ese punto) usabas la
variable binario para conmutar un "1" ó un "0".
Yo lo hice similar, solo que en For anidado y sabiendo que el tamaño del pixel es de 13,
entonces para la coordenada Y (que vendría siendo j) multiplico 7*13

Código: [Seleccionar]
For j = 0 To (7 * 13) Step 14   ' recorre 7 pixeles en pasos de 14
    For i = 0 To (5 * 13) Step 14   ' recorre 5 pixeles en pasos de 14
        If Picture1.Point(i, j) = vbBlack Then  ' pregunta si el pixel es negro
        Binario = Binario & 1
        Else                       
        Binario = Binario & 0 ' es el color del fondo
        End If
    Next i
Next j

Text1.Text = "int const caracter0_datos[8]={"

For i = 1 To 35 Step 5
    Text1.Text = Text1.Text & " " & Mid$(Binario, i, 5)
' toma dentro de la cadena binario y agrupa en nibbles de cada pixel
Next i

como el código que estoy haciendo no requiere de insertar imagenes, pienso que esta manera es sencilla e igual cumple el objetivo. Esto era la parte díficil, aunque todavía quisiera añadirle una cosita más y es lo siguiente:

como todo entorno para dibujar siempre existe la opción de activar la grilla ó cuadrícula, faltaría entonces la posibilidad de añadirle a ese picture box un grid para facilitarle al usuario la ubicación de los pixels.

Creo que eso se haría con el método line, voy a tratar de hacerla.


una observación que quisiera hacer es que cuando dejas apretado el botón izquierdo del mouse y te sales fuera del picture, parece que el evento mouse_move se sigue ejecutando, menos mal que no interfiere en los resultados porque ya se ajustaron las escalas para que no tome datos fuera del recuadro.


el adjunto con el avance que hice anoche :http://www.4shared.com/file/6693548/edb8ab42/crear_caracter_5x7.html


Salu2 y gracias por tenerme paciencia al leer esto, jeje.
Pedro

« Última modificación: 30 de Noviembre de 2006, 11:00:14 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #24 en: 30 de Noviembre de 2006, 18:12:54 »
Hola Pedro.

Si. El mouse_down sigue registrando el boton izquierdo presionado más alla de los límites del PictureBox ya que puedes utilizarlo para hacer un Drag & Drop a medida.

El código para generar la cuadrícula:

Código: [Seleccionar]
Private Sub Cuadricula()

Dim Lineas As Integer

      'Evitar dibujar linea en X=0     'Evitar dibujar linea en X=Picture1.Scalewidth      'se incrementa según el ancho de cada rectángulo
For Lineas = Picture1.ScaleWidth / 5 To Picture1.ScaleWidth - Picture1.ScaleWidth / 5 Step Picture1.ScaleWidth / 5
    Picture1.Line (Lineas, 0)-(Lineas, Picture1.ScaleHeight), vbWhite
Next

    'Evitar dibujar linea en Y=0         'Evitar dibujar linea en Y=Picture1.Scaleheight      'se incrementa según el alto de cada rectángulo
For Lineas = Picture1.ScaleHeight / 7 To Picture1.ScaleHeight - Picture1.ScaleHeight / 7 Step Picture1.ScaleHeight / 7
    Picture1.Line (0, Lineas)-(Picture1.ScaleWidth, Lineas), vbWhite
Next

End Sub

Ahora vas a tener que renegar con la propiedad AutoRedraw...Ya te vas a dar cuenta de lo que digo seguramente.
Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Calcular código para GLCD
« Respuesta #25 en: 04 de Diciembre de 2006, 12:47:16 »
Hola Bruno, aquí estoy de nuevo  :) voy poco a poco, para tener un entendimiento sobre las tecnicas de dibujo. Por ahí tengo un código tuyo sobre hacer graficas para aplicaciones de datos de entrada (por ej RS-232), pero eso lo tengo frenado por los momentos.

ya le agregué la grilla, con el código que posteaste y efecto que noté es que cuando coloco autoredraw=false es lo que explica la ayuda msdn, elimina el gráfico persistente, si minimizo la ventana desaparece todo lo pintado en el picturebox,

ahora cuando autoredraw=true no ví nada raro excepto que el método point falla al tomar los pixel negro y asumo que la linea me consume  una unidad de pixel (ya que scalemode=3), entonces modifiqué el for anidado para vaya en pasos de a 15 (sumando el extremo del rectangulo+linea) y también esta linea (es la que está dentro de los for anidado):

(Picture1.Point(i, j) = vbBlack) Or (Picture1.Point(i, j) = linea_gris)

para que si se consigue con la linea de la cuadricula, no tenga problemas en identificar que hay un rectangulo.

eso si, tuve que llamar al procedimiento cuadricula en casi todos lados para que no se me borre.

Voy a completar el picturebox para un caracter y luego creo una matriz de 8 controles para hacer el código completo

observación: para modificar los valores de scalewidth y scaleheight, no los pude hacer directamente porque la propiedad scalemode se cambia a user en vez de mantenerse a pixel entonces lo que hice fué cambiar los valores de height y width, como hablaste varios mensajes atrás.

aquí está otro adjunto (yo cada rato con mis adjuntos, :))) casi terminado para un carácter, entre las opciones estan:

- posibilidad de mostrar o desaparecer la cuadrícula, grilla o grid.
- posibilidad de abrir/guardar el caracter dibujado, + estado grilla + el lenguaje utilizado* + cantidad de caracteres en un archivo para uso posterior*

* esto si vá para el programa completo


estoy barajando la posibilidad de 5x10, pero ello implicaría modificar las escala del picturebox el cuál cambiaría varias funciones y bueno...  sigo pensando... además con 5x10 lo que se tienen son apenas 4 caracteres, pero eso quedaría para futuro.

bajar_ultimo_avance

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calcular código para GLCD
« Respuesta #26 en: 04 de Diciembre de 2006, 16:46:38 »
¡Hola!

ya le agregué la grilla, con el código que posteaste y efecto que noté es que cuando coloco autoredraw=false es lo que explica la ayuda msdn, elimina el gráfico persistente, si minimizo la ventana desaparece todo lo pintado en el picturebox,

Si. Si minimizas la ventanas o pones otra ventana sobre la grilla verás que desaparece. Esto se debe a que los gráficos no quedan asociados al controlador gráfico del picturebox(hDC) y se pierden.

Dibujar con un autoredraw = false es más rápido que con un autoredraw=true debido a que obviamente no requiere ser registrado en el controlador gráfico del objeto.Por lo tanto es muy útil cuando no te interesa registrarlo ya que sabes que probablemente lo que muestras en pantalla variará constantemente(es decir que lo refrescarás tu cada determinada cantidad de tiempo).
Esto se usa por ejemplo: en los juegos de PC donde la pantalla es redibujada cada cierto tiempo constantemente por lo que no interesa que permanezca en pantalla.

ahora cuando autoredraw=true no ví nada raro excepto que el método point falla al tomar los pixel negro y asumo que la linea me consume  una unidad de pixel (ya que scalemode=3), entonces modifiqué el for anidado para vaya en pasos de a 15 (sumando el extremo del rectangulo+linea) y también esta linea (es la que está dentro de los for anidado):

(Picture1.Point(i, j) = vbBlack) Or (Picture1.Point(i, j) = linea_gris)

para que si se consigue con la linea de la cuadricula, no tenga problemas en identificar que hay un rectangulo.

Podrías haber optado por cambiar:

(Picture1.Point(i, j) = vbBlack)

por:

(Picture1.Point(i+2, j+2) = vbBlack)

Creo que eso hubiese bastado para asegurar que nunca coincida el dato a leer con las líneas de la grilla.

eso si, tuve que llamar al procedimiento cuadricula en casi todos lados para que no se me borre.

Desventajas del autoredraw=false :D

observación: para modificar los valores de scalewidth y scaleheight, no los pude hacer directamente porque la propiedad scalemode se cambia a user en vez de mantenerse a pixel entonces lo que hice fué cambiar los valores de height y width, como hablaste varios mensajes atrás.

Efectivamente, debes modificar el alto y ancho del control. Si modificas el ScaleWidth y/o ScaleHeight cambiarás automáticamente el ScaleMode perdiendo la relación idéntica entre la función Rectangle y el tamaño del PictureBox.

estoy barajando la posibilidad de 5x10, pero ello implicaría modificar las escala del picturebox el cuál cambiaría varias funciones y bueno...  sigo pensando... además con 5x10 lo que se tienen son apenas 4 caracteres, pero eso quedaría para futuro.

Bueno, yo también estaba enroscado con el tema del 5/10. El problema es que según leí en el datasheet del controlador Hitachi al poner el display en modo 5/10 el LCD trabaja con una sóla fila(sólo se usa la primera). Asi que realmente no sé hasta dónde puede ser de utilidad, pero supongo que puede servir para alguien. Nunca se sabe.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.