Mega Code Archive

 
Categories / C# / 2D Graphics
 

Draw Polygon

/* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794 */ using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespace Poly {   /// <summary>   /// Summary description for Form1.   /// </summary>   public class PolyclsMain : System.Windows.Forms.Form   {     private System.Windows.Forms.MainMenu mainMenu1;     private System.Windows.Forms.MenuItem menuItem1;     private System.Windows.Forms.MenuItem mnuFileExit;     private System.Windows.Forms.Label label1;     /// <summary>     /// Required designer variable.     /// </summary>     private System.ComponentModel.Container components = null;     public PolyclsMain()     {       //       // Required for Windows Form Designer support       //       InitializeComponent();       InitForm ();       //       // TODO: Add any constructor code after InitializeComponent call       //     }     clsPoint pt = new clsPoint (50, 50);     clsEllipse ellipse = new clsEllipse (200, 150, 150, 75, 450);     clsCircle circle = new clsCircle (400, 150, 150);     clsLine line = new clsLine (400, 150, 150, 450); //    clsShape [] Shapes;     private void InitForm ()     { //    Shapes = new clsShape [] {pt, ellipse, circle, line};       pt.color = Color.Red;       this.MaximumSize = new Size (this.Bounds.Width, this.Bounds.Height);       this.MinimumSize = this.MaximumSize;       ellipse.color = Color.DarkOrange;       line.color = Color.Blue;     }     /// <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()         {             this.label1 = new System.Windows.Forms.Label();             this.mnuFileExit = new System.Windows.Forms.MenuItem();             this.menuItem1 = new System.Windows.Forms.MenuItem();             this.mainMenu1 = new System.Windows.Forms.MainMenu();             this.SuspendLayout();             //              // label1             //              this.label1.BackColor = System.Drawing.SystemColors.Window;             this.label1.Dock = System.Windows.Forms.DockStyle.Fill;             this.label1.Name = "label1";             this.label1.Size = new System.Drawing.Size(680, 341);             this.label1.TabIndex = 0;             this.label1.Paint += new System.Windows.Forms.PaintEventHandler(this.label1_Paint);             //              // mnuFileExit             //              this.mnuFileExit.Index = 0;             this.mnuFileExit.Text = "Exit";             this.mnuFileExit.Click += new System.EventHandler(this.mnuFileExit_Click);             //              // menuItem1             //              this.menuItem1.Index = 0;             this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {                         this.mnuFileExit});             this.menuItem1.Text = "File";             //              // mainMenu1             //              this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {                         this.menuItem1});             //              // clsMain             //              this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);             this.ClientSize = new System.Drawing.Size(680, 341);             this.Controls.AddRange(new System.Windows.Forms.Control[] {                         this.label1});             this.Menu = this.mainMenu1;             this.MinimizeBox = false;             this.Name = "Poly";             this.Text = "Poly";             this.ResumeLayout(false);         }         #endregion     /// <summary>     /// The main entry point for the application.     /// </summary>     [STAThread]     static void Main()      {       Application.Run(new PolyclsMain());     }     private void mnuFileExit_Click(object sender, System.EventArgs e)     {       this.Close ();      }     int m_cx = 100;     int m_cy = 50;     private void label1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)     { //    foreach (clsShape shape in Shapes) //      shape.Show (e);       pt.Show(e);       ellipse.Show (e);       circle.Show (e);       line.Show (e);     }   }   abstract public class clsShape   {     protected clsShape() { }     ~clsShape ()     {       if (m_Pen != null)         m_Pen.Dispose ();       if (m_Brush != null)         m_Brush.Dispose ();     }     protected Pen m_Pen = null;     protected SolidBrush m_Brush = null;     public Color color     {       get       {         if (m_Brush == null)           m_Brush = new SolidBrush (Color.Black);         return (m_Brush.Color);       }       set       {         if (m_Brush != null)           m_Brush.Dispose ();         m_Brush = new SolidBrush (value);       }     }     protected virtual SolidBrush brush     {       get       {         if (m_Brush == null)           m_Brush = new SolidBrush (Color.Black);         return (m_Brush);       }     }     protected virtual Pen pen     {       get       {         if (m_Pen == null)           SetPen();         return (m_Pen);       }       set {SetPen ();}     }     private void SetPen ()     {       if (m_Brush == null)         m_Brush = new SolidBrush (Color.Black);       if (m_Pen != null)         m_Pen.Dispose ();       m_Pen = new Pen (m_Brush, 2);     }     public void Show (PaintEventArgs e)     {       Draw (e);     }     virtual protected void Draw (PaintEventArgs e)     {     }     protected void Rotate (int angle, Point ptCenter, Point [] ptControl)     {             // If the angle is 0, there's nothing to do       if (angle == 0)         return;                          // The angle is in tenths of a degree. Convert to radians       double fAngle = (angle / 10.0) / 57.29578;                          // Calculate the sine of the angle       double fSine = Math.Sin (fAngle);                          // Calculate the cosing of the angle       double fCosine = Math.Cos (fAngle);                          // Translate the center point so it can be the center of rotation       double fRotateX = ptCenter.X - ptCenter.X * fCosine - ptCenter.Y * fSine;       double fRotateY = ptCenter.Y + ptCenter.X * fSine - ptCenter.Y * fCosine;       for (int x = 0; x <  ptControl.Length; ++x)       {                 // Rotate the control point and add the translated center point         double fNewX = ptControl[x].X * fCosine + ptControl[x].Y *fSine + fRotateX;         double fNewY = -ptControl[x].X * fSine + ptControl[x].Y *fCosine + fRotateY;                                  // Put the new values in the control point         ptControl[x].X = (int) fNewX;         ptControl[x].Y = (int) fNewY;       }     }   }   public class clsPoint : clsShape   {     protected clsPoint () { }     public clsPoint (int cx, int cy)     {       m_cx = cx;       m_cy = cy;     }     public int cx     {       get {return(m_cx);}       set {m_cx = value;}     }     public int cy     {       get {return(m_cy);}       set {m_cy = value;}     }     protected int m_cx;     protected int m_cy;     override protected void Draw (PaintEventArgs e)     {       Point pt1 = new Point (m_cx, m_cy - 1);       Point pt2 = new Point (m_cx, m_cy + 1);       e.Graphics.DrawLine (pen, pt1, pt2);       pt1.X = m_cx - 1;       pt2.X = m_cx + 1;       pt1.Y = pt2.Y = m_cy;       e.Graphics.DrawLine (pen, pt1, pt2);       e.Graphics.DrawRectangle (pen, m_cx - 3, m_cy - 3, 6, 6);     }   }   public class clsLine : clsShape   {     protected clsLine () { }     public clsLine (int cx, int cy, int length, int angle)     {       m_Start = new Point (cx, cy);       m_End = new Point (cx + length, cy);       m_Angle = angle;     }     protected Point m_End;     protected Point m_Start;     protected int m_Angle;     override protected void Draw (PaintEventArgs e)     {       Point ptStart = new Point (m_Start.X, m_Start.Y);       Point [] ptEnd = new Point[1] {new Point (m_End.X, m_End.Y)};       Rotate (m_Angle, ptStart, ptEnd);       e.Graphics.DrawLine (pen, ptStart, ptEnd[0]);     }   }   public class clsCircle : clsPoint   {     protected clsCircle () { }     public clsCircle (int cx, int cy, int radius)     {       m_cx = cx;       m_cy = cy;       m_Radius = radius;     }     protected int m_Radius;     override protected void Draw (PaintEventArgs e)     {       e.Graphics.DrawEllipse (pen, m_cx - m_Radius, m_cy - m_Radius, 2 * m_Radius, 2 * m_Radius);       DrawCenter (e);     }     public void DrawCenter (PaintEventArgs e)     {       base.Draw (e);     }   }   /// <summary>   /// Draws an ellipse using Bezier points   /// </summary>   public class clsEllipse : clsCircle, IDisposable   {     protected clsEllipse () { }     public void Dispose ()     {     }     public clsEllipse (int cx, int cy, int horiz, int vert, int rotate)     {       m_cx = cx;       m_cy = cy;       m_Radius = horiz;       m_Vert = vert;       m_Rotate = rotate;     }     protected double m_Eccentric;     protected int m_Vert;     protected int m_Rotate;         /// <summary>         /// Overridden from the clsCircle class         /// </summary>         /// <param name="e"></param>     override protected void Draw (PaintEventArgs e)     {       int OffsetX = (int) (2 * m_Radius * (2 * (Math.Sqrt(2) - 1) / 3) + 0.5);       int OffsetY = (int) (2 * m_Vert * (2 * (Math.Sqrt(2) - 1) / 3) + 0.5);       Point [] ptEllipse = new Point [13]           {           new Point (m_cx + m_Radius, m_cy),           new Point (m_cx + m_Radius, m_cy - OffsetY),           new Point (m_cx + OffsetX,  m_cy - m_Vert),           new Point (m_cx,            m_cy - m_Vert),           new Point (m_cx - OffsetX,  m_cy - m_Vert),           new Point (m_cx - m_Radius, m_cy - OffsetY),           new Point (m_cx - m_Radius, m_cy),           new Point (m_cx - m_Radius, m_cy + OffsetY),           new Point (m_cx - OffsetX,  m_cy + m_Vert),           new Point (m_cx,            m_cy + m_Vert),           new Point (m_cx + OffsetX,  m_cy + m_Vert),           new Point (m_cx + m_Radius, m_cy + OffsetY),           new Point (m_cx + m_Radius, m_cy)           };       Point ptCenter = new Point (m_cx, m_cy);       Rotate (m_Rotate, ptCenter, ptEllipse);       e.Graphics.DrawBeziers (pen, ptEllipse);       base.DrawCenter (e);     }   } }