C#winform 绘图(直线、圆、虚线、矩形等等)总结

C#winform 绘图总结

1、绘图步骤(一)

首先准备一个画板:

如何创建画板?

如果是要对原图进行处理,比如旋转图片,添加文字等,可以直接通过原图片获得画板对象。

Image img = Image.FromFile(imgPath);
Graphics graphics = Graphics.FromImage(img);

如果是要画一个新的图,可以通过要保存的图片宽、高生成画板。

Bitmap bmp = new Bitmap(width, height);
Graphics graph = Graphics.FromImage(bmp);

创建一个画板主要有3种方式:

A: 在窗体或控件的Paint事件中直接引用Graphics对象
B: 利用窗体或某个控件的CreateGraphics方法
C: 从继承自图像的任何对象创建Graphics对象

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
        }

然后,我们要一支笔:

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
            Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
        }

绘画:

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics; //创建画板,这里的画板是由Form提供的.
            Pen p = new Pen(Color.Blue, 2);//定义了一个蓝色,宽度为的画笔
            g.DrawLine(p, 10, 10, 100, 100);//在画板上画直线,起始坐标为(10,10),终点坐标为(100,100)
            g.DrawRectangle(p, 10, 10, 100, 100);//在画板上画矩形,起始坐标为(10,10),宽为,高为
            g.DrawEllipse(p, 10, 10, 100, 100);//在画板上画椭圆,起始坐标为(10,10),外接矩形的宽为,高为
        }

2、 简单绘图的具体操作步骤(二)

1.首先我们来看下上面中我们使用过的Pen.
Pen的属性主要有: Color(颜色),DashCap(短划线终点形状),DashStyle(虚线样式),EndCap(线尾形状), StartCap(线头形状),Width(粗细)等.
我们可以用Pen 来画虚线,带箭头的直线等

Pen  p = new  Pen(Color.Blue, 5);//设置笔的粗细为,颜色为蓝色
Graphics  g = this.CreateGraphics();
//画虚线
p.DashStyle = DashStyle.Dot;//定义虚线的样式为点
g.DrawLine(p, 10, 10, 200, 10);
//自定义虚线
p.DashPattern = new  float[] { 2, 1 };//设置短划线和空白部分的数组
g.DrawLine(p, 10, 20, 200, 20);
//画箭头,只对不封闭曲线有用
p.DashStyle = DashStyle.Solid;//恢复实线
p.EndCap = LineCap.ArrowAnchor;//定义线尾的样式为箭头
g.DrawLine(p, 10, 30, 200, 30);
g.Dispose();
p.Dispose();

在这里插入图片描述
画笔属性
在这里插入图片描述

接下来我们来看下Brush的使用
作用:我们可以用画刷填充各种图形形状,如矩形、椭圆、扇形、多边形和封闭路径等,主要有几种不同类型的画刷:
•SolidBrush:画刷最简单的形式,用纯色进行绘制
•HatchBrush:类似于 SolidBrush,但是可以利用该类从大量预设的图案中选择绘制时要使用的图案,而不是纯色
•TextureBrush:使用纹理(如图像)进行绘制
•LinearGradientBrush:使用沿渐变混合的两种颜色进行绘制
•PathGradientBrush :基于编程者定义的唯一路径,使用复杂的混合色渐变进行绘制
我们这里只是简单介绍使用其中的几种:

Graphics g = this.CreateGraphics();
Rectangle rect = new Rectangle(10, 10, 50, 50);//定义矩形,参数为起点横纵坐标以及其长和宽
//单色填充
SolidBrush b1 = new SolidBrush(Color.Blue);//定义单色画刷         
g.FillRectangle(b1, rect);//填充这个矩形
//字符串
g.DrawString("字符串", new Font("宋体", 10), b1, new PointF(90, 10));
//用图片填充
TextureBrush b2 = new TextureBrush(Image.FromFile(@"e:\picture\1.jpg"));
rect.Location = new Point(10, 70);//更改这个矩形的起点坐标
rect.Width = 200;//更改这个矩形的宽来
rect.Height = 200;//更改这个矩形的高
g.FillRectangle(b2, rect);
//用渐变色填充
rect.Location = new Point(10, 290);
LinearGradientBrush b3 = new  LinearGradientBrush(rect, Color.Yellow , Color.Black , LinearGradientMode.Horizontal);
g.FillRectangle(b3, rect);

在这里插入图片描述

1.Brush是一个抽象类,不能被直接new实例化
2.它有5个派生类,分别实现不同类型的画刷
① SolideBrush:实心画刷(最简单)
② HatchBrush:带阴影线的画刷;
③ LinearGradientBrush 填充颜色线性渐变的画刷;
④ PathGradientBrush 填充颜色沿着路径渐变的画刷;
⑤ TextureBrush 使用图像进行填充的画刷
3.使用Brushes类
Brushes.Red,Brushes.Yellow;

坐标轴变换
在winform中的坐标轴和我们平时接触的平面直角坐标轴不同,winform中的坐标轴方向完全相反:
GDI+ 的坐标系
GDI+ 的坐标系是个二维坐标系,不过又有点不一样,它的原点是在左上角的。如下图:
在这里插入图片描述

接下来,我们来实际操作下,通过旋转坐标轴的方向来画出不同角度的图案,或通过更改坐标原点的位置来平衡坐标轴的位置.

Graphics g = this.CreateGraphics();
//单色填充
//SolidBrush b1 = new SolidBrush(Color.Blue);//定义单色画刷         
Pen p = new Pen(Color.Blue,1);
//转变坐标轴角度
for (int i = 0; i < 90; i++)
{
    g.RotateTransform(i);//每旋转一度就画一条线
    g.DrawLine(p, 0, 0, 100, 0);
    g.ResetTransform();//恢复坐标轴坐标
}
//平移坐标轴
g.TranslateTransform(100, 100);
g.DrawLine(p, 0, 0, 100, 0);
g.ResetTransform();
//先平移到指定坐标,然后进行度旋转
g.TranslateTransform(100,200);
for (int i = 0; i < 8; i++)
{
g.RotateTransform(45);
g.DrawLine(p, 0, 0, 100, 0);
}
g.Dispose();

在这里插入图片描述

画线条解释
DrawLine绘制一条连接由坐标对象指定的两个点的线条
DrawLines绘制一列连接一组Point结构的线段
DrawBezier绘制由四个Point结构定义的贝塞尔样条
DrawBeziers从Point结构的数组绘制一系列贝塞尔样条
DrawCurve绘制经过一组指定的Point结构的基数样条
画可填充线条解释
DrawEllipse绘制一个由一对坐标、宽度和高度指定的椭圆
DrawPath绘制GraphicsPath对象
DrawPie绘制一个扇形,该扇形由一个坐标对象,宽度和高度,以及两条射线所指定的椭圆指定
DrawPolygon绘制由一组Point结构定义的多边形
DrawRectangle绘制由坐标对。宽度和高度指定的矩形
DrawRectangles绘制一系列由Rectangle结构指定的矩形
DrawArc绘制一段弧线,它表示由一对坐标、宽高指定的椭圆部分
填充区域解释
FillEllipse填充边框所定义的椭圆内部,该边框由一对坐标、一个高度和一个宽度指定
FillPath填充GraphicsPath对象的内部
FillPie填充扇形内部
FillPolygon填充多边形内部
FillRectangle填充由一对坐标、一个宽度和一个高度指定的矩形内部
FillRectangles填充由Rectangle结构指定的一些列矩阵的内部
FillRegion填充Region对象的内部
画字符串、图画、图标解释
DrawString在指定位置并且用指定的Brush和Font对象绘制指定的文本字符串
DrawIcon在指定坐标处绘制由指定的Icon对象表示的图像
DrawImage在指定的位置并且按原始大小绘制指定的Image对象
其他解释
MeasureString(String, Font)测量用指定的 Font 绘制的指定字符串。
FromImage从指定的Image对象创建行的Graphics对象
Save保存此Graphics对象的当前状态,并且GraphicsState对象标识保存的状态
Clear清除整个绘图面并以指定背景色填充
Dispose释放由此Graphics对象使用的所有资源
  • 5
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个 C# WinForms 直线拟合示例程序,可以绘制数据点和拟合的直线: ```csharp using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Windows.Forms; namespace LinearRegressionExample { public partial class Form1 : Form { private List<double> xValues = new List<double>(); private List<double> yValues = new List<double>(); private double slope = 0; private double intercept = 0; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { // 初始化绘图控件 chart1.Series.Clear(); chart1.Series.Add("Data"); chart1.Series.Add("Line"); chart1.Series["Data"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Point; chart1.Series["Line"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; chart1.Series["Line"].Color = Color.Red; } private void btnAddData_Click(object sender, EventArgs e) { double x, y; if (!double.TryParse(txtX.Text, out x) || !double.TryParse(txtY.Text, out y)) { MessageBox.Show("Invalid input!"); return; } xValues.Add(x); yValues.Add(y); chart1.Series["Data"].Points.Add(new DataPoint(x, y)); } private void btnClearData_Click(object sender, EventArgs e) { xValues.Clear(); yValues.Clear(); chart1.Series["Data"].Points.Clear(); chart1.Series["Line"].Points.Clear(); } private void btnFitLine_Click(object sender, EventArgs e) { if (xValues.Count != yValues.Count || xValues.Count < 2) { MessageBox.Show("Invalid data!"); return; } // 计算平均值 double xAvg = xValues.Average(); double yAvg = yValues.Average(); // 求斜率和截距 slope = xValues.Zip(yValues, (x, y) => (x - xAvg) * (y - yAvg)).Sum() / xValues.Zip(xValues, (x1, x2) => (x1 - xAvg) * (x2 - xAvg)).Sum(); intercept = yAvg - slope * xAvg; // 绘制拟合直线 chart1.Series["Line"].Points.Clear(); chart1.Series["Line"].Points.Add(new DataPoint(xValues.Min(), slope * xValues.Min() + intercept)); chart1.Series["Line"].Points.Add(new DataPoint(xValues.Max(), slope * xValues.Max() + intercept)); } private void chart1_PostPaint(object sender, ChartPaintEventArgs e) { // 绘制斜率和截距 if (xValues.Count > 0 && yValues.Count > 0) { Graphics g = e.ChartGraphics.Graphics; g.DrawString($"y={slope:N2}x+{intercept:N2}", Font, Brushes.Black, new PointF(10, 10)); } } } } ``` 这个程序使用 `System.Windows.Forms.DataVisualization.Charting` 组件绘制图形,需要在项目中添加对该组件的引用。在窗体上放置一个 `Chart` 控件,以及一些按钮和文本框。用户可以在文本框中输入数据点,点击“Add Data”按钮添加到图表中;点击“Clear Data”按钮清除所有数据点;点击“Fit Line”按钮进行线性回归并绘制拟合的直线。拟合结果会显示在图表上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薪薪代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值