C#绘制实时曲线图的方法详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C#绘制实时曲线图的⽅法详解
在终端机器上的曲线显⽰本打算⽤控件,可控件折腾好长时间也没弄顺,还是⾃⼰写的好使,记录下来后⾯再改进。
//绘图部分的定义
Int32 Draw_Top;//绘画Y起点
Int32 Draw_Left;//绘画X起点
Int32 Draw_EdgeWidth;//X边缘宽度
Int32 Draw_EdgeHeight;//Y边缘⾼度
Int32 Draw_RangeWidth;//绘画范围宽度
Int32 Draw_RangeHeight;//绘画范围⾼度
Double[] XTDYData = new Double[21];
Int32 ICountDraw=0;
Int32 IActualWidth, IActualHeight;
Int32 Draw_AdjustX = 20;
Int32 Draw_AdjustY = 20;
Point StartPoint = new Point();
Point EndPoint = new Point();
Point ZeroPoint = new Point();
Int32 IScalesY = 11;
Int32 IScalesX = 21;
Int32 IIncrementX;
Pen pSpecial = new Pen(Color.Black,1);
Pen pCommon = new Pen(Color.Black,2);
Font FontTitle = new Font("微软雅⿊", 12);//写标题的字体
Font FontText = new Font("微软雅⿊", 9);//写正⽂的字体
SolidBrush SBTitle = new SolidBrush(Color.Red);
SolidBrush SBText = new SolidBrush(Color.Black);
在数据接收的事件中进⾏曲线绘制:
//显⽰趋势图
ICountDraw = ICountDraw + 1;
if (ICountDraw ==21)
{
for (int i=1;i<21;i++)
{
XTDYData[i - 1] = XTDYData[i];
}
XTDYData[20]= YBDWDealWithData.TYNDianYa.dValue;
ICountDraw = 20;
}
else
{
XTDYData[ICountDraw] = YBDWDealWithData.TYNDianYa.dValue;
}
FuncDrawYBDW();
下⾯是基础函数:
public void FuncDrawYBDW() {
Bitmap bmp = new Bitmap(Draw_RangeWidth, Draw_RangeHeight);//定义画布的⼤⼩
Graphics graphics = Graphics.FromImage(bmp);
FuncDrawBasePic(ref graphics);
FuncDrawDynamicPic(ref graphics);
Graphics g = Graphics.FromHwnd(pictureBox1.Handle);
g.DrawImage(bmp, new Point(0, 0));//在内存中画完后显⽰在pictureBox1上,避免闪烁
}
public void FuncDrawBasePic(ref Graphics YBDWCanvas)
{
//绘制基础
//画⼀个⽅框
YBDWCanvas.FillRectangle(Brushes.WhiteSmoke, Draw_Top, Draw_Left, Draw_RangeWidth, Draw_RangeHeight);
//画坐标轴X
pCommon.Width = 2;
pCommon.Color = Color.Black;
StartPoint.X = Draw_Left + Draw_AdjustX;
StartPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
EndPoint.X = Draw_Left + Draw_RangeWidth - Draw_AdjustX * 2;
EndPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
IActualWidth = EndPoint.X - StartPoint.X;
YBDWCanvas.DrawString("X", FontText, SBText, EndPoint.X, EndPoint.Y - 8);
//画箭头
StartPoint.X = EndPoint.X - 8;
StartPoint.Y = EndPoint.Y - 4;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
StartPoint.X = EndPoint.X - 8;
StartPoint.Y = EndPoint.Y + 4;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
//画坐标轴Y
pCommon.Width = 2;
pCommon.Color = Color.Black;
StartPoint.X = Draw_Left + Draw_AdjustX;
StartPoint.Y = Draw_Top + Draw_AdjustY;
EndPoint.X = Draw_Left + Draw_AdjustX;
EndPoint.Y = Draw_Top + Draw_RangeHeight - Draw_AdjustY * 2;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
IActualHeight = EndPoint.Y - StartPoint.Y;
ZeroPoint = EndPoint;
//画画箭头
EndPoint.X = StartPoint.X - 4;
EndPoint.Y = StartPoint.Y + 8;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
EndPoint.X = StartPoint.X + 4;
EndPoint.Y = StartPoint.Y + 8;
YBDWCanvas.DrawLine(pCommon, StartPoint, EndPoint);
YBDWCanvas.DrawString("Y", FontText, SBText, EndPoint.X, EndPoint.Y - 8);
//画X刻度
pSpecial.Width = 1;
pSpecial.DashStyle = DashStyle.Custom;
pSpecial.DashPattern = new float[] { 1f, 1f };
IIncrementX = IActualWidth / IScalesX;
for (int i = 1; i < IScalesX; i = i + 1)
{
StartPoint.X = ZeroPoint.X + IIncrementX * i;
StartPoint.Y = ZeroPoint.Y - 2;
EndPoint.X = StartPoint.X;
EndPoint.Y = StartPoint.Y - IActualHeight - 2;
YBDWCanvas.DrawLine(pSpecial, StartPoint, EndPoint);
//写标识字
if (i % 2 == 0)
{
YBDWCanvas.DrawString(i.ToString(), FontText, SBText, StartPoint.X - 6, StartPoint.Y + 4);
}
}
//画Y刻度
Int32 IIncrementY = IActualHeight / IScalesY;
for (int i = 1; i < IScalesY; i = i + 1)
{
StartPoint.X = ZeroPoint.X;
StartPoint.Y = ZeroPoint.Y - IIncrementY * i;
EndPoint.X = StartPoint.X + IActualWidth;
EndPoint.Y = StartPoint.Y;
YBDWCanvas.DrawLine(pSpecial, StartPoint, EndPoint);
//写标识字
if (i % 2 == 0)
{
YBDWCanvas.DrawString((i - 1).ToString(), FontText, SBText, StartPoint.X - 12, StartPoint.Y + 4);
}
}
//写标题
//Rectangle YBDWMessRect = new Rectangle(SX, SY, MessageDotRadius * 2, MessageDotRadius * 2);//圆的⼤⼩ //YBDWCanvas.FillEllipse(SBTitle, YBDWMessRect);
//画连接线
YBDWCanvas.DrawString(SDrawTitle, FontTitle, SBTitle, 100,30);
}
public void FuncDrawDynamicPic(ref Graphics YBDWCanvas)
{
//准备实际画线的数据
Point[] XTDYPoints =new Point[21];//系统电压数据
for (int i = 0; i < IScalesX; i = i + 1)
{
XTDYPoints[i].X = ZeroPoint.X + IIncrementX * i;
XTDYPoints[i].Y = ZeroPoint.Y - (int)((XTDYData[i]/IActualHeight)*6000);
}
pSpecial.Width = 3;
pSpecial.Color = Color.Red;
YBDWCanvas.DrawCurve(pSpecial, XTDYPoints, 3.0F);
}
实际效果图:
点选不同的⽂字进⾏相应的实时动态图的显⽰。
以上就是C#绘制实时曲线图的⽅法详解的详细内容,更多关于C#实时曲线图的资料请关注其它相关⽂章!。