Dado un conjunto de coordenadas 2D para las 4 esquinas de cada edificio en el horizonte de una ciudad (como en una fotografía), ¿cómo determinaría el contorno de la silueta de todos los edificios, donde los edificios pueden superponerse o no?

Dados los edificios [math] N [/ math], puede hacer esto en [math] O (N \ log N) [/ math] time. Necesitará [math] O (N) [/ math] espacio auxiliar.

Primero, para cada edificio, cree un evento asociado con la coordenada x izquierda donde agreguemos un edificio con la altura del edificio actual. Creamos un segundo evento asociado con la coordenada x derecha donde eliminamos un edificio con la altura del edificio actual. Ponga todos estos eventos en una cola de prioridad, que los procesa en orden de coordenadas x crecientes.

Deberá mantener un conjunto de alturas que se pueden alcanzar actualmente. Este conjunto debe estar respaldado por un árbol binario equilibrado para admitir una inserción y eliminación eficientes. Si las alturas no son distintas, puede perturbarlas con pequeños épsilones para que todas las alturas sean distintas.

Ahora procesaremos los eventos desde la cola de prioridad en orden. Cuando llegamos a un evento donde creamos un edificio, agregamos la altura dada a nuestro conjunto. Si la coordenada x cambia en el próximo evento, también actualizaremos la altura máxima que hemos visto hasta ahora en nuestra coordenada x actual. Si llegamos a un evento cuando eliminamos un edificio, simplemente eliminamos esa altura de nuestro conjunto.

Una vez que tenemos estas alturas, se puede generar el horizonte dibujando líneas horizontales que se extiendan hacia la derecha desde una altura máxima hasta que se pueda lograr una nueva coordenada x.

No puedes La mayoría de los edificios tienen ocho esquinas. Cuatro esquinas describe un tetraedro y nunca he visto uno en una ciudad.

Sin embargo, si está generalizando el caso a formas puramente rectangulares, considere encontrar el par de puntos que representan la parte superior del edificio más a la izquierda. Llámalos A y B. encuentras A al encontrar el valor x más bajo del conjunto.

Luego encuentra el siguiente objeto.
El siguiente valor A al que llegamos es el cuadro azul. Si ese A es más alto que la línea AB para el cuadro negro, y el azul A es menor que el negro B, dibuje una línea desde A hacia B, pero deténgase cuando golpee el CD azul. Luego continúe con el azul A. Repita.

Si no hay otra línea vertical entre ayb, debe comenzar a dibujar de B a C. Utilice la misma lógica, pero traduzca el marco de referencia 90 grados.

Etc.