グローバル変換とローカル変換

グローバル変換は、特定の Graphics オブジェクトによって描画されるすべての項目に適用される変換です。 グローバル変換を作成するには、 Graphics オブジェクトを作成し、 その Graphics::SetTransform メソッドを呼び出します。 Graphics::SetTransform メソッドは、Graphics オブジェクトに関連付けられている Matrix オブジェクトを操作します。 その Matrix オブジェクトに格納されている変換は、 ワールド変換と呼ばれます。 ワールド変換は、単純なアフィン変換またはアフィン変換の複雑なシーケンスにすることができますが、その複雑さに関係なく、ワールド変換は 1 つの Matrix オブジェクトに格納されます。

Graphics クラスには、複合ワールド変換を構築するためのいくつかのメソッド (Graphics::MultiplyTransform、Graphics::RotateTransformGraphics::ScaleTransformGraphics::TranslateTransform) が用意されています。 次の例では、楕円を 2 回描画します。1 回はワールド変換を作成する前、もう 1 回はその後です。 変換によって、y 方向に係数 0.5 で拡大縮小してから、x 方向に 50 単位移動し、さらに 30 度回転します。

myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);
myGraphics.ScaleTransform(1.0f, 0.5f);
myGraphics.TranslateTransform(50.0f, 0.0f, MatrixOrderAppend);
myGraphics.RotateTransform(30.0f, MatrixOrderAppend);
myGraphics.DrawEllipse(&myPen, 0, 0, 100, 50);

次の図は、元の楕円と変換された楕円を示しています。

2 つの重複する省略記号を含むウィンドウのスクリーン ショット。1 つは狭く、回転します

Note

前の例では、楕円は座標系の原点を中心に回転します。これはクライアント領域の左上隅にあります。 このため、自らの中心点に対して楕円を回転させる場合とは異なる結果になります。

 

ローカル変換は、描画する特定の項目に適用される変換です。 たとえば、 GraphicsPath オブジェクトには、そのパスのデータ ポイントを変換できる GraphicsPath::Transform メソッドがあります。 次の例では、変換なしの四角形と、回転変換を適用したパスを描画します。 (ワールド変換がないと仮定します。)

 
Matrix myMatrix;
myMatrix.Rotate(45.0f);
myGraphicsPath.Transform(&myMatrix);
myGraphics.DrawRectangle(&myPen, 10, 10, 100, 50);
myGraphics.DrawPath(&myPen, &myGraphicsPath);

ワールド変換とローカル変換を組み合わせて、さまざまな結果を得ることができます。 たとえば、ワールド変換を使用して座標系を変更し、ローカル変換を使用して、新しい座標系上に描画されたオブジェクトの回転と拡大縮小を行うことができます。

クライアント領域の左端から 200 ピクセル、クライアント領域の上端から 150 ピクセルの位置を原点とする座標系が必要だとします。 さらに、測定単位がピクセルで、x 軸が右向き、y 軸が上向きと仮定します。 既定の座標系では y 軸は下向きであるため、横軸に対して反射を実行する必要があります。 次の図は、そのような反射のマトリックスを示しています。

3 対 3 のマトリックスを示す図

次に、右へ 200 単位、下へ 150 単位移動する必要があるとします。

次の例では、 Graphics オブジェクトのワールド変換を設定することによって、先ほど説明した座標系を確立します。

Matrix myMatrix(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
myGraphics.SetTransform(&myMatrix);
myGraphics.TranslateTransform(200.0f, 150.0f, MatrixOrderAppend);

次のコード (前の例のコードの後に配置) は、新しい座標系の原点に左下隅を持つ 1 つの四角形で構成されるパスを作成します。 この四角形は、1 回はローカル変換なしで塗りつぶされ、もう 1 回はローカル変換が適用されて塗りつぶされます。 ローカル変換では、係数 2 の水平方向への拡大縮小の後で 30 度回転させます。

// Create the path.
GraphicsPath myGraphicsPath;
Rect myRect(0, 0, 60, 60);
myGraphicsPath.AddRectangle(myRect);

// Fill the path on the new coordinate system.
// No local transformation
myGraphics.FillPath(&mySolidBrush1, &myGraphicsPath);

// Transform the path.
Matrix myPathMatrix;
myPathMatrix.Scale(2, 1);
myPathMatrix.Rotate(30, MatrixOrderAppend);
myGraphicsPath.Transform(&myPathMatrix);

// Fill the transformed path on the new coordinate system.
myGraphics.FillPath(&mySolidBrush2, &myGraphicsPath);

次の図は、新しい座標系と 2 つの四角形を示しています。

x 軸と y 軸のスクリーン ショットと、左下隅を中心に回転した半透明のレクタグルによって重ねられた青い四角形