首页 新闻 会员 周边

关于C#中画图的问题,用Graphics DrawLine 画基本的点再连到一起

0
悬赏园豆:60 [已解决问题] 解决于 2015-06-16 16:05

需求:画点描线(直线连接)

  C#,web页面,需在后置代码中编写

  数据库中有包含100个数(固定格式)的字符串

  循环截取出字符串中的100个数为Y轴,和X轴1-100组成100个点

  把这100个点按顺序用直线连到一块

不要插件,就用最基本的画,求详细代码

梦夜月的主页 梦夜月 | 初学一级 | 园豆:14
提问于:2015-06-15 16:11
< >
分享
最佳答案
1

用直线连吗?

收获园豆:55
浅草青晨 | 小虾三级 |园豆:904 | 2015-06-15 16:18

梦夜月 | 园豆:14 (初学一级) | 2015-06-15 16:18

@梦夜月: 字符串数据给下吧!

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-15 17:06

@浅草青晨: 随意的一组数就行,全是两位数(10-99之间的100个数)

梦夜月 | 园豆:14 (初学一级) | 2015-06-15 17:08

@梦夜月:        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {  
                Draw();
            }
        }     
        private void Draw()
        {
            int[] arr=new int[100];
            Random r = new Random();
            //数组初始化,用数据库里截取的字符串代替
            for(int i=0;i<100;i++)
            {
                arr[i] = -r.Next(10, 100);
            }
            Bitmap img = new Bitmap(400,200);//创建Bitmap对象 
            for(int i=0;i<400;i++)
                for(int j=0;j<200;j++)
                {
                    img.SetPixel(i, j, Color.Transparent);
                }
            Graphics g = Graphics.FromImage(img);//创建Graphics对象
            Pen Bp = new Pen(Color.Black); //定义画笔 
            Pen Rp = new Pen(Color.Red);//红色画笔 

            AdjustableArrowCap aacAdjustableArrowCap(4, 4);//定义箭头帽
            Rp.CustomStartCap = aac;  //开始端箭头帽 

            g.DrawLine(Rp, 20, 10, 20, 150);//坐标 
            g.DrawLine(Rp, 280, 150, 20, 150);//横坐标
            for(int i=0;i<99;i++ )
            {
                g.DrawLine(Bp, 20+i+1, 150+arr[i], 20+i+2, 150+arr[i+1]);//(20,150)是起点坐标
            }
            img.Save(Response.OutputStream, ImageFormat.Jpeg);
            //释放掉Graphics对象和位图所使用的内存空间
            g.Dispose();
            img.Dispose();
            //把输出结果发送到客户端
            Response.Flush();
        }

 

字符串你自己截取吧

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-15 17:54

@浅草青晨: 

而且在网页中测试,全是乱码

从数据库中取出的字符串是

20502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050

X轴1-99

能测试一个能通过的页面吗?谢谢啦

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 08:28

@梦夜月: 第二个框是刷背景色的,g.DrawLine是画坐标轴的,下面这个循环就是两点间画线的

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 08:40

@梦夜月: 

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 08:41

@浅草青晨: 你q多少  加q吧  1716707074

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 08:42

@梦夜月: ╮(╯▽╰)╭,上班不能用。。。。

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 08:44

@浅草青晨: 不要坐标系了,只要画的线,X轴间距大一些

完整代码(初学者,好多都不太懂)

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 08:45

@梦夜月: 你的x轴0-99是什么东西啊?

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 08:48

@浅草青晨: X轴就是自己定义的,和那从数据库中取出并解析后的100个数组成100个点

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 08:51

@梦夜月: 其实一样的啊,你只有稍微改一下就行了

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 15:46

@浅草青晨: 

这是选中之后的图形 感觉怪怪的,但还是出来的,非常感谢,

        int[] arr = new int[100];
        //从数据库中取出数据
        //这里直接用已知数据测试
        string GetData = "20502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050205020502050";

        for (int i = 0; i < 99; i++)
        {
            int rData = Convert.ToInt32(GetData.Substring(i+2, 2),16);
            //放到数组中
            arr[i] = rData;
        }
        Bitmap img = new Bitmap(300, 200);//创建Bitmap对象 
        //全部填充
        for (int i = 0; i < 300; i++)
            for (int j = 0; j < 200; j++)
            {
                img.SetPixel(i, j, Color.Transparent);
            }
        Graphics g = Graphics.FromImage(img);//创建Graphics对象
        Pen Bp = new Pen(Color.Black); //定义画笔 
        Pen Rp = new Pen(Color.Red);//红色画笔 

        AdjustableArrowCap aac;  //定义箭头帽    
        aac = new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4);
        Rp.CustomStartCap = aac;  //开始端箭头帽 
        //这里不需要显示坐标轴
        //g.DrawLine(Rp, 20, 20, 20, 180);//纵坐标 
        //g.DrawLine(Rp, 180, 180, 20, 180);//横坐标
        for (int i = 0; i < 99; i++)
        {
            g.DrawLine(Bp, 20 + i *2, 180 - arr[i], 20 + (i+1) *2, 180 - arr[i+1]);
        }
        img.Save(Response.OutputStream, ImageFormat.Jpeg);
        //释放掉Graphics对象和位图所使用的内存空间
        g.Dispose();
        img.Dispose();
        //把输出结果发送到客户端
        //Response.Flush();                

还有那个画点的地方,我查资料说是使用的笛卡尔坐标系,这里X轴没什么影响,但Y轴应该是用剩余的长度减去真实值,才会在坐标上显示的是真实值(说的可能有点tu),意思就是Y轴和正常坐标系的Y轴是相反的,我看你那里没做相关处理,也可能是我理解错了

不过还是很感激,作为初学者感慨需要学习的东西真是太多太多了

再次感谢

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 16:03

@梦夜月: 在数组初始化的时候,赋值是为负的。。。

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 17:07

@浅草青晨: 晓得了,是数组那里吧,我当初还以为是什么连字符呢

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 17:09

@浅草青晨: 你的代码在火狐浏览器里正常吗?我的怎么全是乱码,用IE(360IE兼容模式)大部分情况正常

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 17:19

@梦夜月: 我试了一下,火狐是不正常

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 17:20

@浅草青晨: 好吧,我还以为是我的设置问题呢

再次感谢

梦夜月 | 园豆:14 (初学一级) | 2015-06-16 17:21

@梦夜月: 在draw方法最开始加Response.ContentType = "image/jpeg";
            Response.Clear();代码,就可以了

浅草青晨 | 园豆:904 (小虾三级) | 2015-06-16 17:30
其他回答(1)
0

1,学会自己画线,

2,学会自己画x,y轴

3,学会自己提取100个数字

4,学会在x,y轴上画一个点

5,学会在x,y轴画第二个点,并且和第一个点连成直线

6,把100个点连起来。

请问这6步你愿意花心思去学吗?你真的愿意吗?

收获园豆:5
arg | 园豆:1047 (小虾三级) | 2015-06-16 12:47
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册