Global, Local, and Composite Transformations

Transformations can be divided into two categories based on their scope: global and local. In addition, there are composite transformations. A global transformation is applicable to all items of a Graphics object. The Transform property of the Graphics class is used to set global transformations.

A composite transformation is a sequence of transformations. For example, scaling followed by translation and rotation is a composite translation. The MultiplyTransform, RotateTransform, ScaleTransform, and TranslateTransform methods are used to generate composite transformations.

Listing 10.14 draws two ellipses and a rectangle, then calls ScaleTransform, TranslateTransform, and RotateTransform (a composite transformation). The items are drawn again after the composite transformation.

Listing 10.14 Applying a composite transformation

private void GlobalTransformation_Click(object sender,
 System.EventArgs e)
{
 // Create a Graphics object
 Graphics g = this.CreateGraphics();
 g.Clear(this.BackColor);
 // Create a blue pen with width of 2
 Pen bluePen = new Pen(Color.Blue, 2);
 Point pt1 = new Point(10, 10);
 Point pt2 = new Point(20, 20);
 Color [] lnColors = {Color.Black, Color.Red};
 Rectangle rect1 = new Rectangle(10, 10, 15, 15);
 // Create two linear gradient brushes
 LinearGradientBrush lgBrush1 = new LinearGradientBrush
 (rect1, Color.Blue, Color.Green,
 LinearGradientMode.BackwardDiagonal);
 LinearGradientBrush lgBrush = new LinearGradientBrush
 (pt1, pt2, Color.Red, Color.Green);
 // Set linear colors
 lgBrush.LinearColors = lnColors;
 // Set gamma correction
 lgBrush.GammaCorrection = true;
 // Fill and draw rectangle and ellipses
 g.FillRectangle(lgBrush, 150, 0, 50, 100);
 g.DrawEllipse(bluePen, 0, 0, 100, 50);
 g.FillEllipse(lgBrush1, 300, 0, 100, 100);
 // Apply scale transformation
 g.ScaleTransform(1, 0.5f);
 // Apply translate transformation
 g.TranslateTransform(50, 0, MatrixOrder.Append);
 // Apply rotate transformation
 g.RotateTransform(30.0f, MatrixOrder.Append);
 // Fill ellipse
 g.FillEllipse(lgBrush1, 300, 0, 100, 100);
 // Rotate again
 g.RotateTransform(15.0f, MatrixOrder.Append);
 // Fill rectangle
 g.FillRectangle(lgBrush, 150, 0, 50, 100);
 // Rotate again
 g.RotateTransform(15.0f, MatrixOrder.Append);
 // Draw ellipse
 g.DrawEllipse(bluePen, 0, 0, 100, 50);
 // Dispose of objects
 lgBrush1.Dispose();
 lgBrush.Dispose();
 bluePen.Dispose();
 g.Dispose();
}

Figure 10.15 shows the output from Listing 10.14.

Figure 10.15. Composite transformation

graphics/10fig15.jpg

A local transformation is applicable to only a specific item of a Graphics object. The best example of local transformation is transforming a graphics path. The Translate method of the GraphicsPath class translates only the items of a graphics path. Listing 10.15 translates a graphics path. We create a Matrix object and apply rotate and translate transformations to it.

Listing 10.15 Translating graphics path items

private void LocalTransformation_Click(object sender,
 System.EventArgs e)
{
 // Create a Graphics object
 Graphics g = this.CreateGraphics();
 g.Clear(this.BackColor);
 // Create a GraphicsPath object
 GraphicsPath path = new GraphicsPath();
 // Add an ellipse and a line to the
 // graphics path
 path.AddEllipse(50, 50, 100, 150);
 path.AddLine(20, 20, 200, 20);
 // Create a blue pen with a width of 2
 Pen bluePen = new Pen(Color.Blue, 2);
 // Create a Matrix object
 Matrix X = new Matrix();
 // Rotate 30 degrees
 X.Rotate(30);
 // Translate with 50 offset in x direction
 X.Translate(50.0f, 0);
 // Apply transformation on the path
 path.Transform(X);
 // Draw a rectangle, a line, and the path
 g.DrawRectangle(Pens.Green, 200, 50, 100, 100);
 g.DrawLine(Pens.Green, 30, 20, 200, 20);
 g.DrawPath(bluePen, path);
 // Dispose of objects
 bluePen.Dispose();
 path.Dispose();
 g.Dispose();
}

Figure 10.16 shows the output from Listing 10.15. The transformation affects only graphics path items (the ellipse and the blue [dark] line).

Figure 10.16. Local transformation

graphics/10fig16.jpg

GDI+: The Next-Generation Graphics Interface

Your First GDI+ Application

The Graphics Class

Working with Brushes and Pens

Colors, Fonts, and Text

Rectangles and Regions

Working with Images

Advanced Imaging

Advanced 2D Graphics

Transformation

Printing

Developing GDI+ Web Applications

GDI+ Best Practices and Performance Techniques

GDI Interoperability

Miscellaneous GDI+ Examples

Appendix A. Exception Handling in .NET



GDI+ Programming with C#
GDI+ Programming with C#
ISBN: 073561265X
EAN: N/A
Year: 2003
Pages: 145

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net