Shape and Transform

image_pdfimage_print


   

/*
GDI+ Programming in C# and VB .NET
by Nick Symmonds

Publisher: Apress
ISBN: 159059035X
*/

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace GraphicsDraw_c
{
    /// <summary>
    /// Summary description for GraphicsDraw.
    /// </summary>
    public class GraphicsDraw : System.Windows.Forms.Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ComponentModel.Container components = null;

        public GraphicsDraw()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
      // 
      // GraphicsDraw
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(504, 629);
      this.Name = "GraphicsDraw";
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
      this.Text = "GraphicsDraw";
      this.Load += new System.EventHandler(this.GraphicsDraw_Load);

    }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new GraphicsDraw());
        }

    private void GraphicsDraw_Load(object sender, System.EventArgs e)
    {
    
    }
    protected override void OnPaint(PaintEventArgs e)
    {
      Rectangle R1 = new Rectangle(10, 10, 40, 40);

      e.Graphics.SmoothingMode=SmoothingMode.HighQuality;

      e.Graphics.DrawRectangle(Pens.Black,R1);
      e.Graphics.TranslateTransform(50.0F, 0.0F);
      e.Graphics.FillRectangle(Brushes.Black,R1);

      //Draw three rectangles
      Rectangle[] ThreeRects = {new Rectangle(110, 10, 40, 40), 
                                new Rectangle(160, 10, 40, 40), 
                                new Rectangle(210, 10, 40, 40)};
      e.Graphics.ResetTransform();
      e.Graphics.DrawRectangles(Pens.Red, ThreeRects);

      //Draw three filled rectangles
      e.Graphics.ResetTransform();
      e.Graphics.TranslateTransform(100.0F, 0.0F);
      e.Graphics.FillRectangles(Brushes.Red, ThreeRects);


      //Use first rect to bound ellipse as circle
      e.Graphics.ResetTransform();
      e.Graphics.TranslateTransform(0.0F, 50.0F);
      e.Graphics.DrawEllipse(Pens.Green,R1);

      //Draw a filled ellipse
      e.Graphics.TranslateTransform(50.0F, 0.0F);
      e.Graphics.FillEllipse(Brushes.Green,R1);

      //Use first rect to bound pie 
      e.Graphics.ResetTransform();
      e.Graphics.TranslateTransform(100.0F, 50.0F);
      e.Graphics.DrawPie(Pens.DarkViolet, R1, 0, 60);

      //Use first rect to fill pie 
      e.Graphics.ResetTransform();
      e.Graphics.TranslateTransform(150.0F, 50.0F);
      e.Graphics.FillPie(Brushes.DarkViolet, R1, 0, 60);

      //Use first rect to bound arc 
      e.Graphics.ResetTransform();
      e.Graphics.TranslateTransform(200.0F, 50.0F);
      e.Graphics.DrawArc(Pens.DarkBlue, R1, 40, 160);

      PointDraw ( e.Graphics );
      PathDraw ( e.Graphics );
   }

    private void PointDraw( Graphics G )
    {
      //Start with clean slate
      G.ResetClip();
      G.ResetTransform();

      //Separate sections
      G.DrawLine(Pens.Black,10,110,this.Width-10,110);

      //------------ Draw Line -----------------------
      //Generate start and end points
      Point StartPt = new Point(10,130);
      Point EndPt = new Point(200,130);
      Pen P = new Pen(Brushes.CadetBlue, 5);
      G.DrawLine(P, StartPt, EndPt);

      //------------- Draw lines ----------------------
      //Translate in the Y Direction
      Size Xlate_Y = new Size(0,40);
      //Translate in the X Direction
      Size Xlate_X = new Size(200,0);
      Point Pt = StartPt;
      //Generate set of points based on offsets of original point
      Point[] ManyPoints = { (Pt + Xlate_X), 
                             (Pt = Pt + Xlate_X + Xlate_Y), 
                             (Pt = Pt + Xlate_X) };
      P.Color=Color.Firebrick;
      G.DrawLines(P, ManyPoints);

      //------------ DrawBezier and Polygon -------------------
      StartPt.X=10;
      StartPt.Y=250;
      Point CtlPtA = new Point(50,150);
      Point CtlPtB = new Point(350,300);
      EndPt.X=400;
      EndPt.Y=250;
      Point[] PolyPoints = { StartPt, CtlPtA, EndPt, CtlPtB };
      //Draw the controlling shape of the Bezier spline
      G.DrawPolygon ( Pens.DarkSeaGreen, PolyPoints );

      //Draw the actual Spline
      P.Color=Color.DarkSeaGreen;
      P.Width=3;
      G.DrawBezier( P, StartPt, CtlPtA, CtlPtB, EndPt );

      //---------- Draw two Bezier splines ---------------------
      Size Y = new Size(0,40);
      Size X = new Size(20,0);
      //Y Translated start of first spline
      //Same control points for first spline,
      //X,Y Translated end of first spline, 
      //X Translate control points for second spline,
      //X,Y New end point for second spline
      Point[] TwoSplines = { StartPt+Y, 
                             CtlPtA, 
                             CtlPtB, 
                             EndPt+Y-new Size(200,0), 
                             CtlPtA+X, 
                             CtlPtB+X, 
                             EndPt+Y+X };
      P.Color=Color.Gold;
      G.DrawBeziers (P, TwoSplines);

      //---------- Draw a closed curve -----------
      PolyPoints[0] = new Point(100, 350);
      PolyPoints[1] = new Point(250, 300);
      PolyPoints[2] = new Point(250, 400);
      PolyPoints[3] = new Point(150, 400);
      P.Color=Color.Olive;
      //Curve traces outside of polygon
      //Curve is closed cardinal spline &amp; hits all points
      G.DrawPolygon (P, PolyPoints);
      G.DrawClosedCurve(P,PolyPoints);
      //Uncomment next line to fill the egg shape
      // G.FillClosedCurve(Brushes.AliceBlue,PolyPoints);

      //---------- Draw an open cardinal curve -----------
      Point[] CardPoints = { new Point( 310, 350 ),
                             new Point( 330, 360 ),
                             new Point( 360, 320 ),
                             new Point( 390, 370 ),
                             new Point( 400, 350 ),
                             new Point( 480, 340 )};
      P.Color=Color.DarkOrange;
      G.DrawCurve(P, CardPoints);

      P.Dispose();
    }
    private void PathDraw( Graphics G )
    {
      //Start with clean slate
      G.ResetClip();
      G.ResetTransform();

      //Separate sections
      G.DrawLine(Pens.Black, 10, 420, this.Width-10, 420);

      //Make a blank path and add shapes to it
      GraphicsPath gp = new GraphicsPath();
      Pen P = new Pen(Brushes.ForestGreen,3);
      gp.AddRectangle(new Rectangle(10, 450, 100, 100));
      gp.AddEllipse(120, 450, 100, 100);
      gp.AddPie ( 70, 500, 100, 100, 25, 120 );
      //Draw the outline of the path and fill it in
      G.DrawPath (P, gp );
      G.FillPath(Brushes.Bisque,gp);

      P.Dispose();
    }

    }
}


           
          


This entry was posted in 2D Graphics. Bookmark the permalink.