Tipi di sistemi di coordinate

GDI+ usa tre spazi di coordinate: mondo, pagina e dispositivo. Le coordinate mondiali sono le coordinate usate per modellare un particolare mondo grafico e sono le coordinate passate ai metodi in .NET Framework. Le coordinate della pagina fanno riferimento al sistema di coordinate utilizzato da una superficie di disegno, ad esempio una maschera o un controllo. Le coordinate del dispositivo sono le coordinate utilizzate dal dispositivo fisico su cui viene disegnato, ad esempio uno schermo o un foglio di carta. Quando si effettua la chiamata myGraphics.DrawLine(myPen, 0, 0, 160, 80), i punti passati al DrawLine metodo(0, 0) e (160, 80)si trovano nello spazio delle coordinate del mondo. Prima che GDI+ possa disegnare la linea sullo schermo, le coordinate passano attraverso una sequenza di trasformazioni. Una trasformazione, denominata trasformazione globale, converte le coordinate del mondo in coordinate di pagina e un'altra trasformazione, denominata trasformazione pagina, converte le coordinate della pagina in coordinate del dispositivo.

Trasformazioni e sistemi di coordinate

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.

Illustration of a coordinate system.

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

Illustration of a line in the coordinate system.

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

Spazio delle coordinate 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 globale, che esegue il mapping delle coordinate del mondo alle coordinate della pagina, viene mantenuta nella Transform proprietà della Graphics classe . 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 Graphics oggetto e quindi viene utilizzato tale Graphics oggetto per disegnare la linea illustrata nella figura precedente:

myGraphics.TranslateTransform(100, 50);
myGraphics.DrawLine(myPen, 0, 0, 160, 80);
myGraphics.TranslateTransform(100, 50)
myGraphics.DrawLine(myPen, 0, 0, 160, 80)

La trasformazione pagina esegue il mapping delle coordinate della pagina alle coordinate del dispositivo. La Graphics classe fornisce le PageUnit proprietà e PageScale per la modifica della trasformazione pagina. La Graphics classe fornisce anche due proprietà di sola lettura, DpiX e DpiY, per esaminare i punti orizzontali e verticali per pollice del dispositivo di visualizzazione.

È possibile utilizzare la PageUnit proprietà della Graphics classe per specificare un'unità di misura diversa dal pixel.

Nota

Non è possibile impostare la PageUnit proprietà su World, perché non si tratta di un'unità fisica e causerà un'eccezione.

L'esempio seguente disegna una linea da (0, 0) a (2, 1), dove il punto (2, 1) è 2 pollici a destra e 1 pollice verso il basso dal punto (0, 0):

myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);
myGraphics.PageUnit = GraphicsUnit.Inch
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 Pen costruttore:

Pen myPen = new Pen(Color.Black, 1 / myGraphics.DpiX);
Dim myPen As New Pen(Color.Black, 1 / myGraphics.DpiX)

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 delle coordinate Coordinate endpoint
Mondo (0, 0) a (2, 1)
Pagina (0, 0) a (2, 1)
Dispositivo (0, 0) a (192, 96)

Si noti che poiché l'origine dello spazio delle coordinate del mondo si trova nell'angolo superiore sinistro dell'area client, le coordinate della pagina sono le stesse delle coordinate del mondo.

È 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 Graphics oggetto e quindi viene tracciata una linea da (0, 0) a (2, 1):

myGraphics.TranslateTransform(2, 0.5f);
myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);
myGraphics.TranslateTransform(2, 0.5F)
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)

La figura seguente illustra il sistema di linee e coordinate.

Illustration of a line and coordinate system.

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 delle coordinate Coordinate endpoint
Mondo (0, 0) a (2, 1)
Pagina (da 2, 0,5) a (4, 1,5)
Dispositivo (192, 48) a (384, 144)

Vedi anche