2008-12-22 26 views
6

¡Avast hay otros programadores!Operaciones booleanas en polígonos rectangulares

I tienen el siguiente problema:

Tengo dos rectángulos superpuestos como se muestra en la imagen siguiente.

alt text

Quiero averiguar el polígono formado por punto ABCDEF.

Descripción navideña alternativa: El cortador de galletas rojas está cortando un poco de la galleta negra. Quiero calcular la galleta negra.

Cada rectángulo es una estructura de datos con 4 vértices en 2d.

¿Cuál es el mejor algoritmo para lograr esto?

+0

¿Están los polígonos siempre alineados al eje como se muestra? –

Respuesta

5

Este es un caso especial de 2D en general recorte polígono. Un buen lugar para comenzar es el algoritmo de Weiler-Atherton. Wikipedia has a summary y links to the original paper. El algoritmo parece coincidir bastante bien con la estructura de datos que describió.

Tenga en cuenta que es muy posible que termine con un rectángulo con un agujero (si el rojo está completamente dentro del negro) o incluso dos rectángulos (por ejemplo, si el rojo es más alto y delgado que el negro) Si está seguro de que solo hay una esquina del rectángulo rojo dentro del negro, entonces la solución debería ser mucho más simple.

+0

El rectángulo rojo puede estar en cualquier lugar del negro. Sin embargo, si se superpone, simplemente ignoro el rectángulo negro por completo, ya que tiene menor prioridad. – Nailer

+0

Parece que era justo lo que realmente necesitaba. – Nailer

+0

http://en.wikipedia.org/wiki/Sutherland-Hodgman_clipping_algorithm parece incluso mejor explicado. – Nailer

2

¿Cuán precisas son las coordenadas? Si los rectángulos son bastante pequeños, el enfoque más fácil podría ser simplemente pintarlos en un lienzo, primero el rectángulo negro, seguido por el rojo. Los píxeles negros restantes en el lienzo son el polígono que queda.

Otro enfoque es dividir la cuadrícula de coordenadas en un grupo de rectángulos basados ​​en todos los lados de los rectángulos (sin contar rectángulos sin límites, tiene hasta 9 rectángulos generados si tiene dos rectángulos originales). Luego solo prueba un punto representativo de cada uno de estos rectángulos para la membresía en los polígonos particulares para determinar qué rectángulos están dentro y cuáles están fuera.

+0

+1 para la división en 9 piezas. Esa es la más simple y más rápida ... –

+0

Solo una nota aclaratoria: "Píntalas en un lienzo" se puede hacer de dos maneras: ya sea en un lienzo desde una API gráfica, o en una simple matriz 2-D – Yuliy

Cuestiones relacionadas