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 altro o da una posizione a un'altra all'interno dello stesso spazio di coordinate. Questo mapping è descritto da una matrice di trasformazione, definita come 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 asimmetriare un oggetto; I membri OffsetX e OffsetY definiscono la conversione da applicare dopo aver eseguito 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 per 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 una trasformazione di identità viene applicata 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 dell'identità lascia solo le coordinate dei punti 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.

Spazio delle coordinate Direct2D

Direct2D usa uno spazio di coordinate sinistrorso; vale a dire, i valori positivi dell'asse x aumentano verso destra e i valori positivi dell'asse y aumentano verso il basso. Tutto lo schermo è posizionato 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, asimmetrie e spostare (tradurre) 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 a una geometria influisce solo sul pennello o sulla geometria specifica. Per creare una matrice di trasformazione, usare la classe Matrix3x2F .

Creazione di matrici di trasformazione

Per la creazione di 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 sulle 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 in scala 130%
matrix3x2f::asimmetria 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 asimmetrico di 30 gradi in senso antiorario dall'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 inoltre 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 della destinazione 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 pennello

È possibile modificare la trasformazione nel pennello chiamando SetTransform. Per questa trasformazione, è possibile pensare al 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 si fosse scorrevole il grande pezzo di carta sotto lo stencil, senza modificare la posizione dello stencil stesso. È possibile usare questa tecnica per rendere il testo sade da giallo a nero lontano nello spazio 3D.

Quando la trasformazione del pennello è la trasformazione identity, i pennelli vengono visualizzati nello stesso spazio di coordinate della destinazione di rendering in cui vengono disegnati. La trasformazione pennello consente a un chiamante di modificare il modo in cui le coordinate del pennello vengono mappate a questo spazio.

Lo spazio del pennello viene specificato in modo diverso in Direct2D rispetto a in Windows Presentation Foundation (WPF). In Direct2D lo spazio del pennello non è relativo all'oggetto disegnato, ma è invece il sistema di coordinate corrente della destinazione di rendering, trasformato dalla trasformazione pennello, se presente. Per avere il riempimento del pennello come è stato fatto in WPF, è necessario tradurre l'origine dello spazio del pennello nell'angolo superiore sinistro del rettangolo di selezione dell'oggetto e quindi ridimensionare lo spazio del pennello in modo che il riquadro di base riempia la casella di selezione dell'oggetto.

Per altre informazioni sulle trasformazioni del pennello, vedere Panoramica dei pennelli Direct2D.

Trasformazioni geometry

Quando si ridimensionano, si spostano, trasducono o si inclinano geometrie, è possibile applicare direttamente una trasformazione a una geometria specifica, non a una trasformazione di destinazione di rendering che influisce sull'intera schermata. Una trasformazione di destinazione di rendering influisce in genere sul tratto e sul riempimento di una geometria. Al contrario, una trasformazione geometry influisce solo sul riempimento di una geometria, perché la trasformazione viene applicata a una geometria prima che venga eseguito il tratto.

Nota

A partire da Windows 8, la trasformazione mondiale 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 geometry, vedere Panoramica delle geometrie Direct2D.

Modalità di modifica della destinazione di rendering influisce sulle clip

La trasformazione in una destinazione di rendering influisce sul modo in cui viene calcolata la casella di selezione di una clip allineata all'asse. Quando viene chiamato PushAxisAlignedClip , il parametro ClipRect viene trasformato dalla trasformazione del mondo corrente impostata sulla destinazione di rendering. Dopo aver applicato la trasformazione alla clipRect, viene calcolata la casella di selezione allineata all'asse per la clipRect . Per l'efficienza, il contenuto viene ritagliato in questa casella di selezione allineata all'asse e non alla clipRect originale passata. I diagrammi seguenti illustrano come viene applicata una trasformazione di rotazione alla destinazione di rendering, alla clipRect risultante e a una casella di selezione allineata all'asse calcolata.

  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 trasformato)

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

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

  4. Viene calcolata la casella di selezione allineata all'asse. Nella figura seguente il rettangolo tratteggiato verde rappresenta il rettangolo di selezione. Tutti i contenuti vengono ritagliati in questa casella di selezione allineata all'asse.

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

Riepilogo

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

Riferimento a Direct2D