Reconocer areas

03/03/2005 - 17:34 por Sergio | Informe spam
A ver si consigo explicarme bien:
Tengo que hacer un programita para edición de dibujo, concretamente
areas. El usuario puede definir areas, de la forma que quiera,
fusionarlas... y además luego en otro programa usar esas regiones para
saber si un objeto está dentro de esa zona.
El caso es que no se como almacenar esa información, en el caso de las
figuras geométricas no creo que tenga muchos problemas, con CRgn creo
que me las puedo apañar, pero ¿para las zonas que se dibujen a "mano
alzada"? ¿Conoceis algún método para almacenar de una forma eficaz la
ruta trazada por el usuario con el ratón?

Preguntas similare

Leer las respuestas

#6 Sergio
08/03/2005 - 16:10 | Informe spam
Willser F. González C. escribió:
Creo que una buena opción para no guardar algunos puntos mientras se dibuja
una recta vertical u horizontal es tener en cuenta en qué momento la
posición X o Y del mouse cambia con respecto a la anterior, así, en el
momento que varíen las dos posiciones se debe guardar esa nueva posición
como un nuevo punto del polígono que se está dibujando y con base en esa
nueva posición se compararía la siguiente variación.

También podría pensarse en algo parecido con líneas rectas inclinadas, pero
en este caso creo que tendría que recurrir a las funciones Seno y Coseno,
aunque si se trata de dibujo a mano alzada es muy poco probable que se den
este tipo de líneas rectas, pero uno nunca sabe ...

Willser F.




Ok, gracias. Lo tendré en cuenta, aunque como dices, a mano alzada no
creo que se den muchas lineas rectas (habría que tener muy buen pulso) y
para hacer rectas/polígonos/circulos daré una posibilidad explicita para
cada uno de ellos.
Respuesta Responder a este mensaje
#7 Isidro Muñoz
08/03/2005 - 21:07 | Informe spam
Hola Sergio.

Se me olvidaba comentarte que para que no existen tantos puntos puedes poner
un Timer.
Pero perderias exactitud. Todo es cuestion de ir bajando el tiempo hasta que
reduzcas puntos y la imagen no pierda mucho detalle con el marcado por el
ratón. De esa forma te aparecerían más puntos.
Seguro que existe algun algoritmo de optimización de esto pero creo que está
fuera de lugar.

Lo de Canvas a lo mejor no lo he expresado bien.
La técnica es GDI. Busca en la MSDN.
Una vez que tu haz creado una ventana con CreateWindow y tienes su handle.
Si quieres dibujar en la ventana cosas, por ejemplo una línea, un poligono,
rellenar la ventana, poner un bitmap, etc.etc.
Puedes usar varias API, lo normal es que uses GDI.
La idea es que obtengas un handle GDI con la api GetDC pasandole como
parametro el handle a la ventana.
Una vez que tienes este handle DC, llamas a las funciones de dibujo de GDI.
Luego tienes que liberar el handle DC.

Aqui puedes encontrar las funciones para obtener los handle de dispositivo
de contexto DC.
http://msdn.microsoft.com/library/d...s_7e2b.asp

Luego para hacer lineas y curvas estas api
http://msdn.microsoft.com/library/d...v_8bn7.asp

Todo lo referente a GDI lo tienes:
http://msdn.microsoft.com/library/d...t_9ezp.asp


Otra cosa, si usas GDI y modificas el contenido de una ventana ten en cuenta
que cuando esa ventana reciba el evento WM_PAINT, tendrás que dibujar otra
vez todo lo que has dibujado usando GDI.

Espero que hayas captado la idea.

Como MFC es una encapsulacion de la api de windows, si usas MFC me imagino
que los controles gráficos tendran algun método para devolverte un handle de
contexto GDI, si no con que obtener el Handle de ventana podras tu hacerlo
todo. Yo no tengo experiencia con MFC con lo que ahí no te puedo ayudar
mucho.

Saludos.
Isidro.

"Sergio" escribió en el mensaje news:%231$mbb

Isidro Muñoz escribió:
> Hola Sergio.
> Cuando tu pintas a mano alzada lo que en realidad estás almacenando es


una
> lista de puntos que en realidad es un poligono.
>
> La forma de hacerlo o que yo creo que se hace es de la siguiente forma:
>
> 1.- Crea una ventana que sea hija de otra, como si fuera un control. va


a
> ser la zona donde se dibuje a mano alzada.
> 2.- Tendrás que interceptar el evento de pulsar el botón izquierdo del


ratón
> y el evento de moverse el ratón. Me parece que son
> WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MOUSEMOVE
>
> Imaginate que tu criterio es el siguiente: Cuando se pulse el botón
> izquierdo y mientras que esté ese botón pulsado voy a guardar la imagen


que
> ha dibujado y ademas voy a dibujarla por pantalla.
>
> Primero tendrás que esperas a recibir el evento WM_LBUTTONDOWN, cuando


se
> recibida este evento se activa la capturación.
> Esperas al evento WM_MOUSEMOVE, si la capturación está activa vas


guardando
> en un vector la coordenada x e y que te suministra este evento. Para
> dibujarlo tendrás que usar CANVAS y dibujas una linea recta entre el


punto
> anteriormente capturado y el nuevo, Cuando sea el primer punto no tienes


que
> dibujar línea.
> si llega el evento WM_LBUTTONUP terminar la activación. En el vector


tendrás
> almacenados todos los puntos que el usuario ha ido dibujando.
>
> Para la capturación tenrdás que definir una varialbe de tipo static por
> ejemplo dentro del WndProc que guarde si estabamos en capturación o no.


Si
> estas usando una clase puede ser un miembro privado y si no tendrás que


usar
> una variable global.
>
> Si vuelve a pulsar el botón izquierdo tendrás que borrar el polígono que
> tenias o crear otro nuevo, al final tendras una lista de vectores, donde
> cada vector es un poligono introducido por el usuario.
>
> Espero haberme explicado.
>
> Saludos.
> Isidro.

Muchas gracias, era más o menos lo que había pensado, pero preguntaba
porque me parecía excesivo tener que guardar todos los puntos, e igual
había algún método o alguna forma conocida de evitar tener tantos puntos
Lo que no me queda claro que es eso de Canvas, he encontrado algo por
internet, pero relacionado con Java.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida