选择两个点来画一个圆圈

时间:2016-06-06 05:24:22

标签: c#

我正在使用visual studio c#windows窗体,我需要帮助才能使用鼠标点击绘制一个圆圈。第一次点击会给我圆圈的中心等于光标位置,第二次点击会给我一个点圆的边界等于光标的第二个位置,到点之间的距离将给我半径..现在我有半径和点..我可以画一个圆..代码不起作用,因为我无论我点击鼠标多少次

,都只能获得光标的一个位置
private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        int lastX = Cursor.Position.X;//the first click x cursor position
        int lastY = Cursor.Position.Y;//the first click y cursor  position,         

   //is there any way to reuse the Cursor.Position for different point ??
   int x = Cursor.Position.X;//the second click x cursor position
        int y = Cursor.Position.Y;//the second click y cursor  position
        Graphics g;
       double oradius=Math.Sqrt(((lastX-x)^2) +((lastY-y)^2));
        //double newy = Math.Sqrt(lastY);
       // int newxv = Convert.ToInt32(newx);
        int radius= Convert.ToInt32(oradius);
        g = this.CreateGraphics();

        Rectangle rectangle = new Rectangle();
        PaintEventArgs arg = new PaintEventArgs(g, rectangle);

        DrawCircle(arg, x, y,radius,radius);
    }


    private void DrawCircle(PaintEventArgs e, int x, int y, int width, int height)
    {
        System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red, 3);
        e.Graphics.DrawEllipse(pen, x - width / 2, y - height / 2, width, height);
    }
}

4 个答案:

答案 0 :(得分:2)

在开始计算之前,您还需要存储第一次点击。一种方法是创建一个类,它每隔一次传递它就会抛出一个事件x和y坐标如下:

public class CircleDrawer
{
    private int _firstX;
    private int _firstY;
    private int _secondX;
    private int _secondY;

    private bool _isSecondClick;

    private event EventHandler OnSecondClick;

    public void RegisterClick(int x, int y)
    {
           if(_isSecondClick)
           {
               _secondX = x;
               _secondY = y;
               if(OnSecondClick != null) 
                  OnSecondClick(this, null);
           }
           else
           {
               _firstX = x;
               _firstY = y;
               _isSecondClick = true;
           }    
    }
   }

然后,您可以在代码中简单地调用您的方法:

private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        int lastX = Cursor.Position.X;//the first click x cursor position
        int lastY = Cursor.Position.Y;//the first click y cursor  position, 

        _circleDrawer.RegisterClick(lastX, lastY);
    }

在你的建筑师中:

public MyForm()
{
   _circleDrawer = new CircleDrawer();
   _circleDrawer.OnSecondClick += DrawCircle();
}

public void DrawCircle()
{
   // Your drawing code
}

答案 1 :(得分:1)

您的lastXlastY是局部变量,您可以在MouseDown事件处理程序的开头初始化它们。它们应该是类级变量,应该在MouseDown事件处理程序的末尾填充 此外,您应该测试它们是否已经有值,并且只有它们有值然后绘制圆然后清除它们(以便下一个圆圈将拥有它自己的中心)。

以下是对代码的改进。注意我已经将using关键字与图形对象和笔一起使用 - 每次使用实现IDisposable接口的任何实例时都习惯使用它。

private void Form1_MouseDown(object sender, MouseEventArgs e)
{
    if (_lastPosition != Point.Empty)
    {
        var currentPosition = Cursor.Position;
        var oradius = Math.Sqrt(((_lastPosition.X - currentPosition.X) ^ 2) + ((_lastPosition.Y - currentPosition.Y) ^ 2));
        var radius = Convert.ToInt32(oradius);
        using (var g = this.CreateGraphics())
        {
            var arg = new PaintEventArgs(g, new Rectangle());
            DrawCircle(arg, currentPosition, radius, radius);
        }
        _lastPosition = Point.Empty;
    }
    else
    {
        _lastPosition = Cursor.Position;
    }

}


private void DrawCircle(PaintEventArgs e, Point position, int width, int height)
{
    using (var pen = new System.Drawing.Pen(System.Drawing.Color.Red, 3))
    {
        e.Graphics.DrawEllipse(pen, position.X - width / 2, position.Y - height / 2, width, height);
    }
}

注意:此代码可以进一步改进。

答案 2 :(得分:0)

这段代码有很多根本性的错误,这是一个完整的,有效的例子。

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Point clickCurrent = Point.Empty;
        private Point clickPrev = Point.Empty;

        private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            clickPrev = clickCurrent;
            clickCurrent = this.PointToClient(Cursor.Position);
            if (clickPrev == Point.Empty) return;    
            Graphics g;
            double oradius = Math.Sqrt((Math.Pow(clickPrev.X - clickCurrent.X, 2)) + (Math.Pow(clickPrev.Y - clickCurrent.Y, 2)));
            int radius = Convert.ToInt32(oradius);
            g = this.CreateGraphics();
            Rectangle rectangle = new Rectangle();
            PaintEventArgs arg = new PaintEventArgs(g, rectangle);
            DrawCircle(arg, clickPrev.X, clickPrev.Y, radius * 2, radius * 2);
            clickCurrent = Point.Empty;
        }


        private void DrawCircle(PaintEventArgs e, int x, int y, int width, int height)
        {
            System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red, 3);
            e.Graphics.DrawEllipse(pen, x - width / 2, y - height / 2, width, height);
        }
    }

答案 3 :(得分:0)

        private int _firstX;
        private int _firstY;
        private int _secondX;
        private int _secondY;

        private bool _isSecondClick;


    private void Form1_MouseDown(object sender, MouseEventArgs e)
    {
        if (_isSecondClick)
        {
            _secondX = Cursor.Position.X;
            _secondY = Cursor.Position.Y;
            var radious1 = Math.Pow(_firstX - _secondX, 2);
            var radious2 = Math.Pow(_firstY - _secondY, 2);

            var radious = Math.Sqrt(radious1 + radious2);
            Graphics g = this.CreateGraphics();

            Rectangle rectangle = new Rectangle();
            PaintEventArgs arg = new PaintEventArgs(g, rectangle);
            DrawCircle(arg, _secondX, _secondY, radious, radious);
        }
        else
        {
            _firstX = Cursor.Position.X;
            _firstY = Cursor.Position.Y;
            _isSecondClick = true;
        }    
    }

    private void DrawCircle(PaintEventArgs arg, int x, int y, double width, double height)
    {
        System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.Red, 3);
        var xL = Convert.ToInt32(x - width / 2);
        var yL = Convert.ToInt32(y - height / 2);
        var hL = Convert.ToInt32(height);
        var wL = Convert.ToInt32(width);
        arg.Graphics.DrawEllipse(pen, xL, yL, wL, hL);
    }