Loading

Alison's New App is now available on iOS and Android! Download Now

Study Reminders
Support
Text Version

Set your study reminders

We will email you at these times to remind you to study.
  • Monday

    -

    7am

    +

    Tuesday

    -

    7am

    +

    Wednesday

    -

    7am

    +

    Thursday

    -

    7am

    +

    Friday

    -

    7am

    +

    Saturday

    -

    7am

    +

    Sunday

    -

    7am

    +

Ciao e benvenuto alla lezione numero 27 della grafica del corso. Stiamo discutendo la pipeline grafica 3D, come potrete raccoglierla ha 5 tappe e abbiamo già discusso 4 tappe nei dettagli e attualmente siamo nella quinta tappa. Quindi, facciamo solo un rapido risguardo alle 5 tappe.
Come potete vedere in questa figura. Abbiamo già discusso per la prima fase dei dettagli, la rappresentazione dell'oggetto, poi la trasformazione modellistica di seconda fase, l'illuminazione di terza fase o l'assegnazione del colore, la pipeline di visualizzazione di quarta fase e attualmente siamo alla conversione o rendering della quinta fase.
Ora, nella conversione di scansione quello che facciamo, cerchiamo essenzialmente di mappare la descrizione di un'immagine data nel sistema di coordinate del dispositivo ad una descrizione sulla griglia di pixel che significa, impostare pixel. Così, nelle lezioni precedenti abbiamo coperto i metodi seguiti per una tale mappatura, per il punto, la linea e il cerchio.
E abbiamo visto come possiamo migliorare l'efficienza di questi metodi introducendo approcci migliori come l'algoritmo di disegno della linea di Bresenham utilizzato per la conversione della scansione della linea, l'algoritmo di midpoint per la conversione della scansione del cerchio e così via. Oggi si parlerà di un'altra tecnica di conversione della scansione relativa alle aree di riempimento, insieme a quella che discuteremo anche di come visitiamo caratteri che significano le lettere, numeri etcetera sullo schermo. Cercheremo di ottenere un'idea ampia sul rendering dei caratteri.
Lasciateci, iniziare con il rendering di area di riempimento. Quindi, prima cerchiamo di capire cos' è una zona di riempimento.
Quello che abbiamo discusso finora, come determinare pixel che definiscono una linea o un limite di cerchio.
A volte questo potrebbe non essere il caso, a volte potremmo conoscere pixel che fanno parte di una regione. E potremmo voler applicare un colore specifico a quella intera regione. Allora, prima cosa abbiamo fatto? Abbiamo determinato pixel che fanno parte di una singola linea o del confine del cerchio, ma a volte ci possono essere situazioni in cui potremmo andare per assegnare i colori a regione piuttosto che una linea o un confine.
Ecco, questo è lo stesso che dire che vogliamo riempire una regione con un colore specificato. Quindi, questo è il rendering dell'area di riempimento, uno degli argomenti della nostra discussione di oggi. Quindi, quando si parla di rendering di area di riempimento ci riferiamo a una regione e il nostro obiettivo è riempire quell' intera regione che significa i pixel che fanno parte di quella regione con un colore specificato. Questo è in contrasto con quanto abbiamo appreso in precedenza dove il nostro obiettivo era quello di scoprire pixel e di assegnare ovviamente colori a loro che fanno parte di una linea o del confine di un cerchio.
Cerchiamo di capire questo concetto con un esempio. Considerare un sistema di verniciatura interattiva, quindi in quel sistema cosa facciamo? Potremmo provare a disegnare qualsiasi forma arbitraria e poi potremmo voler assegnare alcuni colori a quella forma, questo significa assegnare dei colori all'interno del limite di quel set. Inoltre, potremmo voler cambiare il colore, per prima cosa possiamo volerlo colorare, colorare quella forma arbitraria che abbiamo disegnato.
Ora, quando diciamo che stiamo cercando di colorare qualche forma che significa che vogliamo colorare il confine così come l'interno. Potremmo anche voler cambiare colore e che troppo interattivo che significa selezionare qualche colore da un menù, clicca sull'interno della forma per indicare che il nuovo colore da applicare a quella forma. Se avete usato un qualche sistema di pittura interattiva, allora forse già conoscete queste cose.
Per esempio, supponiamo che questo sia il nostro canvas e qui abbiamo disegnato una forma qualcosa del genere, allora ci può essere un menu di colore o dire tavolozza di colore, quindi potremmo scegliere questo menu, diciamo per esempio questo colore clicca il nostro puntatore del mouse o toccare un punto all'interno di questa forma e poi il colore del centro viene applicato nell'interno di questa forma. Quindi, cioè colorazione interattiva di una forma. E qui come potete vedere, ci preoccupiamo di colorare una regione piuttosto che solo il confine, a differenza di quello che abbiamo fatto quando stavamo cercando di determinare pixel così come i loro colori per linee o confini di cerchio La domanda è come possiamo eseguire tale colorazione o il riempimento di regione? Ora, questo dipende da come sono definite le regioni, quindi ci possono essere modi diversi per definire una regione e a seconda di quella definizione possiamo avere approcci di riempimento di regione.
Sostanzialmente ci sono due definizioni di una regione, una è la definizione del livello di pixel una è la definizione geometrica.
In caso di definizione di livello di pixel definiamo una regione in termini di pixel che significa che potremmo definire la regione in termini di pixel limite o potremmo definire la regione in termini di pixel all'interno di un limite. Nel primo caso quando stiamo definendo una regione in termini di pixel di confine o la serie di pixel che definiscono il limite tale definizione si chiama limite definito.
Nell'altro caso non definiamo esplicitamente un limite ma impostato di pixel che definisce l'intera regione in quel caso lo chiamiamo interno definito. Quindi, queste definizioni pixel sono utili quando ci occupiamo di regioni che hanno confini complessi o come abbiamo appena visto applicazioni come i sistemi di verniciatura interattivi. Quindi, per forme complesse, è difficile affrontare il limite, quindi la loro definizione di livello di pixel può essere utile. Anche nelle definizioni di livello dei sistemi interattivi pixel sono molto utili.
L'altro tipo di definizione di area di riempimento è la definizione geometrica, qui definiamo una regione in termini di primitivi geometrici come i bordi e i vertici che abbiamo già visto prima durante le nostre tecniche di rappresentazione dell'oggetto. Ora, questo particolare approccio si intende principalmente per le regioni poligonali. E queste definizioni sono comunemente usate in pacchetti grafici generali, che abbiamo già citato in precedenza.
Quindi, definizioni essenzialmente geometriche significa, definire una regione in termini di primitivi geometrici come i bordi, i vertici, se si può riraccogliere abbiamo discusso di tali cose durante la nostra discussione sulla rappresentazione oggettiva dove abbiamo usato listino vertex, elenco edge per definire oggetti o regioni. E quando ci occupiamo di definizioni geometriche, si intendono principalmente definire regioni poligonali in forma.
Ora, con questa conoscenza di due ampie definizioni di regioni, cerchiamo di capire i diversi algoritmi di conversione della scansione di riempimento della regione. Partiremo con un semplice approccio che si chiama algoritmo di riempimento delle sementi. Quindi, quello che ci fa provare a capire.
Quindi, l'idea è molto semplice per un algoritmo di riempimento delle sementi, iniziamo con un pixel interiore e coloriamo progressivamente la regione, questa è un'idea semplice.
Chiaramente qui stiamo assumendo una definizione di livello di pixel particolarmente, una definizione limite di una regione, dove sono specificati i pixel di confine. E supponiamo anche di conoscere almeno un pixel interiore, ora che pixel si chiama pixel del seme e se conosciamo i pixel di confine possiamo decidere su qualsiasi pixel di seme, è facile, perché abbiamo a che fare con un seed pixel, quindi l'algoritmo è denominato algoritmo di riempimento dei semi. Quindi, abbiamo un pixel di semi e abbiamo definizioni limite della regione in termini di pixel.
Accanto a questo algoritmo si ipotizza anche che i pixel interni siano collegati ad altri pixel in entrambi i due modi, o possono essere collegati a 4 pixel che si chiamano 4 collegati o possono essere collegati a 8 pixel, che si chiama 8 connesso. Ora, questi sono i pixel vicini per esempio supporre che questo sia un seed pixel e ci sono pixel in giro, se questa è la griglia, dove il cerchio mostra i pixel, allora questi pixel possono essere collegati a 4 pixel vicini o a tutti i 8 pixel vicini.
Di conseguenza, la natura di connessione è chiamata 4 connessa o 8 connessa. Quindi, quando parliamo di 4 collegati, sostanzialmente supponiamo che ci faccia ridisegnare nuovamente la cifra, supponiamo che questi siano i pixel questi punti di intersezione della griglia, questo è un pixel, ora in caso di 4 collegati i 4 pixel vicini sono definiti top, inferiore, sinistro e destro che significa che questo è il top, questo è il basso, questo è giusto e questo è lasciato.
Mentre quando ci occupiamo di 8 pixel connessi abbiamo a che fare con i 8 vicini top, top a sinistra, questo è il top di sinistra, poi top proprio qui, poi sinistra, destra, fondo, basso a sinistra questo è qui e in basso proprio qui. Quindi, o di queste connessioni possiamo assumere. E di conseguenza l'algoritmo viene eseguito.
Quindi, l'idea di base è semplice che manteniamo una pila, il seed pixel viene spinto per la prima volta nella pila e poi un loop eseguito fino a quando la pila non è vuota. Ora, in ogni passo, facciamo pop il pixel top di stack e assegniamo il colore desiderato a quel pixel.
L'algoritmo è mostrato qui. Allora, qual è il nostro input? Il colore dei pixel di confine, il colore specificato, che vogliamo assegnare alla regione e al seme o all'interno pixel, chiunque seme pixel e l'output sono i pixel interni con il colore specificato che è il nostro obiettivo. Iniziamo con spingere il pixel del seme in una pila e poi entriamo in un loop in cui impostiamo l'attuale pixel per essere il pixel top di stack posiziandolo dalla pila, applicare il colore specificato a quel pixel, poi facciamo uso della proprietà connessa.
Quindi, se stiamo ipotizzando che si tratti di un pixel connesso 4, allora per ognuno dei 4 pixel connessi o se stiamo ipotizzando che sia 8 pixel connesso allora per ognuno dei 8 pixel connessi dell'attuale pixel, cosa facciamo? Controlliamo se il colore di pixel connesso non è uguale al colore di confine che significa non aver raggiunto il limite o il colore dei pixel collegati non è uguale al colore specificato che significa che dobbiamo ancora assegnarlo qualsiasi colore, poi lo spingiamo allo stack.
Quindi, per ogni pixel spingiamo o 4 pixel connessi allo stack o 8 pixel connessi allo stack a seconda della natura di connettività che assumiamo. E poi torniamo qui e il loop continua ancora la pila vuota che significa che abbiamo raggiunto il confine o abbiamo assegnato colori a tutti gli interni pixel. Questa è la semplice idea dell'algoritmo di riempimento delle sementi. Successivamente si parlerà di un altro approccio che si chiama alluvione. L'idea è quasi simile con alcune variazioni minori. Vediamo come funziona.
Ora, in caso di algoritmo di riempimento delle alluvioni, assumiamo una definizione diversa che è una definizione interiore che significa che i pixel interni sono noti. In precedenza abbiamo ipotizzabile la definizione di limite con un solo pixel interiore, ovvero il pixel del seme. Ora, qui stiamo assumendo una definizione interiore, questo significa che tutti i pixel interiori sono noti. E il nostro obiettivo è quello di colorare o ricolvero la regione con un colore specificato.
L'idea è simile al seme riempire, con qualche differenza. Ora, in questo caso le decisioni sono prese in base al colore interiore originale dei pixel attuali invece del colore dei pixel di confine. Altre cose restano le stesse, questo significa usare una pila e utilizzare gli elementi di pila in modo particolare, colorandoli in modo particolare rimane lo stesso.
Così, l'algoritmo viene mostrato qui di nuovo in input è il colore dei pixel interiori, il colore specificato e l'unico pixel interiore o il pixel di seme, qui è ancora più facile perché conosciamo già i pixel interni e possiamo scegliere casualmente un pixel e l'output è dopo aver assegnato i colori a tutti i pixel il set di pixel.
Ora, spingiamo i pixel di semi a pilotarlo e come prima di entrare in un loop, prima facciamo pop la pila e la impostiamo sull'attuale pixel che applica il colore specificato, quindi ipotizziamo la connettività come abbiamo fatto prima, ci occupiamo di 4 o 8 pixel connessi e per ogni pixel facciamo il controllo, ora qui il controllo è leggermente diverso rispetto a quello che abbiamo fatto in precedenza. Qui controlliamo se il colore del pixel connesso è il colore interiore.
Solo in quel caso spingiamo il pixel connesso, perché qui non possiamo controllare per il colore di confine, non c'è limite specificato. E poi continuiamo come prima che la pila sia vuota. Così, in entrambi i casi iniziamo con un pixel di semi, ma in un caso ci occupiamo di una definizione limite di pixel, in altri casi ci occupiamo di una definizione interiore di regione in termini di pixel. E di conseguenza il nostro algoritmo cambia leggermente altrimenti un'idea più ampia rimane la stessa.
Discuteremo di un terzo approccio, che si affida alla definizione geometrica che si chiama algoritmo di riempimento della linea di scansione. Quindi, i precedenti approcci di semi riempimento o riempimento di alluvione dipendono dalle definizioni di pixel. In caso di algoritmo di riempimento della linea di scansione, dipendiamo dalla definizione geometrica.
Quindi, qui supponiamo che la regione sia definita in termini di vertici e spigoli, ovviamente qui l'assunzione implicita è che la regione sia poligonale e i vertici siano arrotondati ai pixel più vicini. Queste sono le cose che assumiamo.
Prima discuteremo l'algoritmo e poi cercheremo di capirlo in termini di esempio illustrativo. Quindi, qui l'input è impostato su vertici e l'output sono i pixel, pixel interni con colore specificato. Dai vertici quello che facciamo è determinare il massimo, le linee di scansione minime, che significa i valori minimi e minimi per il poligono.
Così, ad esempio qui supponiamo che questa sia la nostra griglia di pixel e abbiamo forma così, quindi dobbiamo conoscere il minimo y che è qui ymin e massimo y che dice qui ymax. Quindi, questo massimo e minimo primo stabiliamo, poi partiamo dalla linea di scansione minima, cioè la più bassa qui.
E poi entriamo in loop e continuiamo nel loop fino a raggiungere la linea di scansione massima come mostrato in questa condizione di loop. Quindi, nel loop cosa facciamo? Per ogni bordo o la coppia di vertici del poligono se vai per un controllo se la linea di scansione è all'interno di una certa gamma definita dalle coordinate y del bordo, allora stabiliamo il punto di intersezione della linea di scansione edge.
Dopo questi passi cosa facciamo? Ordiniamo i punti di intersezione in ordine crescente di x coordinate, questo significa che prima cerchiamo di determinare i punti di intersezione poi li diciamo in ordine crescente, poi applicare il colore specificato ai pixel che sono all'interno dei punti di intersezione tutti i pixel intermedi applichiamo il colore e poi andiamo alla prossima linea di scansione, questa è l'idea ampia.
Quindi, prima stabiliamo il minimo e massimo iniziamo con minimo e proseguiamo l'elaborazione fino a raggiungere la linea di scansione massima. In ogni fase della lavorazione o di ogni esecuzione di loop cosa facciamo? Stabiliamo questi due punti di intersezione del bordo con le linee di scansione per ottenere i due estremi su una singola linea di scansione e poi assegnare il colore specificato a tutti i pixel che sono all'interno di questi estremi, questa è l'idea semplice. Cerchiamo, ora cerchiamo di capirlo in termini di un esempio.
Passeremo attraverso un esempio illustrativo per avere maggiore chiarezza sull'algoritmo.
Consideriamo questa figura. Qui è presente una zona di poligono o di riempimento specificata con 4 vertici A, B, C e D come qui mostrato. Ora, abbiamo seguito una convention di denominazione anti - clockwise, quindi ci sono 4 spigoli AB, BC, CD e DA.
Ora prima, stabiliamo l'estensione minima e massima delle linee di scansione. Qui è il 1 è il minimo che potete vedere qui e 6 è la linea di scansione massima, questo lo stabiliamo come primo passo.
Poi iniziamo il loop. Quindi, partiamo da 1 e continuiamo fino al 6 e in ogni esecuzione del loop elaboriamo una linea di scansione. Quindi, quando iniziamo con 1, quindi il nostro obiettivo è quello di determinare i punti di intersezione della linea di scansione y pari a 1 con tutti i 4 spigoli presenti nel loop interno dell'algoritmo che le linee da 6 a 10.
Se esegui le righe, scoprirete che per il bordo AB la condizione se soddisfatta e il punto di intersezione è A, per i bordi BC e CD la condizione non è soddisfatta, di nuovo per DA la condizione è soddisfatta e ci riprendiamo A, quindi il punto di intersezione è solo A.
Dato che è già un vertice, non ci possono essere pixel intermedi. Così, otteniamo 2 punti di intersezione, che è lo stesso vertice A, quindi è l'unico pixel e applichiamo il colore specificato.
Poi andiamo alla iterazione successiva impostando la linea di scansione pari a 2 e verificando che 2 non è la linea di scansione massima che è 6, quindi eseguiamo nuovamente il loop.
Nella seconda iterazione del loop, cosa facciamo? Controlliamo i punti di intersezione come prima con i bordi e la linea di scansione y pari a 2, cioè questa linea di scansione.
Ora, per y pari a 2 e se controlliamo i bordi vediamo che per AB se la condizione è soddisfatta che significa che c'è un punto di intersezione, usando l'equazione della linea edge e l'equazione della linea di scansione possiamo ottenere il punto di intersezione come questo, questo punto, per BC e CD la se condizione non soddisfa per BC e CD, quindi non c'è intersezione.
E per il DA la condizione soddisfa, di nuovo. Quindi, questo è per il punto di intersezione AB, questo è per il punto di intersezione DA e questo punto di intersezione DA possiamo trovare di essere (3, 2) utilizzando l'equazione di linea per il bordo oltre che l'equazione della linea di scansione. Quindi, questo punto è un punto di intersezione, questo punto è un altro punto di intersezione.
Poi eseguiamo uno smistamento come menzionato nell'algoritmo e otteniamo questi due punti di intersezione in ordine ordinato come questo. Quindi, questo è un punto di intersezione e questo è l'altro punto di intersezione. Tra i pixel ci sono come si può vedere così questo stesso è un pixel in-tra, poi abbiamo questo pixel, che è (4, 2) e poi abbiamo (5, 2).
Da notare che l'altro punto di intersezione non è un pixel in sé perché coinvolge un numero reale come coordinato. Così, abbiamo scoperto i 3 pixel, che ci sono tra i due punti di intersezione, poi applichiamo il colore specificato a questi pixel. Poi resettiamo la linea di scansione a 3 e verifichiamo se 3 è la linea di scansione massima, non è così rientriamo nuovamente il loop.
E in modo simile processiamo le linee di scansione y= 3, y= 4, y= 5 fino a y=6. Ecco, questa è l'idea dell'algoritmo. Quindi, per riepilogare qui in questo algoritmo di riempimento del poligono di scansione, cosa facciamo? Assumiamo una rappresentazione geometrica della regione, regione poligonale in termini di spigoli o vertici. Poi per ogni linea di scansione che c'è tra le linee di scansione minime e massime, cosa facciamo? Stabiliamo i punti di intersezione dei bordi con quelle linee di scansione, ordinateli per ottenere due punti di intersezione estrema, identifichiamo l'in tra pixel e colore quei pixel. E questo facciamo per tutte le linee di scansione che ci sono tra le linee di scansione minime e massime.
Ora, ci sono due cose che richiedono qualche elaborazione nell'algoritmo.
Innanzitutto come si determina il punto di intersezione della linea di scansione 8, che penso tutti sappiano che possiamo usare l'equazione di linea che possiamo determinare dai due endpoint e possiamo usare l'equazione della linea di scansione per ottenere il punto di intersezione. Quindi, questa equazione di linea può essere valutata con il valore della linea di scansione per ottenere il punto di intersezione, che è un approccio molto semplice e penso che tutti voi potreste già sapere come fare.
In secondo luogo come determinare i pixel all'interno di due punti di intersezione? Questo è di nuovo molto semplice, partiamo da sinistra più pixel che è il punto di intersezione o appena accanto al punto di intersezione e poi proseguiamo lungo la linea di scansione fino a ottenere un valore di pixel inferiore al giusto punto di intersezione. Pixel x coordinati controlliamo in tutti questi controlli. Quindi, entrambi sono semplici, ma il secondo punto che è come determinare pixel all'interno di due punti di intersezione non è così semplice come appare. E perché questo è così?
Se suppitiamo di avere un poligono concavo, allora c'è un problema. Quindi, di gran lunga qualunque spiegazione sia data si basa sul presupposto che ci occupiamo di poligoni convessi. Per i poligoni concavi non è così facile determinare i pixel intermedi, sono presenti ulteriori problemi che devono essere risolti prima di determinare i pixel interni.
Facciamo un esempio, qui in questa figura come potete vedere questo è un poligono concavo, quindi quando ci occupiamo di questi due punti di intersezione estrema, alcuni pixel sono al di fuori del poligono, sebbene se seguiamo l'approccio che abbiamo delineato in precedenza che ci muoveremo lungo questa linea per ottenere tutti i pixel intermedi, allora i pixel esterni saranno trattati anche come interni pixel, che sicuramente non vogliamo. Quindi, dobbiamo andare per qualche approccio diverso quando ci occupiamo di poligoni concavi. Quello che dobbiamo fare è, dobbiamo stabilire esplicitamente dentro pixel, pixel che sono all'interno del poligono. Come potete vedere dalla figura che non è così scontata per i poligoni concavi.
Quindi, in questo caso dobbiamo eseguire un test all'interno esterno per ogni pixel che è ovviamente un sovrapposto aggiuntivo.
E come possiamo farlo? Quindi, per ogni pixel p quello che possiamo fare è determinare la scatola di bounding del poligono che è il valore massimo e minimo x e y dei vertici poligoni. Questo è il primo passo, poi nel secondo passo scegliamo un pixel arbitrario, diciamolo da p0, al di fuori della casella di bounding.
Quindi, in questo caso, questa può essere la nostra casella di bounding, come potete vedere copre tutti i vertici del poligono. Poi scegliamo un pixel fuori da questa casella di bounding da qualche parte diciamo qui, che significa scegliere un punto (x, y) che è al di fuori della gamma min e max delle coordinate poligonali. Nella terza fase creiamo una linea aderendo a p e p0.
Così, creiamo una linea tra il pixel che è dentro che è il nostro pixel di preoccupazione e il punto che si trova fuori dalla scatola di bounding. Nella fase finale andiamo per alcuni controlli, se la linea interseca i bordi poligoni anche numero di volte poi p è fuori, altrimenti è dentro. Quindi, come potete vedere supponiamo di avere un pixel qui e questi due pixel se ci uniamo si interseca una volta, questo è strano numero di volte, quindi questo pixel è dentro.
Mentre, se abbiamo a che fare con un pixel qui e ci uniamo a questo, così come potete vedere qui l'incrocio è due volte che è anche numero di volte, quindi questi pixel sono fuori. Allo stesso modo, questi pixel se ci uniamo a queste due linee, vediamo che non interseca i bordi poligoni, quindi vale 0, quindi in quel caso anche fuori.
Ma ovviamente tutti questi controlli richiedono tempo, quindi si tratta di un sovrapposto aggiuntivo quando ci occupiamo di poligoni concavi. In caso contrario, l'algoritmo di riempimento della linea di scansione della linea per i poligoni convessi è piuttosto semplice. Così, abbiamo discusso di diversi algoritmi di riempimento della regione, sia per le definizioni di livello di pixel che per le definizioni geometriche.
Per le definizioni di livello di pixel abbiamo appreso dell'algoritmo di riempimento dei semi e dell'algoritmo di riempimento delle alluvioni, entrambi sono simili con variazione minore. Per le definizioni geometriche abbiamo imparato sull'algoritmo di riempimento della linea di scansione della linea di scansione, questo algoritmo è abbastanza semplice e semplice quando ci occupiamo di poligono convesso, ma richiede controlli aggiuntivi quando ci occupiamo di poligoni concavi. Ora, cerchiamo di capire come vengono visualizzati i caratteri sullo schermo del computer. Allora, come facciamo a rendere i personaggi?
Qui, il carattere significa caratteri alfanumerici.
Ora, il rendering dei caratteri è ovviamente come tutti sappiamo essere una questione importante, ad esempio considerare questa slide, qui vediamo comparsi molti caratteri alfanumerici visualizzati. Quindi, chiaramente si tratta di una questione importante e questo è l'edificio blocchi di qualsiasi contenuto testuale, quindi qualsiasi applicazione che si occupa della visualizzazione dei testi deve avere supporto per il rendering dei caratteri. E come si fa?
Come tutti sappiamo quando ci occupiamo di qualche applicazione di elaborazione del testo, di solito grande quantità di testo deve essere visualizzata in breve tempo. Ad esempio, se consideriamo lo scorrimento, ora con ogni azione di scorrimento si ridisegna tutta la serie di caratteri e questo deve essere fatto molto rapidamente. Quindi, il rendering efficiente dei personaggi è un tema molto importante nella grafica informatica.
Ora, prima di provare a capire il rendering dei personaggi, facciamo un rapido sguardo al font dell'idea e sappiamo già probabilmente già sentito parlare di questo termine, quindi vediamo cosa è un font e come viene affrontato all'interno della computer grafica.
Così, quando parliamo di font, font o tipografia denota stile di design complessivo dei personaggi e ci sono molti font così come probabilmente tutti utilizzano ogni giorno come Times New Roman, Courier, Arial e così via. Quindi, questi font o caratteri tipografici indicano lo stile di design dei personaggi come sembrano.
Ora, ogni font può essere reso con aspetto variabile. Quindi, l'aspetto può essere diverso, può essere audace, può essere italicizzato o può essere sia audace che italicizzato.
Insieme a quello c'è un altro concetto chiamato dimensione, quanto grande o piccolo il carattere appare sullo schermo. Quindi, che è denotato per punto, ad esempio un font a 10 punti, font a 12 punti e così via che è un maggiore di altezza di carattere in pollici e questo termine viene preso in prestito dalla tipografia, ma nella grafica computerizzabile non usiamo la misura originale.
Suppliamo invece che il punto sia equivalente a 1/72 di un pollice o di circa 0,0139 pollici. E questo è anche noto come DTP o desktop publishing o punto postscript. Quindi, quando si parla di un punto, suppliamo che si tratti di 1/72 di un pollice o di circa 0,0139 pollici, che indica l'altezza del carattere.
Ora, con quella conoscenza di base, cerchiamo di capire come vengono resi i personaggi.
Quindi, ci sono sostanzialmente due modi di rendering dei personaggi, uno è bitmap uno è delineato.
In caso di font bitmap, definiamo una griglia di pixel per ogni carattere, ad esempio consideriamo questa 8 da 8 pixel grid e possiamo definire la griglia per il carattere B in maiuscolo, dove i pixel che fanno parte dei caratteri sono contrassegnati su ON e altri sono OFF. Così, quando la griglia viene resa per B, solo quei pixel saranno illuminati altri pixel non sarà illuminato. I cerchi neri qui indicano i pixel ON come potete vedere qui e le scatole bianche indicano i pixel OFF. Così, possiamo avere questo tipo di griglia per ogni carattere quando ci occupiamo di font bitmap.
Al contrario quando ci occupiamo di font di ingombro l'approccio è totalmente diverso, qui i personaggi sono definiti utilizzando primitivi geometrici come i punti e le linee. Così, pochi pixel magari forniti e poi altri pixel saranno determinati utilizzando tecniche di conversione di scansione per punti, linee e cerchi.
Quindi, sostanzialmente pochi pixel vengono forniti e utilizzando quei pixel il computer attira i primitivi come linee o cerchi per costruire un personaggio come creare un'immagine. Quindi, in caso di font bitmap, noi già specifichiamo tutti i pixel mentre in caso di font di schema non specifichiamo tutti i pixel, pochi pixel vengono specificati e utilizzando quelli di forma complessiva viene calcolato o creato seguendo le tecniche di conversione della scansione.
Chiaramente i font bitmap sono semplici da definire e primi a render perché qui non viene coinvolto alcun calcolo. Non è necessario calcolare i pixel che sono già specificati, ma ha qualche problema.
Ovviamente, richiederà memoria aggiuntiva, grande quantità di storage, perché per ogni carattere stiamo memorizzando un'informazione della griglia di pixel e poi se vogliamo ridimensionare o rimodellare per generare diverso effetto sterrato del font allora non è facilmente possibile con definizioni bitmap e il font risultante potrebbe sembrare cattivo.
La terza preoccupazione è la dimensione del carattere dipende dalla risoluzione dello schermo, perché stiamo fissando la griglia di pixel. Quindi, se la risoluzione cambia allora il rendering potrebbe non sembrare buono. Ad esempio, supponi di aver definito un bitmap alto 12 pixel, produrrà un carattere di 12 punti in una risoluzione da 72 pixel per pollice. Ora, se modifichiamo la risoluzione a 96 pixel per pollice allora la stessa bitmap produrrà un carattere di 9 punti che potremmo non volere. Quindi, a seconda della risoluzione il risultato può cambiare.
D'altra parte, gli ingombri font compatte i pixel intermedi, non memorizzano tutto, quindi richiede meno memoria, può eseguire trasformazioni geometriche con effetto soddisfacente per riplasmare e tutte le ridimensioni, quindi la distorsione sarà minore e non è risoluzione dipendente.
Ma d'altra parte il rendering di tali font è lento, il che è abbastanza ovvio perché sono coinvolte elaborazioni, dobbiamo creare la forma, dobbiamo scansare la conversione della forma prima del rendering. Quindi, a causa di tali rendering di calcolo è più lento rispetto ai font bitmap. Quindi, entrambi gli approcci hanno i loro lati positivi e negativi e a seconda delle risorse utilizzate e dell'esito desiderato possiamo scegliere un approccio particolare.
Qualunque cosa abbia discusso oggi si può trovare in questo libro, potrete passare attraverso il capitolo 9 sezione 9,3 e 9,4 per maggiori dettagli sugli argomenti che abbiamo coperto oggi. Nella prossima lezione discuteremo una questione interessante nella conversione della scansione che si chiama effetto aliasing fino ad allora grazie e arrivederci.