Você está na página 1de 17

Clipping con Cohen Sutherland

Clipping

Por clipping nos referimos a la optimización pensada para que dada una
primitiva de render, ajustarla para solo pintar las regiones que estan
visibles en la pantalla. Para ello necesitamos calcular los vertices de las
figuras dentro del area visible.
Esta tarea es vital no solo para optimizar el código sino
tambien para asegurarnos de que no nos salimos fuera de
memoria a la hora de pintar en el framebuffer.

Hoy en día esta tarea la realiza automaticamente la GPU


aunque es importante conocer sus fundamentos
matemáticos.

El concepto de clipping tambien se usa para referirse a recortar


una primitiva sobre un area.
El rectángulo de Clipping

Definimos el area de la zona de clipping mediante un


rectangulo definido por los valores Xmin, Ymin, Xmax, Ymax

Un punto está dentro del area de clipping si:

Xmin <= X <= Xmax, Ymin <= Y <= Ymax

Cualquier punto que no cumpla estas reglas queda fuera del


area de clipping.
Clipping de lineas

● Para hacer clipping de una linea necesitamos saber sus


extremos.
● Si los dos extremos se encuentran dentro del area de
clipping entonces la linea está totalmente dentro (caso
trivial).
● Si uno de los extremos está dentro y el otro fuera de la
región, entonces la linea está parcialmente dentro del
rectangulo de clipping, intersectandolo, en tal caso
necesitamos computar el punto de intersección.
● Si los dos puntos estan fuera de la región de clipping puede
que la linea esté parcialmente dentro o directamente esté
fuera. Necesitaremos hacer diferentes calculos para
averiguarlo.
Casos en el clipping de lineas

Ejemplo de los diferentes casos posibles.


Algoritmo de Cohen-Sutherland
Cohen Sutherland propuso un algoritmo sencillo para ajustar
una linea al rectangulo de clipping.

Se divide en dos fases:

● Comprobar casos triviales


o Segmentos completamente dentro
o Segmentos completamente fuera
● Si no se dan os casos triviales se buscan los puntos de
intersección con el rectangulo.

De esta manera tratamos de ahorrarnos hacer los calculos si


nos encontramos en los casos triviales.
Cohen Sutherland
Para determinar si estamos en un caso trivial Cohen
Sutherland divide la región de nuestro mundo en nueve
areas:
● el area de clipping
● las que hay por encima y por debajo
● las de los laterales
● las que hay en las diagonales

Y a cada area le asigna un código binario que indica si está


por encima, por debajo, a la derecha o a la izquierda del
area de clipping.

En la siguiente imagen podemos ver una explicacion gráfica


de la división.
Codigos de las areas
Codigos de area
A cada vertice de nuestro segmento le asignamos el código
que corresponde con el area donde se encuentra:

● Primer bit a uno si Y > Ymax


● Segundo bit a uno si Y < Ymin
● Tercer bit a uno si X > Xmax
● Cuarto bit a uno si X < Xmin

De manera que si el punto queda dentro del area de clipping


su código debería ser 0000.

Usamos un sistema de bits porque nos simplificará el trabajo


de determinar los casos triviales mediante comparaciones
binarias.
Casos del algoritmo

● Si los codigos de ambos extremos son 0000 entonces el


segmento se encuentra completamente dentro del area de
clipping y no necesitamos hacer nada más.
● Si los codigos de ambos extremos tienen un mismo bit a 1,
entonces podemos descartar la linea ya que queda fuera y
no intersecta con el area de clipping.
o Para hacer el cálculo basta hacer un operador AND entre
los dos códigos, esto nos retornará != 0 si existe algun bit
comun.
● Si los dos extremos no tienen ningun bit común, entonces
puede que la linea intersecte con el rectangulo de clipping y
necesitamos calcular en qué punto colisiona con el
rectangulo de clipping.
Intersección con el area de Clipping
Para determinar en qué punto colisiona con el rectangulo de
clipping usamos la ecuación de la recta:

Resolvemos la ecuación para la linea que define el lado del


rectangulo en el que queremos saber el punto de colision.

Si queremos ver si colisiona con el lado izquierdo, sabemos


cual será la X en el punto de colisión (Xmin), resolvemos
usando Xmin como X y nos dará la Y. De este modo
sabemos el punto de colisión.
Intersección con lado del area de clipping

Ejemplo de intersección con el lado izquierdo del area de


clipping, definido por el segmento X = Xmin
Iterando el algoritmo
Una vez tenemos el nuevo punto de colisión podemos
reemplazar el lado que quedaba fuera por dicho valor y
recomputar su código.

Comprobamos si estamos en un caso trivial, si es así podemos


finalizar, sino ajustamos la colisión con otro lado del
rectangulo.

Al final el algoritmo llegará a un caso trivial (ambos puntos


quedan fuera y en un mismo lado del rectangulo o ambos
puntos quedan dentro).
Clipping(x0, y0, x1, y1, xmin, ymin, xmax, ymax) {
// calcular codigos de vertice
C0 = computeCode(x0, y0, xmin, ymin, xmax, ymax);
C1 = computeCode(x1, y1, xmin, ymin, xmax, ymax);
do {
// Trivial aceptado: Dentro
if((C0 | C1) == 0) {
accept = TRUE; done = TRUE;
} else // Trivial rechazado: afuera
if((C0 & C1) != 0) {
done = TRUE;
}
else { //otro caso
// Tome un vertice
if(C0) {C = C0;} else {C = C1;}
//encontrar la interseccion con la linea superior del area de recorte
if(C & TOP) {
y = ymax; //y debe ser ymax en el punto de intercepcion
x = ... //calcular la X usando la ecuacion de la linea
}
//repetir para la linea inferior, izquierda y derecha
//...
}
if(C == C0) { //asignar posicion y volver a calcular el codigo
x0 = x; y0 = y;
C0 = ComputeCode(x0, y0, xmin,ymin,xmax,ymax);
} else{
x1 = x; y1 = y;
C1 = ComputeCode(x1, y1, xmin,ymin,xmax,ymax);
}
} while (done == FALSE);
}
Prueba de escritorio
Trazar la línea definida por los puntos A = (0, 0), B = (6, 6) y
ventana (3, 1), (9, 1), (9, 5) y (3, 5).

- Gráficamente y ya habiendo realizado los cálculos


para el trazado de líneas quedaría de esta manera:
- Como se ve a simple vista los puntos que están fuera
del limite de la ventana son los siguientes: (0,0), (1,1),
(2,1), (2,2) y (6,6).

- Evaluaremos estos punto con las diferente


condiciones que hay en nuestro algoritmo,
concluyendo al final el trazado de los puntos que se
encuentran dentro del limite de nuestra ventana:

- Así quedaría dibujada esta línea utilizando el


algoritmo de recorte de Cohen-Sutherland.

Você também pode gostar