Tipos de sistemas de coordenadas

O GDI+ usa três espaços de coordenadas: mundo, página e dispositivo. Coordenadas de mundo são as coordenadas usadas para modelar um mundo gráfico específico e são as coordenadas que você passa para métodos no .NET Framework. Coordenadas de página fazem referência ao sistema de coordenadas usado por uma superfície de desenho, como um formulário ou controle. Coordenadas de dispositivo são as coordenadas usadas pelo dispositivo físico em que o desenho está sendo feito, como uma tela ou uma folha de papel. Quando você faz a chamadamyGraphics.DrawLine(myPen, 0, 0, 160, 80), os pontos que você passa para o DrawLine método — e (160, 80)(0, 0) estão no espaço de coordenadas do mundo. Antes que o GDI+ possa desenhar a linha na tela, as coordenadas passam por uma sequência de transformações. Uma transformação, chamada transformação global, converte coordenadas de mundo em coordenadas de página e outra transformação, chamada transformação de página, converte coordenadas de página em coordenadas de dispositivo.

Transformações e sistemas de coordenadas

Suponha que você queira trabalhar com um sistema de coordenadas cuja origem está no corpo da área de cliente em vez do canto superior esquerdo. Digamos, por exemplo, que você queira que a origem esteja a 100 pixels da borda esquerda da área de cliente e a 50 pixels da parte superior da área de cliente. A ilustração a seguir mostra esse sistema de coordenadas.

Illustration of a coordinate system.

Quando faz a chamada myGraphics.DrawLine(myPen, 0, 0, 160, 80), você obtém a linha mostrada na ilustração a seguir.

Illustration of a line in the coordinate system.

As coordenadas dos pontos de extremidade da sua linha nos três espaços de coordenadas são as seguintes:

Espaço coordenado Coordenadas do ponto de extremidade
World (Mundo) (0, 0) a (160, 80)
Page (100, 50) a (260, 130)
Dispositivo (100, 50) a (260, 130)

Observe que o espaço de coordenadas de página tem sua origem no canto superior esquerdo da área de cliente; sempre será esse o caso. Observe também que, como a unidade de medida é o pixel, as coordenadas do dispositivo são as mesmas que as coordenadas da página. Se você definir a unidade de medida como algo diferente de pixels (por exemplo, polegadas), as coordenadas do dispositivo serão diferentes das coordenadas da página.

A transformação do mundo, que mapeia Transform as coordenadas do mundo para as coordenadas da página, é mantida na propriedade da Graphics classe. No exemplo anterior, a transformação global é uma translação de 100 unidades na direção x e 50 unidades na direção y. O exemplo a seguir define a transformação de mundo de um Graphics objeto e, em seguida, usa esse Graphics objeto para desenhar a linha mostrada na figura anterior:

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

A transformação de página mapeia as coordenadas da página para coordenadas do dispositivo. A Graphics classe fornece as PageUnit propriedades e PageScale para manipular a transformação de página. A Graphics classe também fornece duas propriedades DpiX somente leitura e , para examinar os pontos horizontais e DpiYverticais por polegada do dispositivo de exibição.

Você pode usar a PageUnitGraphics propriedade da classe para especificar uma unidade de medida diferente do pixel.

Observação

Não é possível definir a PageUnit propriedade como World, pois essa não é uma unidade física e causará uma exceção.

O exemplo a seguir desenha uma linha de (0, 0) para (2, 1), no qual o ponto (2, 1) está 2 polegadas à direita e 1 polegada abaixo do ponto (0, 0):

myGraphics.PageUnit = GraphicsUnit.Inch;
myGraphics.DrawLine(myPen, 0, 0, 2, 1);
myGraphics.PageUnit = GraphicsUnit.Inch
myGraphics.DrawLine(myPen, 0, 0, 2, 1)

Observação

Se você não especificar uma largura de caneta ao construir a caneta, o exemplo anterior desenhará uma linha com uma polegada de largura. Você pode especificar a largura da caneta no segundo argumento para o Pen construtor:

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

Se supusermos que o dispositivo de vídeo tem 96 pontos por polegada na direção horizontal e 96 pontos por polegada na direção vertical, os pontos de extremidade da linha no exemplo anterior terão as seguintes coordenadas nos três espaços de coordenadas:

Espaço coordenado Coordenadas do ponto de extremidade
World (Mundo) (0, 0) a (2, 1)
Page (0, 0) a (2, 1)
Dispositivo (0, 0) a (192, 96)

Observe que, como a origem do espaço de coordenadas de mundo está no canto superior esquerdo da área de cliente, as coordenadas de página serão as mesmas que as coordenadas de mundo.

É possível combinar as transformações global e de página para obter uma variedade de resultados. Por exemplo, suponha que você queira usar polegadas como a unidade de medida e queira que a origem se seu sistema de coordenadas esteja a 2 polegadas da borda esquerda da área de cliente e a 1/2 polegada da parte superior da área de cliente. O exemplo a seguir define as transformações de mundo e página de um Graphics objeto e, em seguida, desenha uma linha de (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)

A ilustração a seguir mostra a linha e o sistema de coordenadas.

Illustration of a line and coordinate system.

Se supusermos que o dispositivo de vídeo tem 96 pontos por polegada na direção horizontal e 96 pontos por polegada na direção vertical, os pontos de extremidade da linha no exemplo anterior terão as seguintes coordenadas nos três espaços de coordenadas:

Espaço coordenado Coordenadas do ponto de extremidade
World (Mundo) (0, 0) a (2, 1)
Page (2, 0.5) a (4, 1.5)
Dispositivo (192, 48) a (384, 144)

Confira também