9 votos

Compruebe si $n$ discos se cruzan

Yo lucho con el siguiente problema:

Dado $N$ discos de $D_i = (x_i, y_i,r_i)$, calcular si su intersección.

$D_1 \cap D_2 \cap \dots \cap D_N = \emptyset $ ?

No me importa acerca de la zona de intersección, sólo quiero saber si lo hacen o no.

Sé cómo comprobar si dos discos se cruzan. He leído

la intersección de n discos/círculos

Pero su algoritmo parece ser que no es 100% exacta, ya que la aritmética de punto flotante y se centró en el cálculo de la resultante de área.

Pensé en representación de los discos como un conjunto, como:

The set of all points equidistant from the center,

pero eso no me ayuda demasiado. Mi idea era que, dado un punto de $p$,

todos los $N$ discos se cruzan $ \iff \exists \ p: p \in D_1 \wedge p \in D_2 \wedge \dots \wedge p \in D_N $,

pero la única manera de implementar que en el código que viene a mi mente es el uso de Monte Carlo, y que es (tal vez) lento y no exacta.

Sabe alguien de un rápido y que esperamos sea fácil solución?

Edit: Cambiado desde los círculos a los discos, después de que se señaló que, me refiero a los discos.

10voto

rrirower Puntos 230

No es muy claro si el problema es sobre los discos o círculos de unos. Aquí están algunas sugerencias para ambos casos.

Si se trata de discos, entonces usted puede utilizar Helly del teorema. Se dice que el $n \geq 3$ discos en un plano se cruzan si y sólo si todos los $3$ discos entre ellos se cruzan. Y para $3$ discos creo que debe ser bastante fáciles de producir una solución exacta (es decir, uno que es 100% precisa si todos los centros y los radios son dados como números racionales).

Este no es el enfoque más rápido, pero creo que puede ser implementado precisamente sin ningún tipo de complicaciones graves, y sin el uso de operaciones de punto flotante.

Si el problema es sobre los círculos y no sobre los discos, entonces usted también puede hacer que la solución exacta, pero usted tendrá que manipular los elementos de algunos cuadrática extensión de $\mathbb{Q}$, es decir, usted tendrá que hacer manipulaciones simbólicas con expresiones como $a + b\sqrt{c}$.

ACTUALIZACIÓN: ya que estamos hablando de código, debo añadir que este bit: todo depende de las circunstancias exactas y de la calidad exacta/los requerimientos de velocidad.

a) Si se trata de un concurso de programación, entonces yo no lo uso del teorema de Helly. En su lugar, me gustaría hacer algo como lo siguiente, que lleva tiempo $O(n^2 \ln n)$.

Si todos los discos tienen un punto en común, entonces ellos también tienen un punto en común que se encuentra en el borde de uno de los discos. Así, por cada disco $D$, me gustaría comprobar si existe o no un punto en su borde (que es un círculo de $S$) que pertenece a todos los otros discos.

Para hacer eso, me gustaría encontrar las intersecciones de esta frontera $S$ con cada disco. Cada intersección es un arco de $S$, un punto en $S$, un conjunto vacío, o la totalidad de la $S$. Y luego me iba a determinar si o no estos arcos tienen un punto en común, que se puede hacer en el tiempo $O(n \ln n)$ por la clasificación de los extremos de los arcos (decir) de las agujas del reloj. Yo lo haría todo el uso de la aritmética de punto flotante con un adecuado valor de epsilon. De hecho, esto es lo que hice un par de veces en la realidad de los concursos de vuelta en el día.

b) Si el código debe ser industrial y absolutamente precisa, entonces debería ser posible (en principio) a hacer lo mismo que el anterior, pero en lugar de aritmética de punto flotante hacer aritmética precisa de un adecuado campo finito extensión de $\mathbb{Q}$. Pero nunca he tratado de aplicar esto a mí mismo. Podría ser un poco difícil.

c) Si el tiempo de ejecución no es tan importante, pero usted todavía necesita precisión absoluta, a continuación, me gustaría ir con Helly del teorema. Se podría simplificar el código así lo que es mucho más robusto, pero el tiempo de ejecución crecerá a $n^3$.

1voto

Derick Bailey Puntos 37859

Usted debe resolver el siguiente sistema de n inecuaciones en 2 incógnitas: $(x-x_i)^2+(y-y_i)^2\leqslant r_i^2$ para todo i entre $1$ y n, donde $x_i$ $y_i$ son las coordenadas de sus centros, y $r_i$ sus radios. Dado que el número de ecuaciones mayor que la de las incógnitas, esto se reduce a la elección de dos al azar, resolver para x y y, a continuación, comprobar para ver si la solución en cuestión es verdadera para todos los otros $n-2$ relaciones así. Si no, entonces no hay tal solución, y el n de los círculos no tienen ningún punto en común. Obviamente, un área es un conjunto o multitud de puntos.

0voto

mathematics2x2life Puntos 5179

Esto se puede hacer con la suficiente rapidez. Para saber los círculos, uno debe tener sus centros y los radios. A continuación, calcular el uso de este para ver si alguno de los círculos se intersectan. Suponiendo que los círculos son distintos, si cualquier par de ellos se cruzan, van a hacerlo más de dos veces. Tomar estos dos puntos y tener el equipo de verificación para ver si cumplen las ecuaciones para los demás círculos.

0voto

mjqxxxx Puntos 22955

En primer lugar, ordenar los discos por tamaño, y descartar cualquier disco que únicamente contiene otra. Si un solo disco sigue siendo, regresar $\mathtt{true}$. Iterar sobre todos los restantes pares de discos. Para cada par:

  • Si son distintos, regresar $\mathtt{false}$.
  • De lo contrario, sus límites se cruzan exactamente en uno o dos puntos. Compruebe si el punto de intersección(s) están contenidos en todos los discos restantes. Si lo son, regresar $\mathtt{true}$; de lo contrario continúe.

Finalmente, si todos los pares han sido comprobadas, regresar $\mathtt{false}$.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X