5 votos

Averiguar si un triángulo está dentro de un rectángulo

Así que se me ocurrió esta pregunta, pero no encontré ninguna respuesta. ¿Qué podría hacer para comprobar si un triángulo está dentro de un rectángulo, si los puntos del rectángulo se dan (A,B,C,D), y los puntos del triángulo también (a,b,c), donde: $$A=(X_1,Y_1)\\ B=(X_2,Y_2)\\ C=(X_3,Y_3)\\ D=(X_4,Y_4) \\a=(x_1,y_1)\\ b=(x_2,y_2)\\ c=(x_3,y_3)$$

1 votos

Basta con comprobar si los vértices del triángulo pertenecen al rectángulo.

1 votos

Utiliza una rotación para que los lados de $ABCD$ paralela al eje de coordenadas. Entonces es fácil comprobar si un vértice se encuentra en el rectángulo.

4voto

David K Puntos 19172

He aquí un enfoque basado en la aritmética vectorial que no requiere que averiguar cómo rotar el rectángulo paralelo a los ejes de coordenadas.

Este enfoque hace requieren que identifiques dos vértices que estén en diagonal opuestos entre sí. Si los vértices se dieran en el sentido de las agujas del en el sentido de las agujas del reloj, esto es fácil: $A$ y $C$ son diagonalmente opuestas. Para lo que sigue supondré que los vértices están etiquetados de modo que efectivamente $C$ es diagonalmente opuesto a $A$ .

Sea \begin{align} u_1 &= X_2 - X_1, \\ v_1 &= Y_2 - Y_1, \\ u_2 &= X_4 - X_1, \\ v_2 &= Y_4 - Y_1. \end{align}

Calcula ahora las cuatro cantidades siguientes: \begin{align} a_1 &= X_1 u_1 + Y_1 v_1 , \\ b_1 &= X_2 u_1 + Y_2 v_1 , \\ a_2 &= X_1 u_2 + Y_1 v_2 , \\ b_2 &= X_4 u_2 + Y_4 v_2 . \end{align}

Ahora a saber si algún punto $(x_k, y_k)$ está en el rectángulo, calcula \begin{align} p_1 &= x_k u_1 + y_k v_1 , \\ p_2 &= x_k u_2 + y_k v_2 . \end{align} El punto $(x_k, y_k)$ está dentro del rectángulo si y sólo si $a_1 < p_1 < b_1$ y $a_2 < p_2 < b_2$ .

Si consideras que los puntos del perímetro del rectángulo están "dentro". basta con escribir $\leq$ en lugar de $<$ en las desigualdades anteriores.

Nota: Esto sólo funciona para rectángulos, no para otros tipos de cuadriláteros.


Para quien se pregunte por qué esto funciona:

Este método funciona utilizando las propiedades del producto vectorial interno ("producto punto") y aprovechando el hecho de que los lados del rectángulo son perpendiculares a sus lados adyacentes.

Tratados como vectores, $(u_1,v_1)$ es $B - A$ que es un vector perpendicular al lado $AD$ y $(u_2,v_2)$ es $D - A$ , que es un vector perpendicular al lado $AB$ . Para un punto $P$ en coordenadas $(x,y)$ visto como un vector desde el origen, $$ x u_1 + y v_1 = P \cdot (B - A). $$ Para distintas opciones de $P$ el producto $P \cdot (B - A)$ es proporcional a la distancia a $P$ de una línea $\ell$ a través del origen perpendicular a $B - A$ medido en la dirección desde $A$ a $B$ . Ahora invocamos el hecho de que $ABCD$ es un rectángulo: puesto que $\ell$ y la línea $AD$ son perpendiculares a $AB$ son paralelos entre sí, por lo que todos los puntos de la recta $AB$ están en el mismo lado de $\ell$ y todos están a la misma distancia de $\ell$ . Si $P \cdot (B - A) = A \cdot (B - A)$ entonces $P$ está en el mismo lado de $\ell$ como $A$ y a la misma distancia, por lo tanto $P$ está en juego $AD$ . Pero si $P \cdot (B - A) > A \cdot (B - A)$ entonces $P$ está en el mismo lado de $AD$ como $B$ es. Del mismo modo, si $P \cdot (B - A) = B \cdot (B - A)$ entonces $P$ está en el mismo lado de $\ell$ como $B$ y a la misma distancia, por lo tanto $P$ está en juego $BC$ pero si $P \cdot (B - A) < B \cdot (B - A)$ entonces $P$ está en el mismo lado de $BC$ como $A$ es.

Para comprobar si $P=(x_k,y_k)$ está dentro del rectángulo, por lo tanto podemos calcular los productos internos como en la primera parte de esta respuesta, y luego probar las cuatro desigualdades $a_1 < p_1$ , $p_1 < b_1$ , $a_2 < p_2$ y $p_2 < b_2$ . Si las cuatro desigualdades son ciertas, esto confirma que $P$ está en el mismo lado de $AD$ como $B$ es, en el mismo lado de $BC$ como $A$ es, en el mismo lado de $AB$ como $D$ es, y en el mismo lado de $CD$ como $A$ en cuyo caso $P$ está dentro del rectángulo. Si alguna de las desigualdades es falsa, entonces $P$ está en uno de los lados o en el lado "equivocado" de una de las líneas que se encuentran a lo largo de los lados y está fuera del rectángulo.

0 votos

Muchas gracias, ¡por fin lo he entendido! Ahora voy a escribir el método Java.

0 votos

Sería bastante fácil dar una prueba para cualquier polígono convexo, no sólo un rectángulo, pero me gusta la apelación a la forma normal de los pares de lados. Sin embargo, esto equivale a girar el rectángulo, ya que $p_1,p_2$ son las coordenadas de un punto en el plano rotado.

1 votos

@hardmath Coordenadas en un plano rotado escaladas independientemente a lo largo de dos ejes, sí. Simplemente no nos molestamos en indicar explícitamente la rotación o el escalado. Computacionalmente, eso ahorra unos cuantos pasos. (Mi corazonada es que todo el algoritmo cuesta menos que una sola llamada a atan2 en una aplicación típica).

1voto

Ataulfo Puntos 3108

Está claro que se puede tomar WLG el rectángulo $$A=(X_1,Y_1)\\ B=(X_2,Y_2)\\ C=(X_3,Y_3)\\ D=(X_4,Y_4)$$ con lados paralelos a los ejes. Se deduce que la región encerrada por el rectángulo está definida por el producto $$[X_1,X_2]\space\text {x}\space [Y_1,Y_4]=\{(x,y)\space |\space X_1\le x\le X_2;\space Y_1\le y\le Y_4\}$$ Así $$a=(x_1,y_1)\\ b=(x_2,y_2)\\ c=(x_3,y_3)$$ siendo el triángulo, se tiene

$$\text{ The triangle is inside the rectangle }\iff (x_i,y_i)\in[X_1,X_2]\space\text {x}\space [Y_1,Y_4];\space i=1,2,3 $$

0voto

iGEL Puntos 2091

Dibuja tres rayos horizontales desde el vértice del triángulo. enter image description here

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X