Transformace
Přednáška 7
Transformace je proces, při kterém dochází ke změně polohy, orientace nebo velikosti jednotlivých zobrazovaných objektů (geometrie objektů).
Transformace 2D
1
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Vektorová a rastrová grafika
Transformace souřadnicového systému Projekce (v 3D) Lineární transformace: Lineární transformace: T(v+w) = T(v) + T(w)
posunutí T( λv) = λT(v)
otočení
změna měřítka ! Pro některé lineární transformace
zrcadlení NEEXISTUJE opačná (inverzní transformace)
zkosení
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
2
Přednáška 7
4
Souřadnicové systémy
Vektorová grafika – transformace se aplikuje na všechny (řídící) body (vrcholy) daného objektu. Rastrová grafika – transformace se aplikuje na všechny pixely rastru (více viz 10. přednáška).
Nejpoužívanější SS jsou karteziánský a polární SS.
r
xB = r. cos(α ) yB = r. sin(α ) Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
3
Počítačová grafika, PV, UPCE-KID, [2010/2011]
r = xB 2 + yB 2 ⎛ yB ⎞ ⎟ ⎝ xB ⎠
α = arctg ⎜
SSZ a USS
Transformační matice
USS – Univerzální (Uživatelský) souřadnicový systém, světové souřadnice SSZ – Souřadnicový systém zařízení
dX = (pixMaxX – pixMinX) / (realMaxX – realMinX) [pixMinX, pixMinY] [0, 0]
pixX
dY = (pixMaxY – pixMinY) / (realMaxY – realMinY)
Souřadnice bodu P = [x, y] se vlivem transformace upraví na P´= [x´, y´] A – transformační matice Způsoby zápisu transformace (explicitní a maticové)
Explicitní vyjádření
⎧ x' = 3x ⎨ ⎩ y' = x + 2 y
Vztahy přepočítávající reálné souřadnice na obrazovkové
pixX = pixMinX + (realX – realMinX)*dX pixY= pixMinY + (realMaxY – realY)*dY [1023,767] [pixMaxX, pixMaxY]
realY
pixY
P' realX
Vztahy přepočítávající obrazovkové souřadnice na reálné
[500,-200] [realMaxX, realMinY] Přednáška 7
Počítačová grafika, PV, UPCE-KID, [2010/2011]
5
Homogenní souřadnice
Některé transformace nelze vyjádřit pomocí matice 2x2, např.:
⎧ x' = x + 3 ⎨ ⎩ y' = y + 2
[x'
y '] = [x
což vede na nekorektní maticový zápis:
Pro jednotný maticový výpočet budeme používat čtvercovou matici o rozměru (n+1) x (n+1).
[x'
y '] = [x
⎡3 1 ⎤ y ]* ⎢ ⎥ ⎣0 2 ⎦
Sloupcový vektor (standardní matematický zápis)
⎡ x' ⎤ ⎡3 0⎤ ⎡ x ⎤ ⎢ y '⎥ = ⎢1 2⎥ * ⎢ y ⎥ ⎣ ⎦ ⎣ ⎦ ⎣ ⎦
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
6
Transformační matice má pro 2D prostor rozměr 3x3.
Přednáška 7
8
Inverzní transformační matice A-1
[x'
⎡1 0 ⎤ y ]* ⎢⎢0 1 ⎥⎥ ⎢⎣3 2⎥⎦
Vektor rozšíříme o souřadnici w (homogenizační faktor, w<>0, nejčastěji w=1), původní souřadnice upravíme vynásobením nebo vydělením [x' y' w'] = [x hodnotou w.
Počítačová grafika, PV, UPCE-KID, [2010/2011]
y ]* A *A
Inverzní transformace
y '] = [x =P
⎡x ⎤ ⎡ x' ⎤ ⎢ y '⎥ = A * ⎢ y ⎥ ⎣ ⎦ ⎣ ⎦ P' = A * P
realX = realMinX + (pixX – pixMinX) / dX realY = realMaxY – (pixY – pixMinY) / dY
Řádkový vektor (preferováno v literatuře o PG)
[x'
[realMinX, realMaxY] [-100,200]
Tento způsob bude používán při výkladu
y '] = [x
y ]* A −1
A * A −1 = A −1 * A = I
Příklad (otočení) ⎡ cos(α ) sin(α ) ⎤ ⎡ cos(−α ) sin(−α ) ⎤ ⎡cos(α ) − sin(α )⎤ ; A −1 = ⎢ A=⎢ ⎥ ⎥=⎢ ⎥ ⎣− sin(α ) cos(α )⎦ ⎣− sin(−α ) cos(−α )⎦ ⎣ sin(α ) cos(α ) ⎦
⎡1 0 0 ⎤ y w]* ⎢⎢0 1 0⎥⎥ ⎢⎣3 2 1⎥⎦
cos(−α ) = cos(α ) sin(−α ) = − sin(α ) cos 2 (α ) + sin 2 (α ) = 1 ⎡ cos(α ) sin(α ) ⎤ ⎡cos(α ) − sin(α )⎤ ⎡1 0⎤ A * A −1 = ⎢ ⎥=I ⎥*⎢ ⎥=⎢ ⎣− sin(α ) cos(α )⎦ ⎣ sin(α ) cos(α ) ⎦ ⎣0 1⎦
Přednáška 7
7
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Neexistující inverzní transformace
Posunutí
Inverzní transformace neexistuje, pokud |A|=0
Příklad:
Transformace: projekce bodu na osu x ⎧ x' = x ⎨ ⎩ y' = 0
X ´= X + XM
Y ´= Y + Y M Neexistuje inverzní transformace.
1 0 [x' y'] = [x y ]* ⎡⎢ ⎤⎥ ⎣0 0 ⎦ 1 0 det A = A = =0 0 0
9
Přednáška 7
Otočení
β
[0,0]
x
X ´= X cos β − Y sin β
Maticové vyjádření otočení ⎡ cos β AR = ⎢⎢− sin β ⎣⎢ 0
sin β cos β 0
0⎤ 0⎥⎥ 1 ⎦⎥
⎡cos β −1 A R = ⎢⎢ sin β ⎢⎣ 0
β
− sin β
cos β 0
0⎤ 0⎥⎥ 1⎥⎦
[0,0]
x
Otočení okolo obecného bodu R[XR, YR] lze řešit složenou transformací: posunutí → otočení → zpětné posunutí.
Počítačová grafika, PV, UPCE-KID, [2010/2011]
⎡ 1 −1 A M = ⎢⎢ 0 ⎢⎣− XM
0 1 − YM
0⎤ 0⎥⎥ 1 ⎥⎦
p y
[0,0]
x
Přednáška 7
x'
10
x = r cos α y = r sin α x´= r cos (α + β) y´= r sin (α + β) sin(α + β) = sin α cos β + cos α sin β cos(α + β) = cos α cos β - sin α sin β
y
Y ´= X sin β + Y cos β
0⎤ 0⎥⎥ 1⎦⎥
y'
Počítačová grafika, PV, UPCE-KID, [2010/2011]
y
Otočení (rotation) bodu P kolem počátku O=[0,0] o orientovaný úhel β do bodu P´ Explicitní výpočet souřadnic P´
Maticové vyjádření posunutí
⎡1 0 AM = ⎢⎢ 0 1 ⎣⎢ XM YM
Logické vysvětlení: ???
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Posunutí (move) bodu P do bodu P´ o vektor p Vektor posunutí p = ( XM , YM ) = ( X ´− X , Y ´−Y ) Explicitní výpočet souřadnic P´
Přednáška 7
11
Pomocí vzorců pro cos a sin součtu úhlů rovnice upravíme: x´= r cos (α + β) = r cos α cos β - r sin α sin β y´= r sin (α + β) = r sin α cos β + r cos α sin β x´= x cos β - y sin β y´ = x sin β + y cos β Kladné hodnoty β určují otočení proti směru hodinových ručiček, záporné hodnoty β určují otočení ve směre hodinových ručiček.
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
12
Otočení rastrového obrázku
Zkosení
Dopředné a zpětné mapování Algoritmy zlepšující kvalitu transformace → viz přednáška: Rastrová grafika
Zkosení (shear) je transformace udávaná koeficientem míry zkosení SHx ve směru osy x, respektive SHy ve směru osy y. Explicitní výpočet souřadnic P´
X ´= X + SHX Y Y ´= SHY X + Y
Maticové vyjádření zkosení ⎡ 1 ASh = ⎢⎢ SHX ⎣⎢ 0
SHY 1 0
0⎤ 0⎥⎥ 1 ⎦⎥
SHx=0.5 y 2
[0,0]
Přednáška 7
Počítačová grafika, PV, UPCE-KID, [2010/2011]
x
13
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
14
15
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
16
Změna měřítka
Změna velikosti objektu (scale) ve směru souřadnicových os o koeficient Sx, Sy |S|∈(0,1) ----> zmenšení objektu |S|>1 ----> zvětšení objektu Pro S<0 dochází ke změně měřítka v opačném směru. Explicitní výpočet souřadnic P´
X ´= Sx X Y ´= Sy Y
Maticové vyjádření ⎡ SX AS = ⎢⎢ 0 ⎢⎣ 0
0
SY 0
0⎤ 0⎥⎥ 1⎥⎦
Počítačová grafika, PV, UPCE-KID, [2010/2011]
y y'
[0,0]
x
x'
Přednáška 7
Souměrnost
Jednotlivé případy souměrnosti
Zvláštní případ změny měřítka (symetry) Absolutní hodnota koeficientů je rovna jedné Souměrnost osová a středová Používají se výrazy „překlopení, zrcadlení“ (reflection, flip, mirror) y
Sx Sy souměrnost podle osy x
y
[0,0]
x
Počítačová grafika, PV, UPCE-KID, [2010/2011]
[0,0]
Přednáška 7
17
-1
středová souměrnost
-1 -1
1
Středová souměrnost je ekvivalentní otočení o 180°
Přednáška 7
Počítačová grafika, PV, UPCE-KID, [2010/2011]
18
Příklad skládání transformací
Postupné aplikování jednotlivých transformací na bod P Záleží na pořadí, pro skládání transformací NEPLATÍ komutativní zákon. Vyjádření jedinou maticí, kterou dostaneme postupným násobením matic, představujících jednotlivé částečné transformace Násobení zprava P ' = P * A
y α
yr p (-xr, -yr) [0,0]
R p (-xr, -yr) xr
x
0 0⎤ ⎡ cos α sin α 0⎤ ⎡ 1 0 ⎡ 1 ⎢ 1 0⎥⎥ * ⎢⎢− sin α cos α 0⎥⎥ * ⎢⎢ 0 1 AM = ⎢ 0 ⎢⎣− xR − yR 1⎥⎦ ⎢⎣ 0 0 1⎥⎦ ⎢⎣ xR yR cos α sin α ⎡ ⎢ cos α − sin α AM = ⎢ ⎢⎣ xR − xR cos α + yR sin α yR − xR sin α − yR cos α
Příklad: Otočení o úhel α okolo bodu R=[xR,yR]
A = AM * AR * A −M1
Počítačová grafika, PV, UPCE-KID, [2010/2011]
souměrnost podle osy y
x
Skládání transformací
1 -1
Přednáška 7
19
Počítačová grafika, PV, UPCE-KID, [2010/2011]
0⎤ 0⎥⎥ 1⎥⎦ 0⎤ 0⎥⎥ 1⎥⎦ Přednáška 7
20
Přesnost a kumulace chyb
Podpora v Javě
Zásady:
Výpočty provádět s reálnými proměnnými
Zaokrouhlení provádět pouze pro účel vykreslení Při vícenásobných transformacích dochází ke kumulování chyb Doporučení: využívat typ double místo typu float Příklad: Opakované otáčení úsečky (např. sekundová ručička)
krok 6° (-6°)
počáteční stav A:[0.0, 0.0], B[100.0, 0.0]
koncový stav B při použití souřadnic typu float
translate (int x, int y) – posunutí počátku souřadnicového x Text
Text y
1 min. (60 x otočení): B[99.99999999999973, -4.857222573273E-14] 8 hod. (28800 x otočení): B[99.99999999986587, -2.952499356112E-11] Přednáška 7
21
Podpora v Javě
! Pouze transformace zobrazovacího režimu, neřeší samotnou transformaci (změnu) vykreslovaných dat
void translate(double tx, double ty) void translate(int x, int y)
void rotate(double theta)
void rotate(double theta, double x, double y)
shear(double shx, double shy)
scale(double sx, double sy)
AffineTransform getTransform() void transform(AffineTransform Tx)
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
22
Přednáška 7
24
Podpora v Javě
Graphics2D
! Pouze transformace zobrazovacího režimu, neřeší samotnou transformaci (změnu) vykreslovaných dat
1 min. (60 x otočení): B[100.00008, -1.1175871E-5] 8 hod. (28800 x otočení): B[100.00328, -1.9669533E-4]
Počítačová grafika, PV, UPCE-KID, [2010/2011]
koncový stav B při použití souřadnic typu double
Graphics
AffineTransform
AffineTransform() - jednotková matice transformace
AffineTransform(AffineTransform Tx)
AffineTransform(double[] flatmatrix) – 4 nebo 6 prvků
AffineTransform(float[] flatmatrix) – 4 nebo 6 prvků
AffineTransform(double m00, double m10, double m01, double m11, double m02, double m12)
AffineTransform(float m00, float m10, float m01, float m11, float m02, float m12)
Přednáška 7
23
m00 - the X coordinate scaling element of the 3x3 matrix m10 - the Y coordinate shearing element of the 3x3 matrix m01 - the X coordinate shearing element of the 3x3 matrix m11 - the Y coordinate scaling element of the 3x3 matrix m02 - the X coordinate translation element of the 3x3 matrix m12 - the Y coordinate translation element of the 3x3 matrix
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Podpora v Javě
⎡ sx shx tx ⎤ AT = ⎢⎢ shy sy ty ⎥⎥ ⎢⎣ 0 0 1 ⎥⎦
AffineTransform
concatenate(AffineTransform Tx)
AffineTransform createInverse()
invert()
getMatrix(double[] flatmatrix)
rotate(double theta)
rotate(double theta, double anchorx, double anchory)
scale(double sx, double sy) ⎡m00
shear(double shx, double shy) AT = ⎢ m10
translate(double tx, double ty) Skutečná transformace (změna) vykreslovaných dat
⎢ ⎢⎣ 0
m01 m02⎤ m11 m12 ⎥⎥ 0 1 ⎥⎦
transform(Point2D ptSrc, Point2D ptDst)
transform(Point2D[] ptSrc, int srcOff, Point2D[] ptDst, int dstOff, int numPts)
…
Počítačová grafika, PV, UPCE-KID, [2010/2011]
Přednáška 7
25