Condividi tramite


Cenni preliminari sulle trasformazioni

Questo argomento illustra le nozioni di base delle trasformazioni Direct2D e include esempi di varie trasformazioni. Contiene le parti seguenti:

Che cos'è una trasformazione Direct2D?

Una trasformazione specifica come eseguire il mapping dei punti di un oggetto da uno spazio di coordinate a un'altra o da una posizione a un'altra all'interno dello stesso spazio di coordinate. Questo mapping è descritto da una matrice di trasformazione, definita come una raccolta di tre righe con tre colonne di valori FLOAT, come illustrato nella tabella seguente.

     
M11Default: 1.0 M12Default: 0.0 0.0
M21Default: 0.0 M22Default: 1.0 0.0
M31OffsetX: 0.0 M32OffsetY: 0.0 1.0

 

In questa matrice, i membri M11, M12, M21 e M22 definiscono una trasformazione lineare in grado di ridimensionare, ruotare o asimmetrie un oggetto; I membri OffsetX e OffsetY definiscono la traduzione da applicare dopo che è stata effettuata la trasformazione lineare. Per le trasformazioni affine, i valori nella terza colonna sono sempre 0.0, 0.0 e 1.0.

Poiché Direct2D supporta solo trasformazioni affine (lineari), la relativa matrice di trasformazione viene definita come matrice 3-by-2, omettendo la terza colonna dalla matrice di trasformazione precedente. La tabella seguente illustra il layout della matrice di trasformazione Direct2D.

   
M11Default: 1.0 M12Default: 0.0
M21Default: 0.0 M22Default: 1.0
M31OffsetX: 0.0 M32OffsetY: 0.0

 

In Direct2D questa matrice 3 per 2 è rappresentata dalla struttura D2D1_MATRIX_3X2. Per semplificare le operazioni di matrice comuni, Direct2D fornisce anche una classe denominata Matrix3x2F, derivata dalla struttura D2D1_MATRIX_3X2.

Il costruttore predefinito per Matrix3x2F lascia l'oggetto non inizializzato. Per recuperare una matrice di identità, usare Matrix3x2F::Identity.

Quando viene applicata una trasformazione di identità a un oggetto, non modifica la posizione, la forma o le dimensioni dell'oggetto. È simile al modo in cui la moltiplicazione di un numero per 1 non modifica il numero. In altre parole, la trasformazione di identità lascia le coordinate dei punti da sola e non sposta i punti in una nuova posizione. Qualsiasi trasformazione diversa dalla trasformazione identity modificherà la posizione, la forma e/o le dimensioni degli oggetti.

Le trasformazioni riguardano tutte le coordinate e la comprensione dello spazio delle coordinate Direct2D è importante per comprendere l'uso delle trasformazioni.

Lo spazio delle coordinate Direct2D

Direct2D usa uno spazio di coordinate sinistrorso; ovvero, i valori positivi dell'asse x aumentano verso destra e i valori positivi dell'asse y aumentano verso il basso. Tutti gli elementi sullo schermo sono posizionati rispetto all'origine, ovvero il punto in cui l'asse x e l'asse y si intersecano (0, 0), come illustrato nella figura seguente. Le destinazioni di rendering Direct2D usano questo spazio di coordinate.

illustrazione dell'asse x e dell'asse y di uno spazio di coordinate sinistrorso

Modificando i valori in una matrice di trasformazione, è possibile ruotare, ridimensionare, inclinare e spostare (traslare) un oggetto. Ad esempio, se si imposta OffsetX su 100 e OffsetY su 200, spostare l'oggetto a destra di 100 pixel e giù di 200 pixel.

Per visualizzare l'effetto dello spostamento dell'oggetto, è necessario applicare la trasformazione traslazione per eseguire il rendering di destinazioni, pennelli o geometrie. L'applicazione di una trasformazione alle destinazioni di rendering influisce sull'intero schermo, mentre l'applicazione di una trasformazione a un pennello o una geometria influisce solo su quel pennello o geometria specifico. Per creare una matrice di trasformazione, usare la classeMatrix3x2F.

Creazione di matrici di trasformazione

Per creare trasformazioni di rotazione, scala, asimmetria e traslazione, la classe Matrix3x2F fornisce i metodi statici illustrati nella tabella seguente. La colonna Esempio della tabella contiene collegamenti agli argomenti relativi alle procedure che illustrano come usare ogni metodo di trasformazione.

Metodo Descrizione Esempio Illustrazione
matrix3x2f::rotate crea una trasformazione di rotazione con l'angolo e il punto centrale specificati. come ruotare un oggetto illustrazione di un quadrato ruotato a 45 gradi in senso orario circa il centro del quadrato originale
matrix3x2f::scale crea una trasformazione della scala con i fattori di scala e il punto centrale specificati. come ridimensionare un oggetto illustrazione di un quadrato ridimensionato al 130%
matrix3x2f::skew crea una trasformazione asimmetria con i valori dell'asse x e dell'asse y specificati e il punto centrale specificati. come asimmetriare un oggetto illustrazione di un quadrato inclinato di 30 gradi in senso antiorario rispetto all'asse y
matrix3x2f::translation crea una trasformazione di traslazione e specifica gli spostamenti nella direzione dell'asse x e dell'asse y. come tradurre un oggetto illustrazione di un quadrato spostato 20 unità lungo l'asse x positivo e 10 unità lungo l'asse y positivo

 

Trasformazioni di destinazione per il rendering

Una destinazione di rendering è una risorsa che eredita dall'interfaccia ID2D1RenderTarget. Crea risorse per il disegno ed esegue operazioni di disegno effettive. Fornisce anche metodi per trasformare lo spazio delle coordinate. È possibile chiamare il metodo ID2D1RenderTarget::SetTransform per applicare la trasformazione specificata alla destinazione di rendering. Tutte le operazioni di disegno successive si verificano nello spazio trasformato.

Per eseguire il rendering del contenuto, utilizzare i metodi di disegno del target di rendering. Prima di iniziare a disegnare, chiamare il metodo BeginDraw. Per completare il rendering del contenuto, chiamare il metodo EndDraw. Per un esempio, vedere Come applicare più trasformazioni a un oggetto.

Trasformazioni del pennello

È possibile modificare la trasformazione nel pennello chiamando SetTransform. Per questa trasformazione, è possibile considerare il pennello come un grande pezzo di carta e delle diverse primitive di rendering (testo, geometria, rettangolo e così via) come stencil. Quando si regola la trasformazione del pennello, è come se stessi facendo scivolare il grande foglio di carta sotto lo stencil, senza cambiare la posizione dello stencil. È possibile usare questa tecnica per rendere il testo sfumato dal giallo al nero fino a scomparire nello spazio 3D.

Quando la trasformazione del pennello è la trasformazione identità, i pennelli vengono visualizzati nello stesso spazio di coordinate della destinazione di rendering in cui vengono disegnati. La trasformazione del pennello consente a un chiamante di modificare il mapping delle coordinate del pennello in questo spazio.

Lo spazio del pennello viene specificato in modo diverso in Direct2D rispetto a Windows Presentation Foundation (WPF). In Direct2D, lo spazio del pennello non è relativo all'oggetto da disegnare, bensì è il sistema di coordinate corrente del render target, trasformato dalla trasformazione del pennello, se presente. Per fare in modo che il pennello riempia un oggetto come è stato fatto in WPF, è necessario traslare l'origine dello spazio pennello nell'angolo superiore sinistro del rettangolo di delimitazione dell'oggetto e quindi ridimensionare lo spazio pennello in modo che il riquadro di base riempia il rettangolo di delimitazione dell'oggetto.

Per ulteriori informazioni sulle trasformazioni dei pennelli, consultare Panoramica dei pennelli Direct2D.

Trasformazioni geometriche

Quando si ridimensionano, spostano, traslano o deformano le geometrie, è possibile applicare direttamente una trasformazione a una geometria specifica, non a una trasformazione del target di rendering che influirebbe sull'intero schermo. Una trasformazione del target di rendering generalmente influisce sul tratto e sul riempimento di una geometria. Al contrario, una trasformazione geometrica influisce solo sul riempimento di una geometria, perché la trasformazione viene applicata a una geometria prima che venga tracciata.

Nota

A partire da Windows 8, la trasformazione globale non influisce sul tratto se si imposta il tipo di tratto su D2D1_STROKE_TRANSFORM_TYPE_FIXED o D2D1_STROKE_TRANSFORM_TYPE_HAIRLINE.

 

È possibile modificare la trasformazione in una geometria chiamando ID2D1Factory::CreateTransformedGeometry per creare un oggetto ID2D1TransformedGeometry. Per altre informazioni sulle trasformazioni geometriche, vedere Panoramica delle geometrie Direct2D.

Come una trasformazione del target di rendering influisce sulle clip

La trasformazione in una destinazione di rendering influisce sul modo in cui viene calcolata la scatola di delimitazione di una clip allineata all'asse. Quando viene chiamato il PushAxisAlignedClip, il parametro clipRect viene trasformato dalla trasformazione del mondo corrente impostata sulla destinazione di rendering. Dopo l'applicazione della trasformazione al clipRect, viene calcolato il rettangolo delimitante allineato all'asse per il clipRect. Per efficienza, i contenuti vengono ritagliati su questo rettangolo di delimitazione allineato all'asse e non al clipRect originale passato. I diagrammi seguenti illustrano come viene applicata una trasformazione di rotazione alla destinazione di rendering, il clipRecte un rettangolo di delimitazione calcolato allineato all'asse.

  1. Si supponga che il rettangolo nella figura seguente sia una destinazione di rendering allineata ai pixel dello schermo.

    illustrazione di un rettangolo (destinazione di rendering)

  2. Applicare una trasformazione di rotazione alla destinazione di rendering. Nella figura seguente il rettangolo nero rappresenta la destinazione di rendering originale e il rettangolo tratteggiato rosso rappresenta la destinazione di rendering trasformata.

    illustrazione del rettangolo originale e di un rettangolo ruotato (destinazione di rendering trasformata)

  3. Dopo aver chiamato PushAxisAlignedClip, la trasformazione di rotazione viene applicata al clipRect. Nella figura seguente il rettangolo blu rappresenta il clipRect trasformato.

    illustrazione di un rettangolo blu più piccolo (cliprect) all'interno del rettangolo ruotato (destinazione di rendering trasformata)

  4. Viene calcolato il riquadro di delimitazione allineato all'asse. Nella figura seguente, il rettangolo tratteggiato verde rappresenta il bounding box. Tutti i contenuti vengono ritagliati in questa scatola di delimitazione allineata agli assi.

    illustrazione di un contorno verde sul piccolo rettangolo blu (cliprect)

Sommario

Direct2D semplifica la trasformazione di oggetti bidimensionali con spazi di coordinate semplificati e classi correlate. Usando vari tipi di trasformazioni, è possibile traslare, ruotare, inclinare e ridimensionare gli oggetti per ottenere molti effetti visivi impressionanti.

Riferimento Direct2D