欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ZedGraph怎样在生成曲线时随机生成不一样的颜色

程序员文章站 2023-08-26 23:07:42
场景 在使用ZedGraph生成多条曲线时为了能区分曲线颜色,要求随机设置曲线颜色。 首先从System.Drawing.Color中获取所有颜色的对象的数组,然后将其顺序打乱随机排序,然后在生成曲线时从Color数组中取Color并赋值。 效果 注: 博客主页: https://blog.csdn ......

场景

在使用zedgraph生成多条曲线时为了能区分曲线颜色,要求随机设置曲线颜色。

首先从system.drawing.color中获取所有颜色的对象的数组,然后将其顺序打乱随机排序,然后在生成曲线时从color数组中取color并赋值。

效果

ZedGraph怎样在生成曲线时随机生成不一样的颜色

 

 

注:

博客主页:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

单纯生成曲线的代码

lineitem mycurve = mypane.addcurve(ylist[i].title, list, curvecolor, symboltype.none);

第一个参数:图例标题

第二个参数:坐标点的list

第三个参数:颜色color对象

第四个参数:曲线节点符号

所以在生成曲线时就要在第三个参数上进行修改

首先获取color的所有颜色对象

//用于存取取出的颜色对象 
list<color> colorlist = new list<color>(); 
//通过getmember获取所有的公共成员 
foreach (var item in typeof(color).getmembers()) 
      { 
       //只取属性且为属性中的已知color,剔除byte属性以及一些布尔属性等(a b g r isknowncolor name等) 
          if (item.membertype == system.reflection.membertypes.property && system.drawing.color.fromname

(item.name).isknowncolor == true) 
              { 
                  color color = system.drawing.color.fromname(item.name); 
                  colorlist.add(color); 
               } 
        } 
//转成数组 
color[] colors = colorlist.toarray();

 

然后将color数组的顺序进行打乱

colors = getdisrupteditems(colors);

 

调用乱序方法

private static color[] getdisrupteditems(color[] colors) 
        { 
            //生成一个新数组:用于在之上计算和返回 
            color[] temp; 
            temp = new color[colors.length]; 
            for (int i = 0; i < temp.length; i++) 
            { 
                temp[i] = colors[i]; 
            }

            //打乱数组中元素顺序 
            random rand = new random(datetime.now.millisecond); 
            for (int i = 0; i < temp.length; i++) 
            { 
                int x, y; color t; 
                x = rand.next(0, temp.length); 
                do 
                { 
                    y = rand.next(0, temp.length); 
                } while (y == x);

                t = temp[x]; 
                temp[x] = temp[y];
                temp[y] = t; 
            }

            return temp;

        }

 

然后在循环生成曲线时,循环条件为要生成的曲线数量与颜色数组的长度进行对比判断。

int index = 0;
//循环添加曲线
foreach(datatreenode node in global.instance.preparecomparedatainone)
      {
          
           list = setcurvetextinone(ylist[i].titlekey,record);
           //如果要生成的曲线数量 < 颜色数组长度 那么就从颜色数组中去按索引取
           color curvecolor = new color();
           if (global.instance.preparecomparedatainone.count < colors.length)
               {
                    curvecolor = colors[index];
                }
           //否则要生成的曲线数量 > 颜色数组长度
           else
                {
                    //当索引达到颜色数组的长度时 索引置0
                    if (index >= colors.length)
                       {
                           index = 0;
                        }
                    curvecolor = colors[index];
                }
            lineitem mycurve = mypane.addcurve(ylist[i].title, list, curvecolor, symboltype.none);
            index++;
 }

 

其中global.instance.preparecomparedatainone就是要生成的曲线的数据,其count就是要生成的曲线数量。