• No se han encontrado resultados

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

Documento similar