Daniel Lip
Daniel Lip

Reputation: 11319

How do i draw a circle in the middle of a Form and how do i find the circle center?

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        int x1, x2, wid = 100;

        public Form1()
        {
            InitializeComponent();

            x1 = this.Width / 2 ;
            x2 = this.Height / 2 ;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {


            e.Graphics.DrawEllipse(Pens.Red, x1,x2, wid, wid);
        }
    }
}

I want to draw a simple circle in the middle of the form and then later on i want to draw lines coming out from the circle center. How can i do it ?

Upvotes: 3

Views: 21659

Answers (2)

yellow_nimbus
yellow_nimbus

Reputation: 343

If I understand you correctly, is this what you want to do?

        const int circleRadius = 150;
        const int circleDiameter = circleRadius * 2;

        const double angleOfLineInDegrees = 65;
        const double angleOfLineInRadians = (angleOfLineInDegrees / 180) * Math.PI;

        // Center of the form
        var cirleCenter = new PointF(((float)Width / 2), ((float)Height / 2));

        // Ellipses draw like a rectangle. 
        // So just start at the center 
        // subtract by the radius along x and y axis
        // make the width and height the diameter.
        e.Graphics.DrawEllipse(Pens.Black, cirleCenter.X - circleRadius, cirleCenter.Y - circleRadius, circleDiameter, circleDiameter);

        // This line is using trig to convert the angle into a usable vector
        var lineVector = new PointF((float)Math.Cos(angleOfLineInRadians) * circleRadius, (float)Math.Sin(angleOfLineInRadians) * circleRadius);

        var lineEndPoint = new PointF(cirleCenter.X + lineVector.X, cirleCenter.Y + lineVector.Y);

        // Draw the line starting at 
        e.Graphics.DrawLine(Pens.Blue, cirleCenter, lineEndPoint);

Upvotes: 4

Brad
Brad

Reputation: 12255

the properties this.Width and this.Height are the same as this.Bounds which describes itself as:

Gets or sets the size and location of the control including its non-client elements, on pixels, relative to the parent control

this means you'd need to adjust for the thickness of the borders and the title bar. Using this.ClientRectangle avoids that whole issue.

public partial class Form1 : Form
{
    int circleDiameter  = 100;

    public Form1()
    {
        InitializeComponent();
    }

     private void Form1_Paint(object sender, PaintEventArgs e)
    {

        Point CenterPoint = new Point()
        {
            X = this.ClientRectangle.Width/2,
            Y = this.ClientRectangle.Height/2
        };
        Point topLeft = new Point()
        {
            X=(this.ClientRectangle.Width - circleDiameter) / 2,
            Y=(this.ClientRectangle.Height - circleDiameter) / 2
        };
        Point topRight = new Point()
        {
            X=(this.ClientRectangle.Width + circleDiameter) / 2,
            Y=(this.ClientRectangle.Height - circleDiameter) / 2
        };
        Point bottomLeft = new Point()
        {
            X=(this.ClientRectangle.Width - circleDiameter) / 2,
            Y=(this.ClientRectangle.Height + circleDiameter) / 2
        };
        Point bottomRight = new Point()
        {
            X=(this.ClientRectangle.Width + circleDiameter) / 2,
            Y=(this.ClientRectangle.Height + circleDiameter) / 2
        };

         e.Graphics.DrawRectangle(Pens.Red, topLeft.X, topLeft.Y, circleDiameter, circleDiameter);
         e.Graphics.DrawLine(Pens.Red, CenterPoint, topLeft);
         e.Graphics.DrawLine(Pens.Red, CenterPoint, topRight);
         e.Graphics.DrawLine(Pens.Red, CenterPoint, bottomLeft);
         e.Graphics.DrawLine(Pens.Red, CenterPoint, bottomRight);
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        this.Invalidate();
    }

}

Upvotes: 5

Related Questions