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.