Condividi tramite


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 di pagina in coordinate del dispositivo.

Si supponga di voler usare un sistema di coordinate con origine nel corpo dell'area client anziché con l'angolo superiore sinistro. Si supponga, ad esempio, che l'origine sia di 100 pixel dal bordo sinistro dell'area client e di 50 pixel dalla parte superiore dell'area client. La figura seguente mostra un sistema di coordinate di questo tipo.

screenshot di una finestra contenente assi delle coordinate etichettate

Quando si effettua la chiamata myGraphics.DrawLine(&myPen, 0, 0, 160, 80), si ottiene la riga illustrata nella figura seguente.

screenshot della finestra precedente, ma con una linea blu che si estende diagonalmente dall'origine

Le coordinate degli endpoint della linea nei tre spazi di coordinate sono le seguenti:

Space Coordinate dell'endpoint
World (da 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 le stesse delle 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 e viene gestita da un oggetto Graphics . 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 l'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 di pagina alle coordinate del dispositivo è detta trasformazione pagina. La classe Graphics fornisce quattro metodi per modificare e controllare la trasformazione della pagina: Graphics::SetPageUnit, Graphics::GetPageUnit, Graphics::SetPageScale e 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 classe Graphics per specificare un'unità di misura. L'esempio seguente disegna 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 costruttore Pen :

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:

Space Coordinate dell'endpoint
World (da 0, 0) a (2, 1)
Pagina (da 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 di 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 mostra il sistema di linee e coordinate.

screenshot della finestra precedente, ma più ampia, con gli assi posizionati a sinistra ed etichettati in modo diverso

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:

Space Coordinate dell'endpoint
World (da 0, 0) a (2, 1)
Pagina (2, 0,5) a (4, 1,5)
Dispositivo (192, 48) a (384, 144)