46 votos

La forma más sencilla de calcular el área de intersección de dos rectángulos

Tengo un problema en el que tengo DOS rectángulos NO girados (dados como dos tuplas de puntos {x1 x2 y1 y2}) y quiero calcular su área de intersección. He visto más general respuestas a esta pregunta, por ejemplo, más rectángulos o incluso rotados, y me preguntaba si hay una solución mucho más sencilla ya que sólo tengo dos rectángulos no rotados.

Lo que imagino que debería ser alcanzable es un algoritmo que sólo utilice la suma, la resta y la multiplicación, posiblemente también abs(). Lo que ciertamente no debería usarse son min/max, equal, greater/smaller y demás, lo que haría la pregunta obsoleta.

Gracias.

EDIT 2: vale, se ha vuelto demasiado fácil usar min/max o abs(). ¿Puede alguien mostrar o refutar el caso de usar sólo add/sub/mul?

EDIT: vamos a relajarnos un poco, ¡sólo se prohíben las expresiones condicionales (por ejemplo, if, case)!

PD: Llevo media hora dándole vueltas, sin éxito, quizás ya soy demasiado mayor para esto :)

0 votos

Parece que espera obtener una respuesta utilizando únicamente las operaciones de campo ( $+$ , $-$ , $\times$ y $/$ ). Pero, ¿se puede obtener una fórmula para la distancia entre dos puntos de la línea real utilizando sólo esas herramientas? Si no lo consigues, deberías convencerte de que tu esperanza es desalentadora.

0 votos

Pensé que como el área de un cuadrado se calcularía como (a-b)*(c-d), un área negativa significaría que el área está girando en la otra dirección (si se usa el vector). Pero de todas formas creo que la pregunta está mal planteada. Perdón por perder el tiempo....

81voto

Al. Puntos 1182

Utiliza sólo el máximo y el mínimo (arrastre los cuadrados para ver el cálculo. Olvídate de la mayor parte del código, el cálculo son esas dos líneas con el mínimo y el máximo):

http://jsfiddle.net/Lqh3mjr5/

Aquí también se puede reducir min a max (o lo contrario), es decir $min\{a,b\} = -max\{-a,-b\}$ .


Primero se calculan los rectángulos delimitadores rect1 y rect2 con las siguientes propiedades:

rect = {
  left: x1,
  right: x1 + x2,
  top: y1,
  bottom: y1 + y2,
}

El área de solapamiento puede calcularse como sigue:

x_overlap = Math.max(0, Math.min(rect1.right, rect2.right) - Math.max(rect1.left, rect2.left));
y_overlap = Math.max(0, Math.min(rect1.bottom, rect2.bottom) - Math.max(rect1.top, rect2.top));
overlapArea = x_overlap * y_overlap;

7 votos

Además, si realmente no quieres usar max, ten en cuenta que max(a,b)=(|a-b|+a+b)/2.

0 votos

Gracias por las respuestas. Parece que es fácil usar funciones no continuas. Me hacía esta pregunta porque mi estómago me decía que esto debía ser de una forma, por ejemplo, Área = A B-C D+(A-C)*(B-D). Esencialmente algo sin la condición if (max es como if(a>b)?a:b sin embargo)

2 votos

@chaiy Como la función que toma vértices y devuelve área no es diferenciable, no es posible construir esta función a partir de funciones diferenciables. Usted debe utilizar una función tipo "if" para hacerlo.

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