xcnn_ 2024-03-11 10:55 采纳率: 66.7%
浏览 15

C# 计算机制图 鼠标画多边形并计算多边形面积

想要在C#的 picturebox 上面画多边形。用橡皮筋法画直线,直线连接成多边形,最后鼠标右键,弹出消息框,显示所有点连成的多边形的面积。代码怎么实现呢?可以给个solution嘛?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2024-03-11 11:15
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:

    在C#中,你可以使用WinForms的PictureBox控件和Windows消息处理来实现这个功能。下面是一个简单的实现方案,它包括以下几个步骤:

    1. 创建一个窗体应用程序,添加一个PictureBox控件和两个Button控件(一个用于清除图形,另一个用于退出)。
    2. 在PictureBox上处理鼠标事件,记录鼠标按下和移动时的坐标,以及鼠标释放时的事件。
    3. 使用Invalidate()方法重绘PictureBox以显示正在绘制的多边形。
    4. Paint事件中,使用Graphics对象绘制线条和多边形。
    5. 计算多边形的面积。

    这里是一个简化的代码示例:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public partial class MainForm : Form
    {
        private Point[] polygonPoints;
        private Point? currentPoint;
        private bool drawingPolygon = false;
    
        public MainForm()
        {
            InitializeComponent();
            pictureBox1.MouseDown += PictureBoxMouseDown;
            pictureBox1.MouseMove += PictureBoxMouseMove;
            pictureBox1.MouseUp += PictureBoxMouseUp;
            pictureBox1.Paint += PictureBoxPaint;
        }
    
        private void PictureBoxMouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                drawingPolygon = true;
                currentPoint = new Point(e.X, e.Y);
                if (polygonPoints == null)
                {
                    polygonPoints = new Point[4]; // 假设至少需要4个点来形成多边形
                }
                polygonPoints[0] = currentPoint.Value;
            }
        }
    
        private void PictureBoxMouseMove(object sender, MouseEventArgs e)
        {
            if (drawingPolygon && currentPoint.HasValue)
            {
                pictureBox1.Invalidate();
                currentPoint = new Point(e.X, e.Y);
                if (polygonPoints.Length > 1)
                {
                    DrawTemporaryLine(sender, e);
                }
            }
        }
    
        private void PictureBoxMouseUp(object sender, MouseEventArgs e)
        {
            if (drawingPolygon && currentPoint.HasValue)
            {
                drawingPolygon = false;
                polygonPoints[polygonPoints.Length - 1] = currentPoint.Value;
                if (polygonPoints.Length >= 3)
                {
                    CalculateAndDisplayArea();
                }
                currentPoint = null;
                pictureBox1.Invalidate();
            }
        }
    
        private void PictureBoxPaint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;
            Pen pen = new Pen(Color.Black, 2);
    
            if (polygonPoints != null && polygonPoints.Length > 1)
            {
                for (int i = 0; i < polygonPoints.Length - 1; i++)
                {
                    g.DrawLine(pen, polygonPoints[i], polygonPoints[i + 1]);
                }
                g.DrawLine(pen, polygonPoints[polygonPoints.Length - 1], polygonPoints[0]);
    
                if (currentPoint.HasValue)
                {
                    g.DrawLine(pen, polygonPoints[polygonPoints.Length - 1], currentPoint.Value);
                }
            }
        }
    
        private void DrawTemporaryLine(object sender, MouseEventArgs e)
        {
            PictureBox pictureBox = (PictureBox)sender;
            using (Graphics g = Graphics.FromImage(pictureBox.Image))
            {
                Pen tempPen = new Pen(Color.Red, 2);
                g.DrawLine(tempPen, polygonPoints[polygonPoints.Length - 1], currentPoint.Value);
            }
            pictureBox.Invalidate();
        }
    
        private void CalculateAndDisplayArea()
        {
            double area = 0.0;
            int n = polygonPoints.Length;
            for (int i = 0; i < n; i++)
            {
                int j = (i + 1) % n;
                area += (double)(polygonPoints[j].X - polygonPoints[i].X) * (polygonPoints[j].Y + polygonPoints[i].Y);
            }
            area = Math.Abs(area) / 2.0;
            MessageBox.Show($"多边形的面积为: {area:F2}");
        }
    }
    

    这个代码示例创建了一个多边形绘制的应用,当用户按下鼠标左键开始绘制,移动鼠标时显示临时线,松开鼠标左键时计算并显示多边形的面积。请注意,这个示例假设用户每次绘制都会开始一个新的多边形,没有提供清除已有多边形的功能。如果需要清除多边形,你可以添加一个Clear按钮,并在按钮的Click事件中将polygonPoints数组清空并重绘PictureBox。

    请根据你的实际需求调整和扩展这个示例。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月11日

悬赏问题

  • ¥15 verilog 非阻塞赋值下的移位拼接错误
  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话