座標系の種類

GDI+ には、ワールド、ページ、デバイスという 3 つの座標空間が使用されます。 ワールド座標とは、特定のグラフィック ワールドをモデル化するために使用される座標であり、.NET Framework のメソッドに渡す座標です。 ページ座標とは、フォームやコントロールなどの描画面で使用される座標系を指します。 デバイス座標とは、デバイス座標は、画面や紙など、描画される物理デバイス上で使用される座標です。 myGraphics.DrawLine(myPen, 0, 0, 160, 80) を呼び出す場合、DrawLine メソッドに渡す点 ((0, 0)(160, 80)) は、ワールド座標空間にあります。 GDI+ によって画面上に直線が描画される前に、座標には一連の変換が実行されています。 ワールド変換という変換の場合、ワールド座標がページ座標に変換されます。また、ページ変換という変換の場合、ページ座標がデバイス座標に変換されます。

変換と座標系

たとえば、クライアント領域の左上ではなく、本文を原点とする座標系を使用するとします。 たとえば、クライアント領域の左端から 100 ピクセル、クライアント領域の上端から 50 ピクセルのところを原点にするとします。 次の図は、このような座標系を示しています。

Illustration of a coordinate system.

myGraphics.DrawLine(myPen, 0, 0, 160, 80) を呼び出すと、次の図のような直線が得られます。

Illustration of a line in the coordinate system.

3 つの座標空間における直線の端点の座標は次のとおりです。

座標空間 エンドポイント座標
World (0, 0) から (160, 80)
ページ (100, 50) から (260, 130)
Device (100, 50) から (260, 130)

ページ座標空間は、クライアント領域の左上を原点としていることに注意してください。常にこうなります。 また、測定単位はピクセルであるため、デバイス座標とページ座標は同じであることに注意してください。 測定単位をピクセル以外 (インチなど) に設定すると、デバイス座標はページ座標と異なる結果になります。

ワールド座標をページ座標にマップするワールド変換は、Graphics クラスの Transform プロパティに保持されます。 前の例で言うと、ワールド変換は、X 方向に 100 単位、Y 方向に 50 単位の移動です。 次の例では、Graphics オブジェクトにワールド変換を設定し、その Graphics オブジェクトを使用して、前の図のような直線を描画します。

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

ページ変換により、ページ座標がデバイス座標にマップされます。 Graphics クラスには、ページ変換を操作するための PageUnitPageScale のプロパティが用意されています。 また、Graphics クラスには、ディスプレイ デバイスの水平方向と垂直方向の DPI を調べるための 2 つの読み取り専用プロパティ DpiXDpiY が用意されています。

Graphics クラスの PageUnit プロパティを使用して、ピクセル以外の測定単位を指定することができます。

注意

PageUnit プロパティを World に設定することはできません。これは物理的な単位ではなく、例外が発生するためです。

次の例では、点 (0, 0) から右に 2 インチ、下に 1 インチの位置にある点 (2, 1) を中心に、(0, 0) から (2, 1) まで直線を引いています。

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

注意

ペンを構築するときにペン幅を指定しなかった場合、前の例では 1 インチの幅の直線を描画することになります。 ペン幅は、Pen コンストラクターの 2 つ目の引数で指定できます。

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

ディスプレイ デバイスの水平方向が 96 DPI、垂直方向が 96 DPI であると仮定すると、前の例の直線の端点は 3 つの座標空間で次の座標になります。

座標空間 エンドポイント座標
World (0, 0) から (2, 1)
ページ (0, 0) から (2, 1)
Device (0, 0) から (192, 96)

ワールド座標空間の原点はクライアント領域の左上隅にあるので、ページ座標はワールド座標と同じであることに注意してください。

ワールド変換とページ変換を組み合わせることで、さまざまな効果を実現できます。 たとえば、測定単位としてインチを使用し、座標系の原点をクライアント領域の左端から 2 インチ、クライアント領域の上端から 1/2 インチにしたいとします。 次の例では、Graphics オブジェクトのワールド変換とページ変換を設定してから、(0, 0) から (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)

次の図は、直線と座標系を示しています。

Illustration of a line and coordinate system.

ディスプレイ デバイスの水平方向が 96 DPI、垂直方向が 96 DPI であると仮定すると、前の例の直線の端点は 3 つの座標空間で次の座標になります。

座標空間 エンドポイント座標
World (0, 0) から (2, 1)
ページ (2, 0.5) から (4, 1.5)
Device (192, 48) から (384, 144)

関連項目