• Jueves 2 de Mayo de 2024, 20:56

Autor Tema:  Re: Imagen con contorno  (Leído 3210 veces)

chiaravel

  • Miembro MUY activo
  • ***
  • Mensajes: 242
    • Ver Perfil
Re: Imagen con contorno
« en: Lunes 28 de Julio de 2003, 23:31 »
0
Hola a Todos.

Es posible en Visual Basic, insertar una imagen pero que el contorno no sea cuadrado ?

Quiero lograr hacer un mapa con varias provincias pero resulta que los controles image tienen un contorno cuadrado y cuando programo el evento MOUSE_OVER en vez de activarse dentro del contorno de la imagen, se activa dentro del contorno del objeto image.

Alguien sabe como solucionar esto ?, ya que si intercalo y superpongo varios de estos controles para que el usuario se desplaze a traves del mapa y se pinte la provincia en donde se encuentra, muchas veces se termina activando el evento del control equivocado.

Please !!!, alguna sujerencia

Muchas Gracias
Pablo Tilotta
Analista de Sistemas
Argentina

Brroz

  • Miembro de PLATA
  • *****
  • Mensajes: 1058
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #1 en: Martes 29 de Julio de 2003, 08:28 »
0
Podrías probar comprobando el color del punto sobre el que se desplaza o hace click el mouse... En vez de usar muchos controles image, podrías crear una sola imagen con todas las provincias, cada una de un color, luego utilizando la función 'Point' puedes comprobar el color del componente para identificar la provincia.

Algo asi... A ver si te sirve de algo.

acalanto

  • Miembro activo
  • **
  • Mensajes: 80
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #2 en: Martes 29 de Julio de 2003, 09:07 »
0
La solución propuesta de los colores es válida siempre y cuando dos provincias contiguas no tengan el mismo color (no podrías saber en cual de ellas estás).

La solución pasa por que controles dentro de que polígono se encuentra el cursor.

Supongo que conoces las coordenadas (x,y) del contorno de cada provincia que representes en el mapa. Si es así te puedes crear una estructura de datos más o menos de esta forma

type poligono
x as double
y as double
end type

type provincias
id as integer
nombre as string
items as integer
contorno() as poligono
end type

public mymap() as provincias

'Carga los datos

redim mymap(1 to totalprovincias)

'Empiezas a llenar la estructura (esto lo puedes tener en un fichero con el mismo formato.

'ALAVA
mymap(1).id=1
mymap(1).nombre="Alava"
mymap(1).items=10
redim mymap(1).contorno(1 to 10)
'coordenadas del polígono ALAVA
mymap(1).contorno(1).x=1000
mymap(1).contorno(1).y=2000
mymap(1).contorno(2).x)=1200
......
......
mymap(1).contorno(10).x=9600
mymap(1).contorno(10).y)=12300


'BADAJOZ
mymap(2).id=2
mymap(2).nombre="Badajóz"
mymap(2).items=6
redim mymap(2).contorno(1 to 6)
'coordenadas del polígono BADAJOZ
mymap(2).contorno(1).x=500
mymap(2).contorno(1).y=600
mymap(2).contorno(2).x)=560
......
......
mymap(2).contorno(6).x=450
mymap(2).contorno(6).y)=320


'ASI HASTA TENER TODAS LAS COORDENADAS EN LA ESTRUCTURA


Una vez tienes dibujado sobre un objeto PICTURE las provincias con sus colores, datos etc etc.. y escalado a la misma escala que las coordenadas grabadas, deberás de controlar el paso del mouse y cada vez que se mueva llamar a una función parecida a está.


Public Function IdxProvincia(x as double, y as double)

'la x y la y son las coordenadas del ratón sobre el objeto picture

dim i as integer
dim p as integer

for i=1 to total provincias


next i

acalanto

  • Miembro activo
  • **
  • Mensajes: 80
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #3 en: Martes 29 de Julio de 2003, 09:24 »
0
La solución propuesta de los colores es válida siempre y cuando dos provincias contiguas no tengan el mismo color (no podrías saber en cual de ellas estás).

La solución pasa por que controles dentro de que polígono se encuentra el cursor.

Supongo que conoces las coordenadas (x,y) del contorno de cada provincia que representes en el mapa. Si es así te puedes crear una estructura de datos más o menos de esta forma

type poligono
x as double
y as double
end type

type provincias
id as integer
nombre as string
items as integer
contorno() as poligono
end type

public mymap() as provincias

'Carga los datos

redim mymap(1 to totalprovincias)

'Empiezas a llenar la estructura (esto lo puedes tener en un fichero con el mismo formato.

'ALAVA
mymap(1).id=1
mymap(1).nombre="Alava"
mymap(1).items=10
redim mymap(1).contorno(1 to 10)
'coordenadas del polígono ALAVA
mymap(1).contorno(1).x=1000
mymap(1).contorno(1).y=2000
mymap(1).contorno(2).x)=1200
......
......
mymap(1).contorno(10).x=9600
mymap(1).contorno(10).y)=12300


'BADAJOZ
mymap(2).id=2
mymap(2).nombre="Badajóz"
mymap(2).items=6
redim mymap(2).contorno(1 to 6)
'coordenadas del polígono BADAJOZ
mymap(2).contorno(1).x=500
mymap(2).contorno(1).y=600
mymap(2).contorno(2).x)=560
......
......
mymap(2).contorno(6).x=450
mymap(2).contorno(6).y)=320


'ASI HASTA TENER TODAS LAS COORDENADAS EN LA ESTRUCTURA


Una vez tienes dibujado sobre un objeto PICTURE las provincias con sus colores, datos etc etc.. y escalado a la misma escala que las coordenadas grabadas, deberás de controlar el paso del mouse y cada vez que se mueva llamar a una función parecida a está.
si la función te devuelve <> 0, este será el ID de la provincia y a partir de aqui lo que quieras hacer. Si es =0, el cursor no esta dentro de ninguna provincia.
Puede resultar un poco complejo pero desde luego es la solución más elegante y profesional.


NOTA: LAS COORDENADAS DE LOS POLIGONOS DEBEN DE ESTAR ORDENADAS EN SENTIDO DE LAS AGUJAS DEL RELOJ.








Public Function IdxProvincia(x as double, y as double)

'la x y la y son las coordenadas del ratón sobre el objeto picture

dim i as integer
dim p as integer
dim IN as boolean


for i=1 to total provincias
IN=true
for p=1 to mymap(i).items -1
'verificar si el cursor se encuentra siempre
'a la derecha de todos los segmentos del polígono
if disr(mymap(i).contorno(p).x,mymap(i).contorno(p).y,mymap(i).contorno(p+1).x,mymap(i).contorno(p+1).y, x, y) < 0 then IN=FALSE
next p
if IN=true then IdxProvincia=i:exit function
next i
'El cursor no está dentro de ningún contorno
idxProvincia=0
end function

'=================================================================
'ESTA FUNCION CALCULA LA DISTANCIA DE UN PUNTO A UNA RECTA DADA
'===================================================================
Private Function Disr(x1 As Double, y1 As Double, x2 As Double, y2 As Double, XP As Double, YP As Double) As Double

    'Variables temporales
    Dim Ap As Double
    Dim a As Double
    Dim b As Double
    Dim c As Double
   
    On Error Resume Next
   
    'Calcular los parámetros de la ecuación
    'de la recta enviada.
    Ap = (y1 - y2)
    a = -Ap
    b = (x1 - x2)
    c = -((y1 * b) - (x1 * Ap))

    'Calcular la distancia del punto a la recta
    If Sqr((a ^ 2) + (b ^ 2)) = 0 Then
        Disr = 0
    Else
        Disr = ((a * XP) + (b * YP) + c) / Sqr((a ^ 2) + (b ^ 2))
    End If

End Function

chiaravel

  • Miembro MUY activo
  • ***
  • Mensajes: 242
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #4 en: Martes 29 de Julio de 2003, 16:40 »
0
Quiero Agradecer tanto a Brroz como a Acalanto por las ayudas.

La ayuda de Brroz la descarto ya que mi mapa contiene provincias del mismo color, pero igual es interesante para aprender el uso del point.

La ayuda de Acalanto me sorprendio por la dedicacion que le puso y el tiempo que le debe haber llevado, por eso te doy las gracias.

La voy a probar y te cuento, ya que no poseo muchos conocimientos de geometria y tendre que copiar textualmente las ecuaciones para ver si funcionan.

Nuevamente Muchas Gracias a los 2.

PD : Se aceptan mas sujerencias.

:gracias:
Pablo Tilotta
Analista de Sistemas
Argentina

acalanto

  • Miembro activo
  • **
  • Mensajes: 80
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #5 en: Martes 29 de Julio de 2003, 21:34 »
0
La función Disr() funciona tal y como está ya que te la he copiado de mis librerias y yo la utilizo mucho y además a pleno rendimiento. Nunca me ha fallado.

El resto esta escrito 'al vuelo', por lo que puedo haber cometido algún error, bien sea éste sintáctico o lógico.

Si te es de ayuda, da por bien empleado mi tiempo.

NOTA se me olvido indicarte que los parámetros que se le pasan a la función son tres puntos definidos por sus coordenadas (Planas no geográficas). Los dos primeros pares (x,y) son los que definen la recta. El tercero es el del punto que se desea proyectar sobre ésta.


Un cordial saludo
-Acalanto-

chiaravel

  • Miembro MUY activo
  • ***
  • Mensajes: 242
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #6 en: Martes 29 de Julio de 2003, 21:37 »
0
Muchas Gracias

Voy a tener que hacer un curso acelerado de Geometria pero esta bueno..

Muchas Gracias por tu tiempo.

Luego te digo como me fue.

Un Abrazo

:gracias:
Pablo Tilotta
Analista de Sistemas
Argentina

Miguel P.

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #7 en: Miércoles 30 de Julio de 2003, 00:33 »
0
Un pequeño apunte de un matemático.

La geometría puede ser euclidiana (plana) o no, pero todas son 'geometrías' puesto que se basan en la medida y no en la estructura o propiedades (eso sería topología). La geometría plana se basa en los postulados de Euclides, que aún siendo erróneos, nos proporcionan unos resultados bastantes aproximados a la realidad utilizando herramientas de fácil comprensión (algo parecido a la teoría de Newton, equivocada como demostró Eistein, pero funcional a escalas relativamente pequeñas). En conclusión, un espacio geométrico es cualquier región definida sobre una superficie regular, se plano o no.

Perdonad por el rollo, pero la profesión tira, y es un error muy frecuente relacionar la geometría sólo con líneas rectas.

acalanto

  • Miembro activo
  • **
  • Mensajes: 80
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #8 en: Miércoles 30 de Julio de 2003, 19:11 »
0
Efectivamente, las ecuaciones que propongo no son sino un pequeño y humilde apunte de las teorías de Euclides y probablemente de Bolyai, Gauss y Lobachevsky (con algunas variantes g¡hacia la curvatura por parte de estos últimos). La linea recta por no existir, no existe ni en el dibujo artístico y solamente se trata de una simplificación para definir cosas en el plano, Lamentablemente la tierra y supuestamente el Universo (o al menos lo que podemos conocer de él), tiene forma elíptica/esférica formada por círculos máximos (Geóide y factores de anafmorfosis para los más puestos en la matería). Si no somos capaces de entender a Rienmann tampoco podemos entender cosas como la teoría de la relatividad (Se desarrolla en un espacio curvo).

No obstante si no tuviéramos a mano la linea recta (por pequeña que ésta sea), algunos problemas no tendrían solución ni tan siquiera utilizando tandems de ordenadores, por muchos años de trabajo que le dedicaran.

Por lo tanto !!Viva la Recta!! que en algunos casos simplifica las cosas.

Un cordial saludo a to@s
-Acalanto-

chiaravel

  • Miembro MUY activo
  • ***
  • Mensajes: 242
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #9 en: Miércoles 30 de Julio de 2003, 21:44 »
0
Si por una consulta de mapa de bits se produjo tanto despliegue de conocimientos, voy a dejar la pregunta de "COMO FUNCIONA el CEREBRO HUMANO" para otro momento.

JA JA

:o

Ahora, luego de tanta "PORNOGRAFIA CULTURAL" me siento un ignorante !!!

Un Abrazo para los dos y muchas gracias

:bravo:
Pablo Tilotta
Analista de Sistemas
Argentina

J.M.Movilla

  • Miembro MUY activo
  • ***
  • Mensajes: 427
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #10 en: Miércoles 30 de Julio de 2003, 22:56 »
0
Y yo que estaba tan contento porque todavía recuerdo el algoritmo de Euclides para obtener el m.c.d....

Entre Miguel y Acalanto me han dado un repaso que tengo que dar un suspiro para que me entre el aire...

Ya decía yo que este foro tiene enjundia. Para mí que es muy difícil encontrar otro con tanta masa gris.  Sigamos comunicando nuestros conocimientos, aunque nadie nos diga que nos han comprendido o que somos incomprensibles...  (yo, de paso, a Acalanto y Miguel tengo que decirles me han parecido catedráticos los dos; porque, sin haberles entendido ni palabra, me ha encantado su disertación...  Para otro día más, por favor).

Miguel P.

  • Nuevo Miembro
  • *
  • Mensajes: 23
    • Ver Perfil
Re: Imagen con contorno
« Respuesta #11 en: Jueves 31 de Julio de 2003, 03:14 »
0
Es cierto que la tierra es un geóide, y como tal, todas las distancias en ella se calculan con geodésicas (como hace la aviación actual). Pero también es cierto que las autopistas se calculan con splines cúbicos de sundo grado (es decir, haciendo que su segunda derivada se anule en los puntos críticos), como dijo Newton.

De todas maneras, pienso como tú, si estudiáramos un pelín mas a Riemman y no a Michael Jordan, todos entenderíamos mejor este mundo en el que nos tocó vivir.

PD: El análisis matemático no es mi favorito (así que Riemman tampoco), pero admiro a todos aquellos que se ganaron, ganan o ganarán la vida PENSANDO.

Cambiemos la frase "tengo dos cojones" (o lo que corresponda, lo digo por si lo lee Ángeles) por "tengo dos cerebros".

MiguelPG

  • Miembro activo
  • **
  • Mensajes: 93
    • Ver Perfil
Imagen con contorno
« Respuesta #12 en: Viernes 1 de Agosto de 2003, 20:07 »
0
"Asustao" me habeis dejado.
Y yo que presumía de ser un buen matemático me acabo de desinflar del todo.
Ahora en serio: dá gusto ver que el foro es algo más que intercambio de simples líneas de código dejando tambien paso a las ilustraciones culturales por parte de quienes pueden hacerlo.
Un saludo a todos y perdón por mi intromisión.