Blast.GIF">

FILLED VECTORS (PARTE 3)


CLIPPING

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