Alguien que sepa GDI+

16/08/2004 - 18:30 por Fernando Balderrama | Informe spam
Tengo trazadas varias rectas y quiero que al hacer clic sobre una de ellas,
identifique cual de las rectas es.
He tratado de aplicar el concepto de Region asignando una a cada recta, pero
al tratarse de una recta parece que la region no se crea, es decir, no
existe el area que contiene la recta.

Alguien puede ayudarme?

Gracias


Fernando

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
16/08/2004 - 19:32 | Informe spam
"Fernando Balderrama" escribió en el
mensaje news:
Tengo trazadas varias rectas y quiero que al hacer clic sobre una de


ellas,
identifique cual de las rectas es.
He tratado de aplicar el concepto de Region asignando una a cada recta,


pero
al tratarse de una recta parece que la region no se crea, es decir, no
existe el area que contiene la recta.

Alguien puede ayudarme?




Hola, Fernando:

En realidad se bien poco sobre GDI+. Pero me da la impresión de que lo de
las áreas no te debe funcionar (no me hagas mucho caso, pero creo que las
areas son rectangulares y como dos rectangulos se solapen no sabrás de qué
recta se trata).

Si almacenas las rectas como un arreglo (x1, y1, x2, y2), o (Point1,
Point2), podrías, dado un click en un punto, "preguntar" a cada recta si el
punto le pertenece.

Public Function PuntoEnRecta(candidato As PointF, Recta As RectangleF) As
Boolean
If candidato.X < Recta.Left OrElse candidato.X > Recta.Left +
Recta.Width _
OrElse candidato.Y > Recta.Top + Recta.Height OrElse Candidato.Y <
Recta.Top Then
Return False ' No esta dentro del rectangulo que encierra la recta
End If
' Calculamos la posición de Y en función de X:
' Las coordenadas verticales en GDI van al reves de las coordenadas
tradicionales
' como quiero usar una formula "tradicional" convierto las coordenadas:
Dim yx As Single, y1 As Single = Recta.Y + Recta.Height
yx = y1 + (PointF.X - Recta.Left) * Recta.Height / Recta.Width
' Ahora vuelvo a convertir yx al plano GDI+
yx = Recta.Y + Recta.Height - yx

Return (yx = candidato.Y)
End Function

no tengo cabeza (ni tiempo) para determinar si la conversión de GDI a
cartesiano y de cartesiano a GDI de verdad funciona.

Un último consejo es que determines la igualdad en la comparacion de retorno
con un margen de tolerancia, es decir (Abs(yx-candidato.Y) < Margen), si es
que pretendes reaccionar a un evento del mouse.

Despues puedes empacar tu conjunto de rectas en una clase con su array, e
implementar esta operación a nivel de la clase.

Salud!

Leonardo
[MVP Visual Basic]
leonardo<arroba>mvps<punto>org
Respuesta Responder a este mensaje
#2 Fernando Balderrama
18/08/2004 - 00:03 | Informe spam
Creo que esa es la manera de hacerlo, pensé que con 'Region' se me ivan a
facilitar las cosas pero veo que no es así.
Gracias por tus consejos.

Fernando

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:

"Fernando Balderrama" escribió en el
mensaje news:
> Tengo trazadas varias rectas y quiero que al hacer clic sobre una de
ellas,
> identifique cual de las rectas es.
> He tratado de aplicar el concepto de Region asignando una a cada recta,
pero
> al tratarse de una recta parece que la region no se crea, es decir, no
> existe el area que contiene la recta.
>
> Alguien puede ayudarme?


Hola, Fernando:

En realidad se bien poco sobre GDI+. Pero me da la impresión de que lo de
las áreas no te debe funcionar (no me hagas mucho caso, pero creo que las
areas son rectangulares y como dos rectangulos se solapen no sabrás de qué
recta se trata).

Si almacenas las rectas como un arreglo (x1, y1, x2, y2), o (Point1,
Point2), podrías, dado un click en un punto, "preguntar" a cada recta si


el
punto le pertenece.

Public Function PuntoEnRecta(candidato As PointF, Recta As RectangleF) As
Boolean
If candidato.X < Recta.Left OrElse candidato.X > Recta.Left +
Recta.Width _
OrElse candidato.Y > Recta.Top + Recta.Height OrElse Candidato.Y <
Recta.Top Then
Return False ' No esta dentro del rectangulo que encierra la recta
End If
' Calculamos la posición de Y en función de X:
' Las coordenadas verticales en GDI van al reves de las coordenadas
tradicionales
' como quiero usar una formula "tradicional" convierto las


coordenadas:
Dim yx As Single, y1 As Single = Recta.Y + Recta.Height
yx = y1 + (PointF.X - Recta.Left) * Recta.Height / Recta.Width
' Ahora vuelvo a convertir yx al plano GDI+
yx = Recta.Y + Recta.Height - yx

Return (yx = candidato.Y)
End Function

no tengo cabeza (ni tiempo) para determinar si la conversión de GDI a
cartesiano y de cartesiano a GDI de verdad funciona.

Un último consejo es que determines la igualdad en la comparacion de


retorno
con un margen de tolerancia, es decir (Abs(yx-candidato.Y) < Margen), si


es
que pretendes reaccionar a un evento del mouse.

Despues puedes empacar tu conjunto de rectas en una clase con su array, e
implementar esta operación a nivel de la clase.

Salud!

Leonardo
[MVP Visual Basic]
leonardo<arroba>mvps<punto>org


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