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

#1 Isidro Muñoz
04/03/2005 - 18:44 | Informe spam
Hola Sergio,

Si no me he enterado mal, lo que quieres que el usuario dibuje a mano alzada
un poligono.

Tendras que hacer:

Ir guardando las lineas que dibujo. Para ello me imagino que tendras que
interceptar el evento de pulsar el raton, y cada vez que lo pulse en un
control ir almacenando el punto donde ha pulsado. Y lo tendras que ir
guardando en una lista todos los puntos que ha pulsado.
yo usuario la libreria standard y usando un vector por ejemplo, y los
elementos de vector serian de tipo Point.

Para dibujarlo tendras tu que hacerlo a mano, a no ser que exista algun
componente que haga este tema.

Saludos.
Isidro.

"Sergio" escribió en el mensaje
news:
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?
Respuesta Responder a este mensaje
#2 Sergio
07/03/2005 - 08:27 | Informe spam
Isidro Muñoz escribió:
Hola Sergio,

Si no me he enterado mal, lo que quieres que el usuario dibuje a mano alzada
un poligono.



Más o menos. Lo del polígono no es problema. Sino lo de la mano alzada,
figuras "libres" que pueden contener curvas y rectas en la misma figura,
como si cogieras el paint y te pusieras a pintar con el ratón lo que
se te pasé por la cabeza. ¿Como hacer eso?
Respuesta Responder a este mensaje
#3 Isidro Muñoz
08/03/2005 - 10:06 | Informe spam
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.

"Sergio" escribió en el mensaje
news:
Isidro Muñoz escribió:
> Hola Sergio,
>
> Si no me he enterado mal, lo que quieres que el usuario dibuje a mano


alzada
> un poligono.
>
Más o menos. Lo del polígono no es problema. Sino lo de la mano alzada,
figuras "libres" que pueden contener curvas y rectas en la misma figura,
como si cogieras el paint y te pusieras a pintar con el ratón lo que
se te pasé por la cabeza. ¿Como hacer eso?

Respuesta Responder a este mensaje
#4 Sergio
08/03/2005 - 11:08 | Informe spam
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.
Respuesta Responder a este mensaje
#5 Willser F. González C.
08/03/2005 - 14:41 | Informe spam
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.
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida