Algoritmo di Cohen-Sutherland

2

Stavo leggendo l'algoritmo Cohen-Sutherland su Wikipedia e sono confuso in queste due parti ,

int ComputeOutCode(double x, double y) {
    ...
    if (x < xmin)       code |= LEFT;
    else if (x > xmax)  code |= RIGHT;
    if (y < ymin)       code |= BOTTOM;
    else if (y > ymax)  code |= TOP;
    ...
}

e

if (outcodeOut & TOP) {           // point is above the clip rectangle
    x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0);
    y = ymax;
} else if (outcodeOut & BOTTOM) { // point is below the clip rectangle
    x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0);
    y = ymin;
} else if (outcodeOut & RIGHT) {  // point is to the right of clip rectangle
    y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0);
    x = xmax;
} else if (outcodeOut & LEFT) {   // point is to the left of clip rectangle
    y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0);
    x = xmin;
}

Ciò che mi confonde è: come gestisce i punti che sono in alto a sinistra, in alto a destra, ecc. Gestisce solo in alto, a sinistra, a destra e in basso.

Perché utilizzare | in code |= LEFT; e outcodeOut & TOP in if-else sotto di esso? So che questi due in qualche modo gestiscono tutti gli 8 possibili casi ma non so come.

    
posta Sourabh 08.12.2013 - 18:44
fonte

1 risposta

3

code è un campo bit che utilizza operatori booleani bit per memorizzare se determinati flag sono impostati o meno.

code |= LEFT; è l'abbreviazione di code = code | LEFT; e imposta il flag LEFT . outcodeOut & LEFT è un'espressione che è true solo (! = 0) quando è impostato il flag LEFT .

L'estratto mostrato non gestisce tutti i (16) possibili casi contemporaneamente, ma fa parte di un ciclo più grande che può essere eseguito più volte. Quindi è fatto in diverse iterazioni.

    
risposta data 09.12.2013 - 00:15
fonte

Leggi altre domande sui tag