想要在C#的 picturebox 上面画多边形。用橡皮筋法画直线,直线连接成多边形,最后鼠标右键,弹出消息框,显示所有点连成的多边形的面积。代码怎么实现呢?可以给个solution嘛?
3条回答 默认 最新
- 阿里嘎多学长 2024-03-11 11:15关注
以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
在C#中,你可以使用WinForms的PictureBox控件和Windows消息处理来实现这个功能。下面是一个简单的实现方案,它包括以下几个步骤:
- 创建一个窗体应用程序,添加一个PictureBox控件和两个Button控件(一个用于清除图形,另一个用于退出)。
- 在PictureBox上处理鼠标事件,记录鼠标按下和移动时的坐标,以及鼠标释放时的事件。
- 使用
Invalidate()
方法重绘PictureBox以显示正在绘制的多边形。 - 在
Paint
事件中,使用Graphics
对象绘制线条和多边形。 - 计算多边形的面积。
这里是一个简化的代码示例:
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。请根据你的实际需求调整和扩展这个示例。
解决 无用评论 打赏 举报
悬赏问题
- ¥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 爬虫技术找到网上看过房源客户的电话