Estoy tratando de escribir un programa C ++ que tome las siguientes entradas del usuario para construir rectángulos (entre 2 y 5): altura, ancho, x-pos, y-pos. Todos estos rectángulos existirán paralelos al eje xy al eje y, es decir, todos sus bordes tendrán pendientes de 0 o infinito.
Intenté implementar lo que se menciona en esta pregunta, pero no estoy teniendo mucha suerte.
Mi implementación actual hace lo siguiente:
// Gets all the vertices for Rectangle 1 and stores them in an array -> arrRect1
// point 1 x: arrRect1[0], point 1 y: arrRect1[1] and so on...
// Gets all the vertices for Rectangle 2 and stores them in an array -> arrRect2
// rotated edge of point a, rect 1
int rot_x, rot_y;
rot_x = -arrRect1[3];
rot_y = arrRect1[2];
// point on rotated edge
int pnt_x, pnt_y;
pnt_x = arrRect1[2];
pnt_y = arrRect1[3];
// test point, a from rect 2
int tst_x, tst_y;
tst_x = arrRect2[0];
tst_y = arrRect2[1];
int value;
value = (rot_x * (tst_x - pnt_x)) + (rot_y * (tst_y - pnt_y));
cout << "Value: " << value;
Sin embargo, no estoy seguro de si (a) he implementado el algoritmo al que me vinculé correctamente, o si hice exactamente cómo interpretar esto.
¿Alguna sugerencia?
Respuestas:
o, usando coordenadas cartesianas
(Con X1 como coord izquierda, X2 como coord derecha, aumentando de izquierda a derecha e Y1 como coord superior e Y2 siendo coord inferior, aumentando de abajo hacia arriba , si no es así como su sistema de coordenadas [por ejemplo, la mayoría de las computadoras tienen Dirección Y invertida], cambie las comparaciones a continuación ) ...
Digamos que tiene Rect A, y Rect B. La prueba es por contradicción. Cualquiera de las cuatro condiciones garantiza que no exista superposición :
Entonces, la condición para no solaparse es
Por lo tanto, una condición suficiente para la superposición es lo contrario.
La ley de De Morgan dice que
Not (A or B or C or D)
es lo mismo queNot A And Not B And Not C And Not D
usar De Morgan, tenemos
Esto es equivalente a:
RectA.Left < RectB.Right
] yRectA.Right > RectB.Left
] yRectA.Top > RectB.Bottom
] yRectA.Bottom < RectB.Top
]Nota 1 : es bastante obvio que este mismo principio puede extenderse a cualquier cantidad de dimensiones.
Nota 2 : También debería ser bastante obvio contar las superposiciones de solo un píxel, cambiar el
<
y / o el>
de ese límite a a<=
o a>=
.Nota 3 : Esta respuesta, cuando se utilizan coordenadas cartesianas (X, Y) se basa en coordenadas cartesianas algebraicas estándar (x aumenta de izquierda a derecha e Y aumenta de abajo hacia arriba). Obviamente, cuando un sistema informático pueda mecanizar las coordenadas de la pantalla de manera diferente (por ejemplo, aumentando Y de arriba a abajo o X de derecha a izquierda), la sintaxis deberá ajustarse en consecuencia /
fuente
fuente
B.height
debería serA.height
#undef min
y#undef max
, o usando diferentes nombres de parámetros.#define BETWEEN(value,min,max) \ (\ value > max ? max : ( value < min ? min : value )\ )
xOverlap
es unidimensional;rectOverlap
Es de dos dimensiones. Se puede extender a N dimensiones usando un bucle.fuente
Es más fácil verificar si un rectángulo está completamente fuera del otro, por lo que si
a la izquierda...
o a la derecha ...
o encima ...
o en la parte inferior ...
del segundo rectángulo, no puede chocar con él. Entonces, para tener una función que devuelva un refrán booleano mientras los rectángulos colisionan, simplemente combinamos las condiciones mediante OR lógicos y negamos el resultado:
Para recibir un resultado positivo al tocar solo, podemos cambiar el "<" y ">" por "<=" y "> =".
fuente
Hágase la pregunta opuesta: ¿Cómo puedo determinar si dos rectángulos no se cruzan en absoluto? Obviamente, un rectángulo A completamente a la izquierda del rectángulo B no se cruza. También si A está completamente a la derecha. Y de manera similar si A está completamente por encima de B o completamente por debajo de B. En cualquier otro caso, A y B se cruzan.
Lo que sigue puede tener errores, pero estoy bastante seguro sobre el algoritmo:
fuente
Suponga que ha definido las posiciones y los tamaños de los rectángulos de esta manera:
Mi implementación de C ++ es así:
Un ejemplo de llamada de función de acuerdo con la figura anterior:
Las comparaciones dentro del
if
bloque se verán a continuación:fuente
Así es como se hace en la API de Java:
fuente
En la pregunta, se vincula a las matemáticas para cuando los rectángulos están en ángulos de rotación arbitrarios. Sin embargo, si entiendo un poco sobre los ángulos en la pregunta, interpreto que todos los rectángulos son perpendiculares entre sí.
Un conocimiento general del área de fórmula de superposición es:
Usando el ejemplo:
1) recopile todas las coordenadas x (izquierda y derecha) en una lista, luego ordénelas y elimine los duplicados
2) reúna todas las coordenadas y (arriba y abajo) en una lista, luego ordénelas y elimine los duplicados
3) cree una matriz 2D por número de espacios entre las coordenadas x únicas * número de espacios entre las coordenadas y únicas.
4) pinta todos los rectángulos en esta cuadrícula, incrementando el conteo de cada celda sobre la que ocurre:
5) Al pintar los rectángulos, es fácil interceptar las superposiciones.
fuente
fuente
No piense en las coordenadas como indicando dónde están los píxeles. Piense en ellos como si estuvieran entre los píxeles. De esa manera, el área de un rectángulo de 2x2 debe ser 4, no 9.
fuente
La forma más fácil es
En primer lugar, recuerde que en las computadoras el sistema de coordenadas está al revés. el eje x es el mismo que en matemáticas, pero el eje y aumenta hacia abajo y disminuye al ir hacia arriba ... si el rectángulo se dibuja desde el centro. si las coordenadas x1 son mayores que x2 más su mitad de ancho. entonces significa ir a la mitad se tocarán. y de la misma manera bajando + la mitad de su altura. chocará ..
fuente
Digamos que los dos rectángulos son el rectángulo A y el rectángulo B. Que sus centros sean A1 y B1 (las coordenadas de A1 y B1 se pueden encontrar fácilmente), que las alturas sean Ha y Hb, el ancho sea Wa y Wb, que dx sea el ancho (x) distancia entre A1 y B1 y dy será la altura (y) distancia entre A1 y B1.
Ahora podemos decir que podemos decir que A y B se superponen: cuando
fuente
He implementado una versión de C #, se convierte fácilmente a C ++.
fuente
Tengo una solucion muy facil
que x1, y1 x2, y2, l1, b1, l2, sean cordinates y longitudes y anchuras de ellos respectivamente
considerar la condición ((x2
ahora la única forma en que estos rectángulos se superpondrán es si el punto diagonal a x1, y1 se ubicará dentro del otro rectángulo o, de manera similar, el punto diagonal a x2, y2 se ubicará dentro del otro rectángulo. que es exactamente la condición anterior implica.
fuente
A y B son dos rectángulos. C sea su rectángulo de cobertura.
Se encarga de todos los casos posibles.
fuente
Esto es del ejercicio 3.28 del libro Introducción a la programación Java - Edición completa. El código prueba si los dos rectángulos son idénticos, si uno está dentro del otro y si uno está fuera del otro. Si no se cumple ninguna de estas condiciones, las dos se superponen.
** 3.28 (Geometría: dos rectángulos) Escriba un programa que solicite al usuario ingresar las coordenadas x, y, centro, ancho y alto del centro de dos rectángulos y determine si el segundo rectángulo está dentro del primero o se superpone con el primero, como se muestra en la Figura 3.9. Pruebe su programa para cubrir todos los casos. Aquí están las ejecuciones de muestra:
Ingrese las coordenadas x, y, centro, ancho y alto de r1: 2.5 4 2.5 43 Ingrese las coordenadas x, y, centro, ancho y alto de r2: 1.5 5 0.5 3 r2 está dentro de r1
Ingrese las coordenadas x, y, centro, ancho y alto de r1: 1 2 3 5.5 Ingrese las coordenadas x, y, centro, ancho y alto de r2: 3 4 4.5 5 r2 solapa r1
Ingrese las coordenadas x, y, centro, ancho y alto de r1: 1 2 3 3 Ingrese las coordenadas x, y, centro, ancho y alto de r2: 40 45 3 2 r2 no se superpone r1
fuente
fuente
Para aquellos de ustedes que están usando puntos centrales y medios tamaños para sus datos de rectángulo, en lugar de los típicos x, y, w, h o x0, y0, x1, x1, así es como pueden hacerlo:
fuente
fuente
Si los rectángulos se superponen, entonces el área de superposición será mayor que cero. Ahora busquemos el área de superposición:
Si se superponen, el borde izquierdo de overlap-rect será el
max(r1.x1, r2.x1)
borde derecho y el derechomin(r1.x2, r2.x2)
. Entonces la longitud de la superposición serámin(r1.x2, r2.x2) - max(r1.x1, r2.x1)
Entonces el área será:
Si
area = 0
entonces no se superponen.Simple no es así?
fuente
"Si realiza la resta de las coordenadas x o y correspondientes a los vértices de los dos frente a cada rectángulo, si los resultados son el mismo signo, los dos rectángulos no se superponen a los ejes que" (lo siento, no estoy seguro de que mi traducción sea correcta )
Fuente: http://www.ieev.org/2009/05/kiem-tra-hai-hinh-chu-nhat-chong-nhau.html
fuente
Código Java para averiguar si los rectángulos se están contactando o superponiendo entre sí
...
...
fuente