2011-01-28 20 views
9

Quiero comprobar si una línea (o cualquier punto de una línea) está dentro de un rectángulo o se cruza con un rectángulo.Cómo comprobar si algún punto (o parte) de una línea está dentro o toca un rectángulo

Tengo (x0, y0) y (x1, y1) como puntos de inicio y final de una línea. También , (Ax, Ay) y (Bx, By) como los puntos superior izquierda e inferior derecha de un rectángulo

Por ejemplo,

 ____________ 
    |   | 
---|-----  | Result: true 
    |   | 
    |____________| 

    /
    _/__________ 
|/   | 
/   |  Result: true 
/|   | 
|____________| 


    ____________ 
    |   | 
    | -------- | Result: true 
    |   | 
    |____________| ----------  Result: false 

Puede alguien sugerir cómo hacer esto? No quiero saber qué punto es eso, solo quiero saber si está allí o no.

Muchas gracias por la ayuda

+6

+1 por claro ASCII art :) – alex

+0

Un rápido Google para "Cohen Sutherland" debería comenzar en la dirección correcta. –

+0

Considere cada borde como su propio segmento de línea. Entonces, solo es cuestión de determinar la intersección del segmento de línea * y * el caso en el que está completamente contenida. Por supuesto, esto es solo una observación rápida y probablemente no la forma * ideal * de resolver este tipo de intersección (también es una intersección muy común; me sorprendería mucho si esta es una pregunta original ;-) –

Respuesta

5

El primer y tercer casos son triviales - simplemente devuelve true si los puntos finales de la línea se encuentra dentro de la caja (es decir,> Ax y Ay, < BX y por).

El segundo presenta un problema: ya no podemos confiar en los puntos finales de nuestra línea. En este caso, tendremos que probar la línea con cada borde del rectángulo.

La ecuación para nuestra línea será (x1 - x0)*x + (y1 - y0)*y + x0*y0 - x1*y1 = 0, y podemos construir una ecuación similar para cada lado del rectángulo usando las esquinas. A continuación, al sustituir la ecuación por los lados del rectángulo en nuestra línea, obtendremos la intersección.

Finalmente, verificamos que el punto esté dentro de los límites del lado del rectángulo, y también dentro del segmento de línea que estamos considerando.

Hay una explicación más detallada de esto en this discussion.

+2

2) no me parece correcto tome el caso del cuadrado unitario (0,0 a 1,1) frente al segmento (-1,0) - (1,3), por ejemplo. – Jimmy

+0

¡Tienes razón! Eso produciría un falso positivo. Actualizaré mi respuesta. –

+0

Hola muchas gracias por ayuda. – user427969

Cuestiones relacionadas