Re: ¿Existen Los Objetos Seleccionables Dentro De Un DrawingArea?
Hola amigos,
recientemente me encontré con el mismo problema. Aplicaba dos algoritmos seguidos para ver si el cursor estaba dentro de una figura poligonal cerrada:
ALGORITMO 1 (necesario pero no suficiente, sirve sólo para cribar)
1º Calculo un rectángulo envolvente de la poligonal, de coordenadas xmin, ymin, xmax, ymax. Para que el cursor esté dentro de la poligonal es necesario (pero no suficiente) que esté dentro del rectángulo envolvente, y esa comprobación es muy sencilla.
ALGORITMO 2 (necesario y suficiente, sólo para aquellas poligonales que han pasado la primera criba)
1º Contador = 0
2º Trazo, por ejemplo, la semirrecta horizontal derecha que pasa por el cursor.
3º Si algún vértice de la poligonal pasa (ya sería mala casualidad pero a veces se da) exactamente por la semirrecta, trazo otra semirrecta ligerísimamente por encima.
4º Para cada lado de la poligonal:
- Si el lado es horizontal: CONTINUE (es decir, paralelo a la semirrecta, y por lo tanto no la puede cortar, si aplico las ecuaciones de corte de esas dos rectas me daría división por cero, y eso es algo que me hace saltar chispas)
- ELSE:
- Calculo el punto de corte entre la recta que contiene a la semirrecta y la recta que contiene al lado.
- Si el punto de corte entre ambas está dentro de la semirrecta y dentro del lado, entonces incremento en 1 el contador.
5º Si después de hacerlo para todos los lados, el contador es impar, entonces estamos dentro, y si es par estamos fuera. (El que la semirrecta pasase por un vértice haría errar con esta sencilla regla). Es como contar cuantas veces entramos o salimos de la poligonal: si sale impar es que estábamos dentro, si sale par es que estábamos fuera.
Mi algoritmo final era todavía más complicado, ya que mi cursor era un cuadrado de varios píxeles de ancho y alto, y:
- a veces la poligonal entera podía estar dentro de mi cursor cuadrado
- a veces mi cursor cuadrado estaba todo él dentro de la poligonal
- a veces un vértice o varios de mi cursor estaban dentro de la poligonal
- a veces un vértice o varios de la poligonal estaba dentro de mi cursor.
- a veces ningún vértice de la poligonal estaba dentro del cursor, ningún vértice del cursor estaba dentro dela poligonal, y sin embargo algún lado del cursor tocaba a algún lado de la poligonal.
En todos esos casos hacía "touché"
.
Saludos