algorithm math pseudocode shapes

algorithm - Intersección de dos rectángulos



math pseudocode (7)

Tengo dos rectángulos caracterizados por 4 valores cada uno:

Posición izquierda X , posición superior Y , ancho W y altura H :

X1, Y1, H1, W1 X2, Y2, H2, W2

Los rectángulos no se rotan, así:

+--------------------> X axis | | (X,Y) (X+W, Y) | +--------------+ | | | | | | | | | | +--------------+ v (X, Y+H) (X+W,Y+H) Y axis

¿Cuál es la mejor solución para determinar si la intersección de los dos rectángulos está vacía o no?


Acabo de probar con el programa de CA y escribí a continuación.

#include<stdio.h> int check(int i,int j,int i1,int j1, int a, int b,int a1,int b1){ return (/ (((i>a) && (i<a1)) && ((j>b)&&(j<b1))) ||/ (((a>i) && (a<i1)) && ((b>j)&&(b<j1))) ||/ (((i1>a) && (i1<a1)) && ((j1>b)&&(j1<b1))) ||/ (((a1>i) && (a1<i1)) && ((b1>j)&&(b1<j1)))/ ); } int main(){ printf("intersection test:(0,0,100,100),(10,0,1000,1000) :is %s/n",check(0,0,100,100,10,0,1000,1000)?"intersecting":"Not intersecting"); printf("intersection test:(0,0,100,100),(101,101,1000,1000) :is %s/n",check(0,0,100,100,101,101,1000,1000)?"intersecting":"Not intersecting"); return 0; }


Mejor ejemplo ...

/** * Check if two rectangles collide * x_1, y_1, width_1, and height_1 define the boundaries of the first rectangle * x_2, y_2, width_2, and height_2 define the boundaries of the second rectangle */ boolean rectangle_collision(float x_1, float y_1, float width_1, float height_1, float x_2, float y_2, float width_2, float height_2) { return !(x_1 > x_2+width_2 || x_1+width_1 < x_2 || y_1 > y_2+height_2 || y_1+height_1 < y_2); }

y también de otra manera, mira este link ... y codifícalo tú mismo ...


Si las coordenadas de los rectángulos de la esquina inferior izquierda y la esquina superior derecha son:
(r1x1, r1y1), (r1x2, r1y2) para rect1 y
(r2x1, r2y1), (r2x2, r2y2) para rect2
(Código similar a Python)

intersect = False for x in [r1x1, r1x2]: if (r2x1<=x<=r2x2): for y in [r1y1, r1y2]: if (r2y1<=y<=r2y2): intersect = True return intersect else: for Y in [r2y1, r2y2]: if (r1y1<=Y<=r1y2): intersect = True return intersect else: for X in [r2x1, r2x2]: if (r1x1<=X<=r1x2): for y in [r2y1, r2y2]: if (r1y1<=y<=r1y2): intersect = True return intersect else: for Y in [r1y1, r1y2]: if (r2y1<=Y<=r2y2): intersect = True return intersect return intersect


Si los dos rectángulos tienen las mismas dimensiones, puedes hacer:

if (abs (x1 - x2) < w && abs (y1 - y2) < h) { // overlaps }


Usando un sistema de coordenadas donde (0, 0) está la esquina superior izquierda.

Pensé en ello en términos de ventanas deslizantes verticales y horizontales y se me ocurre esto:

(B.Bottom> A.Top && B.Top <A.Bottom) && (B.Right> A.Left && B.Left <A. Right)

Que es lo que obtienes si aplicas la Ley de DeMorgan a lo siguiente:

No (B.Bottom <A.Top || B.Top> A.Bottom || B.Right <A.Left || B.Left> A.Right)

  1. B está arriba de A
  2. B está debajo de A
  3. B queda a la izquierda de A
  4. B es el derecho de A

if (X1 <= X2 + W2 && X2 <= X1 + W1 && Y1> = Y2-H2 && Y2> = Y1 + H1) Intersecar

En la pregunta Y es la posición superior ...

Nota: Esta solución solo funciona si el rectángulo está alineado con los ejes X / Y.


if (X1+W1<X2 or X2+W2<X1 or Y1+H1<Y2 or Y2+H2<Y1): Intersection = Empty else: Intersection = Not Empty

Si tiene cuatro coordenadas - ((X,Y),(A,B)) y ((X1,Y1),(A1,B1)) - en lugar de dos más ancho y alto, se vería así:

if (A<X1 or A1<X or B<Y1 or B1<Y): Intersection = Empty else: Intersection = Not Empty