Blast.GIF">
Viene usato quando una faccia esce dalla zona visibile dello screen. Con questa routine e' possibile disegnare solo i pezzi del poligono interni allo screen ed eliminare quelli esterni.
Esempio:
Poligono da disegnare :
/\
/ \
/ \
/ \
/ \
\ /
\ /
\ /
\ /
\/
Schermo:
+---------+
| |
| |
| |
| |
| |
| |
| |
| |
+---------+
Somma:
/\
/ \
+/----\---+
/ \ |
/| \ |
\| / |
\ / |
|\ / |
| \ / |
| \/ |
| |
+---------+
Uso del clipping:
+/----\---+
/ \ |
| \ |
| / |
\ / |
|\ / |
| \ / |
| \/ |
| |
+---------+
Per tagliare le parti esterne allo screen e' necessario prendere in considerazione una linea del poligono alla volta, controllare le coordinate dei 2 punti e, nel caso in cui solo un punto esca dallo screen, calcolare le intersezioni con lo screen.
Esistono alcuni casi in cui e' inutile disegnare una linea:
* entrambi i punti escono dallo screen
* la linea e' orizzontale
Se la linea e' orizzontale e' inutile disegnarla, facciamo un esempio pratico:
----------
| |
| |
| |
| |
| |
| |
----------
Il blitter riempe una zona di memoria iniziando quando trova un pixel e finendo quando ne trova un altro. Nell'esempio avremo il poligono perfettamente riempito solo con le due linee verticali.
Ecco il sorgente in codice assembler 68020+
move.l #X0,d0 move.l #Y0,d2 move.l #X1,d1 move.l #Y1,d3 * START CLIPPING Clip: cmp.l d2,d3 ; se y1 = y2 -> NON DISEGNARE LINEA bne.s Continua NO_LINEA: rts * VOGLIO X0 < X1 Continua: cmp.l d0,d1 bgt.s X0MinoreX1 exg.l d0,d1 exg.l d2,d3 X0MinoreX1: * CONTROLLO LATO SINISTRO tst.l d0 bpl.s NOClippingSinistro ; se d0 positivo allora no clip. sinistro tst.l d1 ; d0 < 0 , d1 < 0 FUORI SCREEN bmi.s NO_LINEA ** CLIPPING SINISTRO ClipSinistro: moveq