Dela via


Bilaga: Matristransformering

Det här avsnittet innehåller en matematisk översikt över matristransformeringar för 2D-grafik. Du behöver dock inte känna till matrismatematik för att kunna använda transformeringar i Direct2D. Läs det här avsnittet om du är intresserad av matematiken; annars kan du hoppa över det här ämnet.

Introduktion till matriser

En matris är en rektangulär matris med verkliga tal. Matrisens ordning är antalet rader och kolumner. Om matrisen till exempel har 3 rader och 2 kolumner är ordningen 3 × 2. Matriser visas vanligtvis med matriselementen omgivna inom hakparenteser:

matris 3 x 2.

Notation: En matris har en versal bokstav. Element är avsedda med gemener. Underskrifter anger rad- och kolumnnumret för ett element. Till exempel är enij elementet i kolumnen i'th row och j'th i matrisen A.

Följande diagram visar en i × j-matris, med de enskilda elementen i varje cell i matrisen.

en matris med i-rader och j-kolumner.

Matrisåtgärder

I det här avsnittet beskrivs de grundläggande åtgärder som definierats för matriser.

Addition. Summan A + B av två matriser erhålls genom att motsvarande element i A och B läggs till:

A + B = \[ a*ij* \] + \[ b*ij* \] = \[ a*ij* + b*ij* \]

Scalar-multiplikation. Den här åtgärden multiplicerar en matris med ett verkligt tal. Med ett reellt tal kerhålls den skalära produkten kA genom att multiplicera varje element i A med k.

kA = k\[ a*ij* \] = \[ k × a*ij* \]

Matris multiplikation. Givet två matriser A och B med ordning (m × n) och (n × p) är produkten C = A × B en matris med ordning (m × p), definierad på följande sätt:

Visar en formel för matris multiplikation.

eller, motsvarande:

c*ij* = a*i*1 x b1*j* + a*i*2 x b2*j* + ... + a*in* + b*nj*

För att beräkna varje element cijgör du följande:

  1. Ta raden i'th i A och kolumnen j'th i B.
  2. Multiplicera varje elementpar i raden och kolumnen: den första radposten med den första kolumnposten, den andra radposten med den andra kolumnposten och så vidare.
  3. Summera resultatet.

Här är ett exempel på att multiplicera en matris (2 × 2) med en matris (2 × 3).

matris multiplikation.

Matris multiplikation är inte kommutativ. Det vill: A × B ≠ B × A. Av definitionen följer också att inte varje par matriser kan multipliceras. Antalet kolumner i den vänstra matrisen måste vara lika med antalet rader i den högra matrisen. Annars definieras inte ×-operatorn.

Identifiera matris. En identitetsmatris, angiven I, är en kvadratmatris som definieras på följande sätt:

I*ij* = 1 om *i* = *j*, eller 0 annars.

Med andra ord innehåller en identitetsmatris 1 för varje element där radnumret är lika med kolumnnumret och noll för alla andra element. Här är till exempel identitetsmatrisen 3 × 3.

identitetsmatris.

Följande likhetsfunktioner gäller för valfri matris M.

M x I = M I x M = M

Affine-transformeringar

En affinformning är en matematisk åtgärd som mappar ett koordinatutrymme till ett annat. Med andra ord mappas en uppsättning punkter till en annan uppsättning punkter. Affine-transformeringar har vissa funktioner som gör dem användbara i datorgrafik.

  • Affine-transformeringar bevarar kollinearitet. Om tre eller flera punkter hamnar på en linje bildar de fortfarande en rad efter omvandlingen. Räta linjer förblir raka.
  • Sammansättningen av två affintransformeringar är en affinformning.

Affine-transformeringar för 2D-blanksteg har följande formulär.

Visar en affintransformering för 2D-blanksteg.

Om du använder definitionen av matris multiplikation som angavs tidigare kan du visa att produkten av två affintransformeringar är en annan affintransformation. Om du vill transformera en 2D-punkt med en affintransformering representeras punkten som en matris med 1 × 3.

P = \| x y 1 \|

De två första elementen innehåller x- och y-koordinaterna för punkten. 1 placeras i det tredje elementet för att få matematiken att fungera korrekt. Om du vill tillämpa transformen multiplicerar du de två matriserna enligt följande.

P' = P × M

Detta expanderar till följande.

affintransformering.

var

x' = ax + cy + e y' = bx + dy + f

Ta de två första elementen i matrisen P för att hämta transformeringspunkten.

p = (x', y') = (ax + cy + e, bx + dy + f)

Not

En 1 × n-matris kallas för en radvektor. Både Direct2D och Direct3D använder radvektorer för att representera punkter i 2D- eller 3D-blanksteg. Du kan få ett motsvarande resultat med hjälp av en kolumnvektor (n × 1) och transponera transformeringsmatrisen. De flesta grafiktexter använder kolumnvektorformen. Det här avsnittet visar radvektorformuläret för konsekvens med Direct2D och Direct3D.

 

I nästa avsnitt härleds de grundläggande transformerna.

Översättningstransformering

Översättningstransformeringsmatrisen har följande formulär.

översättningstransformering.

När du ansluter en punkt P- till den här ekvationen ger det:

P' = (*x* + *dx*, *y* + *dy*)

som motsvarar punkten (x, y) översatt av dx i X-axeln och dy i Y-axeln.

ett diagram som visar översättning av två punkter.

Skalningstransformering

Matrisen för skalningstransformering har följande formulär.

skalningstransformering.

När du ansluter en punkt P- till den här ekvationen ger det:

P' = (*x* ∙ *dx*, *y* ∙ *dy*)

som motsvarar den punkt (x,y) som skalas av dx och dy.

ett diagram som visar skalning av två punkter.

Rotation runt ursprunget

Matrisen för att rotera en punkt runt ursprunget har följande formulär.

Visar en formel för en rotationstransformering.

Den transformerade punkten är:

P' = (*x*cosΘ – ysinΘ, *x*sinΘ + *y*cosΘ)

Bevis. Tänk på följande diagram för att visa att P representerar en rotation.

ett diagram som visar rotation runt ursprunget.

Given:

P = (x,y)

Den ursprungliga punkten att transformera.

Φ

Vinkeln som bildas av linjen (0,0) till P.

Θ

Vinkeln som ska roteras (x,y) om ursprunget.

P' = (x',y')

Den transformerade punkten.

R

Längden på linjen (0,0) till P. Också radien av cirkla av rotation.

Not

Det här diagrammet använder standardkoordinatsystemet som används i geometri, där den positiva y-axeln pekar uppåt. Direct2D använder Windows-koordinatsystemet, där den positiva y-axeln pekar nedåt.

 

Vinkeln mellan x-axeln och linjen (0,0) till P' är Φ + Θ. Följande identiteter gäller:

x = R cosΦ y = R sinΦ x' = R cos(Φ + Θ) y' = R sin(Φ+ Θ)

Lös nu för x' och y' när det gäller Θ. Med trigonometriska tilläggsformler:

x' = R(cosΦcosΘ – sinΦsinΘ) = RcosΦcosΘ – RsinΦsinΘ y' = R(sinΦcosΘ + cosΦsinΘ) = RsinΦcosΘ + RcosΦsinΘ

När vi ersätter får vi:

x' = xcosΘ – ysinΘ y' = xsinΘ + ycosΘ

motsvarar den transformerade punkt P som visades tidigare.

Rotation runt en godtycklig punkt

Om du vill rotera runt en annan punkt (x,y) än ursprunget används följande matris.

rotationstransformering.

Du kan härleda den här matrisen genom att ta punkten (x,y) som ursprung.

ett diagram som visar rotation runt en punkt.

Låt (x1, y1) vara den punkt som är resultatet av att rotera punkten (x0, y0) runt punkten (x,y). Vi kan härleda x1 på följande sätt.

x1 = (x0 – x)cosΘ– (y0 – y)sinΘ + x x1 = x0cosΘ – y0sinΘ + \[ (1 – cosΘ) + ysinΘ \]

Anslut nu den här ekvationen till transformeringsmatrisen med formeln x1 = ax0 + cy0 + e från tidigare. Använd samma procedur för att härleda y1.

Skev transformering

Skev transformering definieras av fyra parametrar:

  • Θ: Mängden som ska skeva längs x-axeln, mätt som en vinkel från y-axeln.
  • Φ: Mängden som ska skeva längs y-axeln, mätt som en vinkel från x-axeln.
  • (px, py): X- och y-koordinaterna för den punkt där skevheten utförs.

Skev transformering använder följande matris.

skev transformering.

Den transformerade punkten är:

P' = (*x* + *y*tanΘ – *py*tanΘ, *y* + *x*tanΦ) – *py*tanΦ

eller motsvarande:

P' = (*x* + (*y* – *py*)tanΘ, *y* + (*x* – *px*)tanΦ)

Om du vill se hur den här transformen fungerar bör du överväga varje komponent individuellt. Parametern Θ flyttar varje punkt i x-riktningen med en mängd som är lika med tanΘ. Följande diagram visar relationen mellan Θ och x-axelns skevhet.

diagram som visar skevhet längs x-axeln.

Här är samma skevhet som tillämpas på en rektangel:

diagram som visar skevhet längs x-axeln när det tillämpas på en rektangel.

Parametern Φ har samma effekt, men längs y-axeln:

diagram som visar skevhet längs y-axeln.

Nästa diagram visar y-axelns skevhet som tillämpas på en rektangel.

diagram som visar skevhet längs y-axeln när det tillämpas på en rektangel.

Slutligen parametrarna px och py flytta mittpunkten för snedställningen längs x- och y-axlarna.

Representerar transformeringar i Direct2D

Alla Direct2D-transformeringar är affintransformeringar. Direct2D stöder inte icke-affintransformeringar. Transformeringar representeras av den D2D1_MATRIX_3X2_F strukturen. Den här strukturen definierar en matris med 3 × 2. Eftersom den tredje kolumnen i en affintransformering alltid är densamma ([0, 0, 1]), och eftersom Direct2D inte stöder icke-affintransformeringar, behöver du inte ange hela matrisen 3 × 3. Internt använder Direct2D 3 × 3 matriser för att beräkna transformeringarna.

Medlemmarna i D2D1_MATRIX_3X2_F namnges enligt indexpositionen: _11 medlem är element (1,1), _12 medlem är element (1,2) och så vidare. Även om du kan initiera strukturmedlemmarna direkt rekommenderar vi att du använder klassen D2D1::Matrix3x2F. Den här klassen ärver D2D1_MATRIX_3X2_F och tillhandahåller hjälpmetoder för att skapa någon av de grundläggande affintransformeringarna. Klassen definierar även operator*() för att skapa två eller flera transformeringar, enligt beskrivningen i Tillämpa transformeringar i Direct2D.

Nästa

Modul 4. Användarindata