Tipi di sistemi di coordinate
Windows GDI+ usa tre spazi di coordinate: mondo, pagina e dispositivo. Quando si effettua la chiamata myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
, i punti passati al metodo Graphics::D rawLine - (0, 0) e (160, 80) - si trovano nello spazio delle coordinate mondiali. Prima che GDI+ possa disegnare la linea sullo schermo, le coordinate passano attraverso una sequenza di trasformazioni. Una trasformazione converte le coordinate del mondo in coordinate di pagina e un'altra trasformazione converte le coordinate della pagina in coordinate del dispositivo.
Si supponga di voler lavorare con un sistema di coordinate con origine nel corpo dell'area client anziché con l'angolo superiore sinistro. Si supponga, ad esempio, che si desideri che l'origine sia 100 pixel dal bordo sinistro dell'area client e 50 pixel dalla parte superiore dell'area client. La figura seguente mostra un sistema di coordinate di questo tipo.
Quando si effettua la chiamata myGraphics.DrawLine(&myPen, 0, 0, 160, 80)
, si ottiene la riga illustrata nella figura seguente.
Le coordinate degli endpoint della linea nei tre spazi di coordinate sono le seguenti:
Spazio | Coordinate endpoint |
---|---|
Mondo | (0, 0) a (160, 80) |
Pagina | (100, 50) a (260, 130) |
Dispositivo | (100, 50) a (260, 130) |
Si noti che lo spazio delle coordinate della pagina ha l'origine nell'angolo superiore sinistro dell'area client; questo sarà sempre il caso. Si noti anche che poiché l'unità di misura è il pixel, le coordinate del dispositivo sono uguali alle coordinate della pagina. Se si imposta l'unità di misura su un valore diverso da pixel(ad esempio pollici), le coordinate del dispositivo saranno diverse dalle coordinate della pagina.
La trasformazione che esegue il mapping delle coordinate del mondo alle coordinate di pagina è detta trasformazione globale ed è gestita da un oggettographics. Nell'esempio precedente, la trasformazione globale è una conversione di 100 unità nella direzione x e 50 unità nella direzione y. Nell'esempio seguente viene impostata la trasformazione globale di un oggetto Graphics e quindi viene utilizzata tale oggetto Graphics per disegnare la linea illustrata nella figura precedente.
myGraphics.TranslateTransform(100.0f, 50.0f);
myGraphics.DrawLine(&myPen, 0, 0, 160, 80);
La trasformazione che esegue il mapping delle coordinate della pagina alle coordinate del dispositivo viene chiamata trasformazione pagina . La classegraphicsfornisce quattro metodi per la modifica e l'ispezione della trasformazione pagina: Graphics::SetPageUnit, Graphics::GetPageUnit, Graphics::SetPageScalee Graphics::GetPageScale. La classe Graphics fornisce anche due metodi, Graphics::GetDpiX e Graphics::GetDpiY, per esaminare i punti orizzontali e verticali per pollice del dispositivo di visualizzazione.
È possibile utilizzare il metodo Graphics::SetPageUnit della classeGraphicsper specificare un'unità di misura. Nell'esempio seguente viene tracciata una linea da (0, 0) a (2, 1) dove il punto (2, 1) è di 2 pollici a destra e 1 pollice verso il basso dal punto (0, 0).
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);
Nota
Se non si specifica una larghezza della penna quando si costruisce la penna, nell'esempio precedente verrà disegnata una linea larga di un pollice. È possibile specificare la larghezza della penna nel secondo argomento per il costruttorepenna:
Pen myPen(Color(255, 0, 0, 0), 1/myGraphics.GetDpiX())
.
Se si presuppone che il dispositivo di visualizzazione abbia 96 punti per pollice nella direzione orizzontale e 96 punti per pollice nella direzione verticale, gli endpoint della linea nell'esempio precedente hanno le coordinate seguenti nei tre spazi di coordinate:
Spazio | Coordinate endpoint |
---|---|
Mondo | (0, 0) a (2, 1) |
Pagina | (0, 0) a (2, 1) |
Dispositivo | (da 0, 0, a (192, 96) |
È possibile combinare le trasformazioni del mondo e della pagina per ottenere un'ampia gamma di effetti. Si supponga, ad esempio, di voler usare pollici come unità di misura e si vuole che l'origine del sistema di coordinate sia di 2 pollici dal bordo sinistro dell'area client e da 1/2 pollici dalla parte superiore dell'area client. Nell'esempio seguente vengono impostate le trasformazioni del mondo e della pagina di un oggetto Graphics e quindi viene tracciata una linea da (0, 0) a (2, 1).
myGraphics.TranslateTransform(2.0f, 0.5f);
myGraphics.SetPageUnit(UnitInch);
myGraphics.DrawLine(&myPen, 0, 0, 2, 1);
La figura seguente illustra il sistema di linee e coordinate.
Se si presuppone che il dispositivo di visualizzazione abbia 96 punti per pollice nella direzione orizzontale e 96 punti per pollice nella direzione verticale, gli endpoint della linea nell'esempio precedente hanno le coordinate seguenti nei tre spazi di coordinate:
Spazio | Coordinate endpoint |
---|---|
Mondo | (0, 0) a (2, 1) |
Pagina | (da 2, 0,5) a (4, 1,5) |
Dispositivo | (192, 48) a (384, 144) |