El algoritmo incremental añade las rectas {l1,l2, ...,ln} una después de otra y actualiza la estructura DCEL después de cada inserción.
Sea Aila subdivisión del plano inducida por el bounding box B(L)
y la parte de A({l1, ...,li}) que está dentro de B(L).
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Para añadir la recta li, es necesario dividir las caras de Ai−1que
son intersectadas por lide izquierda a derecha.
Suponemos que la nueva recta entra en el arreglo de rectas por una cara f a través de la arista e.
Caminamos por la frontera de f siguiendo los punteros Next() en la estructura DCEL hasta que encontremos el half-edge de la
Algoritmo de construcción incremental
Se pasa entonces a la siguiente cara utilizando el puntero Twin()de este half-edge para alcanzar el otro half-edge de e’ en la estructura DCEL.
Puede ocurrir también que se abandone la región f atravesando un vértice v. En este caso es necesario caminar alrededor de v, visitando todos los bordes que inciden en dicho vértice hasta
encontrar la siguiente región intersectada por li.
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Queda por ver cómo encontrar la arista situada más a la izquierda
que intersecta con la recta li, que es la arista por la que se
comienza a recorrer el arreglo Ai−1, y, por último, cómo dividir las
caras que se van encontrando.
El punto de intersección entre liy Ai−1, situado más a la izquierda
está en una arista de B(L).Sólo hay que buscar entre todas las aristas cuál es la primera en ser intersectada.
La cara adyacente a esta arista está dentro de B(L) y es la primera cara que divide la recta li.
Algoritmo de construcción incremental
Si lihace intersección con Ai−1, por primera vez, en una esquina
de B(L), la primera cara que divide li es la única cara adyacente a
esa esquina que está dentro de B(L).
Si lies una recta vertical, puede localizarse, para comenzar el
recorrido, el punto de intersección más bajo entre liy Ai−1.
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Como Ai−1contiene al menos 2i+ 2 aristas en B(L), el tiempo que
se necesita para este paso es lineal para cada recta, teniendo en cuenta que todas las aristas pertenecientes a B(L) pueden estar conectadas por sus punteros Next(), ya que al fin y al cabo todas ellas tienen como una de sus caras incidentes la cara que queda fuera del límite de B(L).
Algoritmo de construcción incremental
Se quiere dividir una cara f,y se asume que la cara situada a la
izquierda de f en el recorrido de liya ha sido dividida y, en
particular, que la arista e por donde se entra a f se encuentra ya dividida.
Para dividir f, en primer lugar hay que crear dos nuevos registros
de caras, uno para la parte de f que se encuentra por encima de liy
otro para la parte de f que se encuentra debajo de li.
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
A continuación hay que dividir la arista e’ que es aquella por la
que li abandona f; además hay que crear un nuevo vértice para
li∩ e0. Es decir, se crea un nuevo registro de vértice y dos nuevos
registros de half-edge para las dos nuevas aristas.
Hay que crear, además, registros de half-edge para la arista li∩ f .
Es importante inicializar correctamente todos los punteros de los registros de las nuevas caras, vértices y half-edge y destruir el registro de la cara f y los registros de los half-edge de e’. El tiempo total de esta división es lineal respecto a la complejidad de f.
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Algoritmo CONSTRUIRARREGLO(L)
Entrada. Un conjunto L de n rectas en el plano.
Salida. La estructura DCEL con la subdivisión del plano generada por B(L) y la parte de A(L) que se encuentra dentro de B(L), siendo B(L) un bounding box que contiene todos los vértices de A(L) en su interior.
1 Calcular el bounding box B(L) que contiene todos los vértices de
A(L) en su interior.
2 Construir la estructura DCEL para la subdivisión generada por
B(L).
3 for i ←1 to n
4 doEncontrar la arista e en B(L) que contiene el punto de
intersección situado más a la izquierda entre liy Ai.
5 f ← la cara finita adyacente a e
6 whilef no sea una cara infinita, es decir, una cara fuera de B(L)
Algoritmo de construcción incremental
El paso 1 del algoritmo que calcula B(L) puede realizarse en un
tiempo O(n2), ya que es necesario calcular todas las intersecciones
entre las rectas para obtener las que se encuentra más arriba, más abajo, más a la izquierda y más a la derecha, que serán los vértices que formen el bounding box.
El paso 2 consume un tiempo constante. Encontrar la primera
región dividida por lilleva un tiempo O(n).
Faltaría por delimitar el tiempo consumido por la división de las caras intersectadas por li.
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Para calcular este tiempo se asume que A(L) es un arreglo de rectas simple.
En este caso, el tiempo utilizado para dividir una cara f y
encontrar la siguiente cara con intersección, es lineal respecto a la complejidad de f. Por lo tanto, el tiempo total necesario para
insertar una recta lies lineal respecto a la suma de las
complejidades de las caras de Ai−1intersectadas por li.
Cuando un arreglo A(L) no es simple, puede abandonarse una cara f a través de un vértice, en cuyo caso es necesario recorrer todas las caras adyacentes a dicho vértice hasta encontrar la siguiente cara a dividir; para ello hay que recorrer las aristas que no están en la frontera de la cara a dividir.
Algoritmo de construcción incremental
Nótese que las aristas que se tratan en este caso, están en la
frontera de las caras que intersectan con li.
Esto nos lleva al concepto de zona.
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
La zona de una línea en el arreglo A(L) inducido por el conjunto L de líneas en el plano, es el conjunto de caras de A(L) a las cuales intersecta.
La complejidad de una zona está definida por la suma de el número de aristas y vértices de esas caras.
En la figura se puede notar que algunos vértices son contados una vez en la complejidad de la zona, otros dos, tres o incluso 4 veces.
El tiempo que necesitamos para insertar lies lineal en la
complejidad de la zona de lien A({l1, ...,li}). El teorema de la zona nos dice que esta cantidad es lineal.
Algoritmo de construcción incremental
Arreglos de líneas Algoritmo de construcción incremental
Algoritmo de construcción incremental
Teorema
La complejidad de la zona de una línea en un arreglo de m líneas en el plano es O(m).
3 Arreglos de líneas
Arreglos de líneas
Algoritmo de construcción incremental
Complejidad
Arreglos de líneas Complejidad
Complejidad
Hemos visto que el tiempo necesario para insertar lies lineal en la
complejidad de la zona de lien A({l1, ...,li−1}).
Por el teorema de la zona esto es O(i). así que el tiempo requerido para insertar todas las líneas es:
n X
i=1
O(i) = O(n2) (1)
Los pasos 1 y 2 del algoritmo juntos toman O(n2), así que el
tiempo total de ejecución del algoritmo es O(n2). Debido a que la
complejidad de A(L) es Θ(n2)cuando A(L) es simple, nuestro
Complejidad
Teorema
Una lista de aristas doblemente conectada para el arreglo inducido
por un conjunto de n líneas puede ser construido en O(n2).
Niveles y Discrepancia 1 Arreglos Ray Tracing Definición de la discrepancia Cálculo de la discrepancia 2 Dualidad Definición Interpretación geométrica Aplicaciones 3 Arreglos de líneas Arreglos de líneas
Algoritmo de construcción incremental Complejidad
4 Niveles y Discrepancia
4 Niveles y Discrepancia Niveles y Discrepancia