.NET Tip #20: Kreslení s transformacemi

Tomáš Herceg       19.10.2008       .NET Tips       12070 zobrazení

Při vykreslování pomocí System.Drawing často potřebujeme pokročilejší funkce. Občas by se nám hodilo například umět to, co nakreslíme, otáčet, zvětšovat, či posouvat. System.Drawing.Graphics toto samozřejmě podporuje pomocí tzv. transformací.

Nikoho asi nepřekvapí, že tímto řádkem nakreslíme čtverec:

e.Graphics.DrawRectangle(Pens.Black, 100, 100, 100, 100)

Obyčejný čtverec

Pokud před vykreslením objektu zavoláme RotateTransform a předáme jí počet stupňů, ve, co potom vykreslíme, bude otočené o daný počet stupňů:

        e.Graphics.RotateTransform(15)
        e.Graphics.DrawRectangle(Pens.Black, 100, 100, 100, 100)
        e.Graphics.ResetTransform()

Otočení o 15 stupňů

Otáčení funguje kolem středu, takže pokud chceme otáčet podle jiného bodu, musíme transformace zkombinovat. Použijeme TranslateTransform – posunutí:

        e.Graphics.DrawRectangle(Pens.Black, 100, 100, 100, 100)

        e.Graphics.TranslateTransform(150, 150)
        e.Graphics.RotateTransform(45)
        e.Graphics.DrawRectangle(Pens.Blue, -50, -50, 100, 100)
        e.Graphics.ResetTransform()

Pro srovnání jsem tam dal i původní čtverec, abychom viděli, že střed nyní zůstal zachován. TranslateTransform všechny objekty posunula o 150 pixelů doprava a dolů, vlastně nám bodu [0,0] posunula na bod [150,150]. Proto čtverec kreslíme na souřadnice [-50, -50]. Šířka čtverce je 100x100, takže střed bude v nule. RotateTransform pak otáčí kolem počátku [0, 0], kde je střed našeho nového čtverce.

Otočený čtverec

Ještě máme ScaleTransform, která umí měnit měřítko vykresleného objektu.

        e.Graphics.DrawRectangle(Pens.Black, 100, 100, 100, 100)

        e.Graphics.TranslateTransform(150, 150)
        e.Graphics.ScaleTransform(2, 1.5)
        e.Graphics.RotateTransform(45)
        e.Graphics.DrawRectangle(Pens.Blue, -50, -50, 100, 100)
        e.Graphics.ResetTransform()

Zvětšený a otočený čtverec

Čtverec jsme roztáhli 2x na šířku a 1.5x na výšku, je proto takto zkosený. Všechny transformace zrušíme pomocí zavolání ResetTransform, pokud bychom vykreslovali něco dál, bude to zase normálně.

Transformace fungují samozřejmě na všechny vykreslované objekty, samozřejmě i na obrázky. Je důležité uvědomit si, že na pořadí transformací záleží, pokud zvětšení v poslední ukázce dáte až za otočení, bude to vypadat takto:

Otočený a zvětšený čtverec

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

ResetTransform

Díky za super článek....ResetTransform bylo přesně to, co jsem hledal :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback