Aprendizaje de algoritmos de segmentación de línea Cohen-Sutherland y explicación detallada

Aprendizaje de algoritmos de segmentación de línea Cohen-Sutherland y explicación detallada

【Corte de línea bidimensional】

El algoritmo de corte de línea utiliza una serie de pruebas y cálculos de intersección para determinar si se puede guardar todo el segmento de línea o una parte de él. La intersección del segmento de línea y el límite de la ventana calcula la parte de la función de recorte de línea que consume mucho tiempo. Por lo tanto, reducir el cálculo de intersección es el objetivo principal de cualquier algoritmo de recorte de línea.

Con este fin, probamos antes de cortar para determinar si el segmento de línea está completamente dentro o fuera de la ventana de recorte. Es fácil determinar que un segmento de línea está completo dentro de la ventana, pero es más difícil determinar que un segmento de línea esté completamente más bajo fuera de la ventana.

Si no puede determinar si un segmento de línea está completamente dentro o fuera de la ventana, debe determinar si una parte del segmento de línea cae dentro de la ventana calculando el punto de intersección.

【Introducción al algoritmo de Cohen-Sutherland】

El algoritmo de segmentación de línea Cohen-Sutherland es un algoritmo de segmentación de línea rápida que se ha utilizado ampliamente. El algoritmo reduce el cálculo de los puntos de intersección a través de las pruebas iniciales, lo que reduce el tiempo utilizado por el algoritmo de segmentación de línea.

El algoritmo asigna un código binario de cuatro bits llamado código de área al punto final de cada segmento de línea . Cada bit se utiliza para identificar si el punto final está dentro o fuera del límite de la ventana de recorte correspondiente.

El siguiente es un diagrama esquemático de un código binario de cuatro bits: en general, está numerado 4321 de izquierda a derecha, correspondiente a la parte superior, inferior, derecha e izquierda de la ventana de recorte (tenga en cuenta que no está arriba, abajo, izquierda y derecha).

Cada límite de la ventana de recorte divide el espacio bidimensional en dos espacios dentro y fuera de la ventana. Los cuatro límites de la ventana (la línea donde se encuentra el límite) dividen el plano en nueve áreas, como se muestra en la figura a continuación.

Los puntos finales en nueve áreas diferentes recibirán códigos de área diferentes. Por ejemplo, al punto final del área en la esquina inferior izquierda de la ventana de recorte se le asigna un código de área de 0101, mientras que el código de área del punto final en la ventana de recorte es 0000.

El valor de bit del código de área se determina comparando las coordenadas del punto final (x, y) con el límite de la ventana de recorte. Si x <xmin, entonces la posición 1 es 1, como en el área con códigos de área 1001, 0001 y 0101 en la figura anterior. Otros son parecidos.

Además de usar la prueba de desigualdad, también podemos usar la operación de procesamiento de bits y la siguiente operación de dos pasos para determinar el valor del código de área de manera más eficiente:

(1) Calcule la diferencia entre las coordenadas del punto final y el filo.

(2) Use el bit de signo calculado por cada diferencia para establecer el valor correspondiente en el código de área.

En el orden del diagrama de código binario anterior, el bit 1 se establece en el bit de signo de x-xw min ; el bit 2 se establece en el bit de signo de xw min -x; el bit 3 se establece en el bit de signo del bit y-yw min ; el bit 4 se establece en yw min -significa bit.

[Descripción del algoritmo de Cohen-Sutherland]

Una vez que se han establecido los códigos de área para todos los puntos finales del segmento de línea, puede determinar rápidamente qué segmento de línea está completamente dentro de la ventana de recorte y qué segmento de línea está completamente fuera de la ventana.

Segment El segmento de línea está completamente dentro de la ventana: los códigos de área de ambos puntos finales del segmento de línea son 0000, y dicho segmento de línea está reservado.

Segment El segmento de línea está completamente fuera de la ventana: un par de la misma posición en los códigos de área de los dos puntos finales del segmento de línea es 1, y dichos segmentos de línea se descartan.

Por ejemplo: el código de área de un punto final del segmento de línea es 1001, y el código de área del otro punto final es 0101, entonces este segmento de línea se descarta, porque ambos puntos finales de este segmento de línea están en el lado izquierdo del rectángulo de recorte, el primer bit del código de área del punto final Son todos 1.

El juicio de si el segmento de línea está dentro o fuera de la ventana en el programa es realizar una operación OR lógica en los códigos de área de los dos puntos finales . Si el resultado de la operación es 0000, el segmento de línea está completamente dentro de la ventana de recorte, mantenga este segmento de línea y pruebe el siguiente segmento de línea. Si el resultado de la operación AND lógica de los códigos de área de los dos puntos finales es verdadero (no 0000), significa que el segmento de línea está completamente fuera de la ventana, y este segmento de línea se descarta.

③ Para el segmento de línea que no puede considerarse completamente fuera o dentro de la ventana, se debe probar el punto de intersección con el límite de la ventana.

Estos segmentos de línea pueden o no pasar por el interior de la ventana. Por lo tanto, puede tomar múltiples operaciones de intersección para completar el corte de un segmento de línea. El número de intersecciones depende del orden de selección del límite de corte. Después de procesar un límite de ventana recortado cada vez, parte de él se corta y el resto se compara con el otro límite de la ventana. Este proceso continúa hasta que el segmento de línea está completamente cortado o el segmento de línea restante está completamente dentro de la ventana de recorte.

A continuación discutimos los dos segmentos de línea en la figura a continuación que no se pueden juzgar inmediatamente dentro / fuera de la ventana. Suponiendo que el orden de procesamiento del límite de la ventana es izquierda, derecha, abajo y arriba , para verificar si un segmento de línea se cruza con un límite de recorte, puede verificar los bits correspondientes del código de área en ambos extremos de la línea. Intersecar

Como se muestra arriba, P1P2 y P3P4 son dos segmentos de línea que no se pueden determinar de inmediato si están dentro o fuera de la ventana. Primer trato con P1P2:

1. Procesamiento del borde izquierdo:

Los códigos de área del segmento de línea P1 a P2 son 0100 y 1001. Por lo tanto, P1 está dentro del límite izquierdo y P2 está fuera del límite izquierdo.

A continuación, calcule el punto de intersección P2 'y recorte la parte desde el punto P2 hasta P2'.

2. Procesamiento del borde derecho:

El segmento de línea restante se encuentra dentro del límite derecho y no necesita ser procesado.

3. Procesamiento de límite inferior:

P1 está por debajo del límite inferior; y P2 'está por encima del límite inferior, así que encuentre el punto de intersección P1' en este límite y borre la parte de P1 a P1 '.

4. Procesamiento de límite superior:

Determine la posición del punto de intersección del límite superior P2 '', recorte la parte por encima del límite superior y guarde el segmento interno de P1 'a P2' '.

Luego procese P3P4:

Para el segmento de línea P3P4, P3 está fuera del límite izquierdo y P4 está dentro del límite izquierdo. Por lo tanto, calcule el punto de intersección P3 'y borre el segmento de línea de P3 a P3'.

Al probar los códigos de área de los puntos finales P3 'y P4, los segmentos de línea restantes están todos debajo de la ventana de recorte, por lo que se borran.


Referencias:
1. "Computer Graphics: Third Edition" Cai Shijie y otras traducciones Electronic Industry Press

                                </div>
16 artículos originales publicados · Me gusta1 · Visitas 180

Supongo que te gusta

Origin blog.csdn.net/weixin_44931542/article/details/105562658
Recomendado
Clasificación