este es un problema que he resuelto en el pasado. Lo primero es ordenar los rectángulos usando el valor x o y de uno de los bordes. Digamos que ordena en la dirección y y utiliza el borde superior. El rectángulo superior en su ejemplo es primero en orden ordenado. Para cada rectángulo, conoce su tamaño en la dirección y.
Ahora, para cada entrada (llámala la entrada actual, corresponde a un rectángulo) en la lista ordenada que buscas en la lista hasta llegar a una entrada mayor que la entrada actual + el tamaño del rectángulo correspondiente. (llámelo la entrada de detención)
Cualquier entrada en la lista ordenada entre la entrada actual y esta entrada de parada serán posibles intersecciones. Simplemente verifica si los rectángulos X-Rangos se cruzan.
Al elegir ordenar en la dirección xo y, será mejor elegir la dimensión que sea más grande ya que esto implicará una menor intersección en promedio, por lo tanto, menos control.
Aquí hay un ejemplo. Los rectángulos se definen como R (x1, x2, y1, y2), donde x1 es el lado izquierdo, x2 es lado derecho, y1 es superior y y2 es inferior
rectangle 1 (1,5,0,4)
rectangle 2 (7,9,6,8)
rectangle 3 (2,4,2,3)
rectangle 4 (3,6,3,7)
rectangle 5 (3,6,9,15)
tipo de acuerdo con y1 para dar
# y1 size
rectangle 1 0 4
rectangle 3 2 3
rectangle 4 3 4
rectangle 2 6 2
rectangle 5 9 6
, el rectángulo 1 tiene y1 + tamaño = 0 + 4 = 4 lo que implica que potencialmente intersectará el rectángulo 3 (valor y1 = 3 < 4) y el rectángulo 4 (valor y1 = 3 < 4) pero no el rectángulo 2 (valor y1 = 6> 4) ... no hay necesidad de verificar ningún rectangels en la lista después de 2
Rectángulo 3 tiene y2 + tamaño = 2 + 3 = 5 lo que implica que potencialmente intersecará el rectángulo 4 (valor y1 = 3 < 5) pero no recanallar 2 (valor y1 = 6> 5) no es necesario verificar ningún rectangels en la lista después de 2
Rectángulo 4 tiene y2 + tamaño = 3 + 4 = 7 lo que implica que potencialmente intersecará el rectángulo 2 (valor y1 = 6 < 7) pero no volverá a conectar 5 (valor y1 = 9> 7)
Por supuesto, con un gran número de rectángulos generalmente solo tendrá que verificar una fracción de los pares posibles para la intersección.
¿Cuál es el pensamiento para el rectángulo rojo que reclama espacio que podría haber sido reclamado por los rectángulos verde o naranja (haciéndolos más largos ...)? –
Arranqué arbitrariamente ese rectángulo. –
Resulta que esto es realmente lo que quería: http://google-maps-utility-library-v3.googlecode.com/svn/trunk/routeboxer/docs/examples.html Probablemente debería haber pedido una solución al problema real en lugar de una solución al problema que creé en el medio de mi implementación. –