繁体   English   中英

选择两个点画一个圆

[英]select two point to Draw a circle

我正在使用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);
    }
}

在开始进行计算之前,您还需要存储第一次点击。 执行此操作的一种方法是创建一个类,该类仅在您每次向其传递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
}

您的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);
    }
}

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

这段代码有很多根本上错误的地方,这是一个完整的,有效的示例。

    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);
        }
    }
        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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM