Esto parece no trivial (se pregunta bastante en varios foros), pero absolutamente lo necesito como un bloque de construcción para un algoritmo más complejo.¿Cómo se cruzan dos polígonos?
Entrada: 2 polígonos (A y B) en 2D, como una lista de bordes [(x0, y0, x1, y2), ...]
cada uno. Los puntos están representados por pares de double
s. No sé si se dan en sentido horario, en sentido antihorario o en cualquier dirección. I do saben que no son necesariamente convexos.
Salida: 3 polígonos que representan A, B y el polígono AB que se cruza. Cualquiera de los cuales puede ser un polígono vacío (?), P. null
.
Sugerencia para la optimización: Estos polígonos representan los límites de la sala y el piso. Por lo tanto, el límite de la habitación normalmente se intersectará por completo con el límite del piso, a menos que pertenezca a otro piso en el mismo plano (¡argh!).
Espero que alguien ya haya hecho esto en C# y me permita usar su estrategia/código, ya que lo que he encontrado hasta ahora sobre este problema es bastante desalentador.
EDIT: Parece que no estoy del todo de pollo por estar débil ante la perspectiva de hacer esto. Me gustaría repetir la salida deseada aquí, ya que este es un caso especial y podría hacer el cálculo más simple:
de salida: En primer polígono menos todos los bits que se cruzan, los polígonos de intersección (plural es aceptable). No estoy realmente interesado en el segundo polígono, solo su intersección con el primero.
EDIT2: ¡Actualmente estoy usando la biblioteca GPC (General Polygon Clipper) que lo hace realmente fácil!
Esto es más complicado de lo que piensas. ¿Cómo planeas representar la forma resultante? Tenga en cuenta que las dos entradas podrían (a) no cruzarse en absoluto, (b) intersectarse parcialmente, dando como resultado una forma cerrada convexa o cóncava, (c) intersecarse por completo, dando como resultado una forma con DOS límites (es decir, rosquilla) donde debes encontrar una manera de representar el interior y el exterior de la forma. –
De hecho, Jon tiene razón. Tu problema no está bien establecido; el conjunto resultante * podría no ser un polígono * y, por lo tanto, la salida de la función no debería ser un polígono. ¿Qué quieres hacer en el caso en que la forma resultante no esté conectada? Imagínese, por ejemplo, un poliéster en forma de C que se cruza con un poli en forma de I, lo que da como resultado un colon. –
gracias, tendrá que pensar mucho sobre esto y encontrar una solución. No lo pensé de esa manera antes ... –