C#.net GDI作曲线图

本文介绍了一种从MDB文件中读取数据并使用C#进行曲线图绘制的方法。通过初始化画布,设置坐标轴,绘制刻度和警戒线,最后将数据点以曲线形式呈现出来。适用于监测环境参数如温度、湿度和粉尘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
从MDB文件中读取数据做曲线图

public void initGDI()
{
//画图初始化
Bitmap bmap = new Bitmap(pcWendu.Width, pcWendu.Height);
Graphics gph = Graphics.FromImage(bmap);
gph.Clear(Color.White);

        PointF cpt = new PointF(40,390);//中心点
        PointF[] xpt = new PointF[3] { new PointF(pcWendu.Width, cpt.Y), new PointF(pcWendu.Width - 15, cpt.Y - 8), new PointF(pcWendu.Width - 15, cpt.Y + 8) };//x轴三角形
        PointF[] ypt = new PointF[3] { new PointF(cpt.X, cpt.X - 25), new PointF(cpt.X - 8, cpt.X - 10), new PointF(cpt.X + 8, cpt.X - 10) };//y轴三角形
        //画x轴
        gph.DrawLine(Pens.Black, cpt.X, cpt.Y, pcWendu.Width - 10, cpt.Y);
        gph.DrawPolygon(Pens.Black, xpt);
        gph.FillPolygon(new SolidBrush(Color.Black), xpt);
        gph.DrawString("时间", new Font("宋体", 10), Brushes.Black, new PointF(pcWendu.Width - 35, cpt.Y + 10));
        //画y轴
        gph.DrawLine(Pens.Black, cpt.X, cpt.Y, cpt.X, cpt.X - 10);
        gph.DrawPolygon(Pens.Black, ypt);
        gph.FillPolygon(new SolidBrush(Color.Black), ypt);
        IOValue("0", cBSelect.Text, out string KuBunn);
        gph.DrawString(KuBunn, new Font("宋体", 10), Brushes.Black, new PointF(0, 7));

        //画x轴坐标
        float[] LactionZhD = new float[24]; //00:00
        float[] LactionBD = new float[24]; //30:00
        for (int i = 0; i < 24; i++)
        {
            gph.DrawString((i + 1).ToString("00") + ":00", new Font("宋体", 8, FontStyle.Bold), Brushes.Black, new PointF(cpt.X + i * 46 + 18, cpt.Y + 20));
            gph.DrawLine(Pens.Gray, cpt.X + i * 46 + 37, cpt.Y, cpt.X + i * 46 + 37, cpt.X);
            LactionZhD[i] = cpt.X + i * 46 + 35;
        }
        for (int i = 0; i < 24; i++)
        {
            gph.DrawString(i.ToString("00") + ":30", new Font("宋体", 8, FontStyle.Bold), Brushes.Black, new PointF(cpt.X + i * 46 - 5, cpt.Y + 5));
            gph.DrawLine(Pens.Gray, cpt.X + i * 46 + 14, cpt.Y, cpt.X + i * 46 + 14, cpt.X);
            LactionBD[i] = cpt.X + i * 46 + 14;
        }
        int YJianju = 0;
        int Y = 0;
        int YShuzhi = 0;
        float YKedu = 0f;
        if (cBSelect.Text == "温度")
        {
            Y = 6; YJianju = 5; YShuzhi = 55; YKedu = 11;
        }
        if (cBSelect.Text == "湿度")
        {
            Y = 10; YJianju = 10; YShuzhi = 35; YKedu = 3.5f;
        }
        if (cBSelect.Text == "粉尘")
        {
            Y = 5; YJianju = 2500; YShuzhi = 86; YKedu = 0.0344f;
        }

        //画y轴刻度
        for (int i = 0; i <= Y; i = i + 1)
        {
            gph.DrawString((YJianju * i).ToString(), new Font("宋体", 9, FontStyle.Bold), Brushes.Black, new PointF(cpt.X - 35, cpt.Y - YShuzhi * (i) - 5));
            gph.DrawLine(Pens.Black, cpt.X - 3, cpt.Y - YShuzhi * i, cpt.X, cpt.Y - YShuzhi * i);
            if (i != 0)
            {
                gph.DrawLine(Pens.Gray, cpt.X, cpt.Y - YShuzhi * i, pcWendu.Width - 28, cpt.Y - YShuzhi * i);
            }
        }
        float[] ZhDlist;
        float[] BDlist;
        DataKaBu(datatime, cBSelect.Text, out ZhDlist, out BDlist);

        for (int i = 0; i < 24; i++)
        {
            if (ZhDlist[i].ToString() != "0")
            {
                gph.FillEllipse(new SolidBrush(Color.Black), LactionZhD[i], cpt.Y - ZhDlist[i] * YKedu, 3, 3); //画整点数值
                gph.DrawString(ZhDlist[i].ToString("0.0"), new Font("宋体", 7), Brushes.Black, new PointF(LactionZhD[i] - 6, cpt.Y - ZhDlist[i] * YKedu + 3));
            }
            if (BDlist[i].ToString() != "0")
            {
                gph.FillEllipse(new SolidBrush(Color.Black), LactionBD[i], cpt.Y - BDlist[i] * YKedu, 3, 3);//画半点数值
                gph.DrawString(BDlist[i].ToString("0.0"), new Font("宋体", 7), Brushes.Black, new PointF(LactionBD[i] - 6, cpt.Y - BDlist[i] * YKedu - 8));
            }
        }
        Pen Ypen = new Pen(Color.Blue, 2);
        for (int i = 0; i < 24; i++)
        {
            if (ZhDlist[i].ToString("0.0") != "0.0" & BDlist[i].ToString("0.0") != "0.0")
            {
                gph.DrawLine(Ypen, LactionBD[i], cpt.Y - BDlist[i] * YKedu, LactionZhD[i], cpt.Y - ZhDlist[i] * YKedu);
            }
        }
        for (int i = 0; i < 23; i++)
        {
            if (ZhDlist[i].ToString("0.0") != "0.0" && BDlist[i + 1].ToString("0.0") != "0.0")
            {
                gph.DrawLine(Ypen, LactionZhD[i], cpt.Y - ZhDlist[i] * YKedu, LactionBD[i + 1], cpt.Y - BDlist[i + 1] * YKedu);
            }
        }
        //画警戒线
        Pen p = new Pen(Color.Red, 4);
        if (cBSelect.Text == "温度")
        {
            gph.DrawLine(p, cpt.X, cpt.Y - float.Parse(AppPublic.P_wdMax) * YKedu, pcWendu.Width - 28, cpt.Y - float.Parse(AppPublic.P_wdMax) * YKedu);
            gph.DrawLine(p, cpt.X, cpt.Y - float.Parse(AppPublic.P_wdMin) * YKedu, pcWendu.Width - 28, cpt.Y - float.Parse(AppPublic.P_wdMin) * YKedu);
        }
        if (cBSelect.Text == "湿度")
        {
            gph.DrawLine(p, cpt.X, cpt.Y - float.Parse(AppPublic.P_sdMax) * YKedu, pcWendu.Width - 28, cpt.Y - float.Parse(AppPublic.P_sdMax) * YKedu);
            gph.DrawLine(p, cpt.X, cpt.Y - float.Parse(AppPublic.P_sdMin) * YKedu, pcWendu.Width - 28, cpt.Y - float.Parse(AppPublic.P_sdMin) * YKedu);
        }
        pcWendu.Image = bmap; //保存输出图片
    }

///
/// 获取00:00=>30:00 30:00=>00:00 平均值
///
///
private void DataKaBu(string idatatime, string icmboxVelue, out float[] ZhDlist, out float[] BDlist)
{
string KuBunn = “”;
IOValue(“1”, icmboxVelue, out KuBunn);
string pmFilename = Application.StartupPath + @"\Data\D-" + idatatime + “.MDB”;
ZhDlist = new float[24]; //30:00
BDlist = new float[24]; //00:00
if (System.IO.File.Exists(pmFilename) == false)
{
MessageBox.Show(idatatime + “.MDB文件不存在,请确认是否是稼働日”,"" , MessageBoxButtons.OK, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
dateTimePicker.Focus();
}else
{
MDBHelp mdbHelp = new MDBHelp(pmFilename);
mdbHelp.Open();
for (int i = 0; i < 24; i++)
{
DataTable DTbDian = mdbHelp.GetDataSet(“select sum(数字) as Ssum ,count(数字) as Ccount from (select right(時間,8) as T1,数字 from T_Monitor where 区分 = '” + KuBunn + “’) T where T.T1 between '” + i + “:00:00’ and '” + i + “:30:00’”);
if (DTbDian.Rows[0][“Ccount”].ToString() != “0”)
{
BDlist[i] = float.Parse(DTbDian.Rows[0][“Ssum”].ToString()) / float.Parse(DTbDian.Rows[0][“Ccount”].ToString());
}
else
{
BDlist[i] = float.Parse(“0.0”);
}
}
DataTable DTZhDian;
for (int i = 0; i < 24; i++)
{
if (i == 23)
{
DTZhDian = mdbHelp.GetDataSet(“select sum(数字) as Ssum ,count(数字) as Ccount from (select right(時間,8) as T1,数字 from T_Monitor where 区分 = '” + KuBunn + “’) T where T.T1 between '” + i + “:30:00’ and '” + i + “:59:59’”);
}
else
{
DTZhDian = mdbHelp.GetDataSet(“select sum(数字) as Ssum ,count(数字) as Ccount from (select right(時間,8) as T1,数字 from T_Monitor where 区分 = '” + KuBunn + “’) T where T.T1 between '” + i + “:30:00’ and '” + (i + 1) + “:00:00’”);
}

                if (DTZhDian.Rows[0]["Ccount"].ToString() != "0")
                {
                    ZhDlist[i] = float.Parse(DTZhDian.Rows[0]["Ssum"].ToString()) / float.Parse(DTZhDian.Rows[0]["Ccount"].ToString());
                }
                else
                {
                    ZhDlist[i] = float.Parse("0.0");
                }
            }
            mdbHelp.Close();
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值