服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 使用GDI绘制雷达图的实例

C# 使用GDI绘制雷达图的实例

2022-08-10 10:48chenmsg C#

这篇文章主要介绍了C# 使用GDI绘制雷达图,本文通过一段实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

最近项目要用C#实现画一个雷达图,搜了搜网上竟然找不到C#画雷达图的解决方案,那么自己实现一个吧

实现效果如下图:

C# 使用GDI绘制雷达图的实例

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
public static class RadarDemo
  {
    static float mW = 1200;
    static float mH = 1200;
    static Dictionary<string, float> mData = new Dictionary<string, float>
    {
        //{ "速度",77},
        { "力量", 72},
        { "防守", 110},
        { "射门", 50},
        { "传球", 80},
        { "耐力", 60 }
    };//维度数据
    static float mCount = mData.Count; //边数
    static float mCenter = mW * 0.5f; //中心点
    static float mRadius = mCenter - 100; //半径(减去的值用于给绘制的文本留空间)
    static double mAngle = (Math.PI * 2) / mCount; //角度
    static Graphics graphics = null;
    static int mPointRadius = 5; // 各个维度分值圆点的半径 
    static int textFontSize = 18;  //顶点文字大小 px
    const string textFontFamily = "Microsoft Yahei"; //顶点字体
    static Color lineColor = Color.Green;
    static Color fillColor = Color.FromArgb(128, 255, 0, 0);
    static Color fontColor = Color.Black;
    public static void Show()
    {
      Bitmap img = new Bitmap((int)mW, (int)mH);
      graphics = Graphics.FromImage(img);
      graphics.Clear(Color.White);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/0.png", ImageFormat.Png);
      DrawPolygon(graphics);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/1.png", ImageFormat.Png);
      DrawLines(graphics);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/2.png", ImageFormat.Png);
      DrawText(graphics);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/3.png", ImageFormat.Png);
      DrawRegion(graphics);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/4.png", ImageFormat.Png);
      DrawCircle(graphics);
      img.Save($"{AppDomain.CurrentDomain.BaseDirectory}radar/5.png", ImageFormat.Png);
      img.Dispose();
      graphics.Dispose();
    }
    // 绘制多边形边
    private static void DrawPolygon(Graphics ctx)
    {
      var r = mRadius / mCount; //单位半径
      Pen pen = new Pen(lineColor);
      //画6个圈
      for (var i = 0; i < mCount; i++)
      {
        var points = new List<PointF>();
        var currR = r * (i + 1); //当前半径
        //画6条边
        for (var j = 0; j < mCount; j++)
        {
          var x = (float)(mCenter + currR * Math.Cos(mAngle * j));
          var y = (float)(mCenter + currR * Math.Sin(mAngle * j));
          points.Add(new PointF { X = x, Y = y });
        }
        ctx.DrawPolygon(pen, points.ToArray());
        //break;
      }
      ctx.Save();
    }
    //顶点连线
    private static void DrawLines(Graphics ctx)
    {
      for (var i = 0; i < mCount; i++)
      {
        var x = (float)(mCenter + mRadius * Math.Cos(mAngle * i));
        var y = (float)(mCenter + mRadius * Math.Sin(mAngle * i));
        ctx.DrawLine(new Pen(lineColor), new PointF { X = mCenter, Y = mCenter }, new PointF { X = x, Y = y });
        //break;
      }
      ctx.Save();
    }
    //绘制文本
    private static void DrawText(Graphics ctx)
    {
      var fontSize = textFontSize;//mCenter / 12;
      Font font = new Font(textFontFamily, fontSize, FontStyle.Regular);
      int i = 0;
      foreach (var item in mData)
      {
        var x = (float)(mCenter + mRadius * Math.Cos(mAngle * i));
        var y = (float)(mCenter + mRadius * Math.Sin(mAngle * i) - fontSize);
        if (mAngle * i > 0 && mAngle * i <= Math.PI / 2)
        {
          ctx.DrawString(item.Key, font, new SolidBrush(fontColor), x - ctx.MeasureString(item.Key, font).Width * 0.5f, y + fontSize/* y + fontSize*/);
        }
        else if (mAngle * i > Math.PI / 2 && mAngle * i <= Math.PI)
        {
          ctx.DrawString(item.Key, font, new SolidBrush(fontColor), x - ctx.MeasureString(item.Key, font).Width, y /*y + fontSize*/);
        }
        else if (mAngle * i > Math.PI && mAngle * i <= Math.PI * 3 / 2)
        {
          ctx.DrawString(item.Key, font, new SolidBrush(fontColor), x - ctx.MeasureString(item.Key, font).Width, y);
        }
        else if (mAngle * i > Math.PI * 3 / 2)
        {
          ctx.DrawString(item.Key, font, new SolidBrush(fontColor), x - ctx.MeasureString(item.Key, font).Width * 0.5f, y - fontSize * 0.5f);
        }
        else
        {
          ctx.DrawString(item.Key, font, new SolidBrush(fontColor), x, y /* y + fontSize*/);
        }
        i++;
      }
      ctx.Save();
    }
    //绘制数据区域
    private static void DrawRegion(Graphics ctx)
    {
      int i = 0;
      List<PointF> points = new List<PointF>();
      foreach (var item in mData)
      {
        var x = (float)(mCenter + mRadius * Math.Cos(mAngle * i) * item.Value / 100);
        var y = (float)(mCenter + mRadius * Math.Sin(mAngle * i) * item.Value / 100);
        points.Add(new PointF { X = x, Y = y });
        //ctx.DrawArc(new Pen(lineColor), x, y, r, r, 0, (float)Math.PI * 2);
        i++;
      }
      //GraphicsPath path = new GraphicsPath();
      //path.AddLines(points.ToArray());
      ctx.FillPolygon(new SolidBrush(fillColor), points.ToArray());
      ctx.Save();
    }
    //画点
    private static void DrawCircle(Graphics ctx)
    {
      //var r = mCenter / 18;
      var r = mPointRadius;
      int i = 0;
      foreach (var item in mData)
      {
        var x = (float)(mCenter + mRadius * Math.Cos(mAngle * i) * item.Value / 100);
        var y = (float)(mCenter + mRadius * Math.Sin(mAngle * i) * item.Value / 100);
        ctx.FillPie(new SolidBrush(fillColor), x - r, y - r, r * 2, r * 2, 0, 360);
        //ctx.DrawArc(new Pen(lineColor), x, y, r, r, 0, (float)Math.PI * 2);
        i++;
      }
      ctx.Save();
    }
  }

把这个类粘贴到你的项目中,执行RadarDemo.Show();就会在你的根目录里生成雷达图了,为了方便理解怎么画出来的,我把画每一个步骤时的图片都保存下来了。可以自行运行查看

总结

以上所述是小编给大家介绍的C# 使用GDI绘制雷达图的实例,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://www.cnblogs.com/chenmsg/archive/2019/11/22/11910154.html

延伸 · 阅读

精彩推荐
  • C#C#无损高质量压缩图片实现代码

    C#无损高质量压缩图片实现代码

    这篇文章主要为大家详细介绍了C#无损高质量压缩图片的实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    眾尋12242022-01-05
  • C#C#中static void Main(string[] args) 参数示例详解

    C#中static void Main(string[] args) 参数示例详解

    这篇文章主要介绍了C#中static void Main(string[] args) 参数详解,本文通过具体示例给大家介绍的非常详细,需要的朋友可以参考下...

    SavionZhang9452021-12-29
  • C#讲解C#面相对象编程中的类与对象的特性与概念

    讲解C#面相对象编程中的类与对象的特性与概念

    这篇文章主要介绍了C#面相对象编程中的类与对象的特性与概念,OOP面向对象语言相对C语言这样面相过程的语言来说具有类和对象以及方法这样的特性,需要...

    C#教程网10472021-11-09
  • C#C#实现上传下载图片

    C#实现上传下载图片

    这篇文章主要为大家详细介绍了C#实现上传下载图片功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    ClearLoveQ4822022-02-27
  • C#C# 重写ComboBox实现下拉任意组件的方法

    C# 重写ComboBox实现下拉任意组件的方法

    C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉。这篇文章主要介绍...

    C#教程网7052021-12-08
  • C#c#在程序中定义和使用自定义事件方法总结

    c#在程序中定义和使用自定义事件方法总结

    在本篇文章中小编给大家整理了关于c#在程序中定义和使用自定义事件方法总结相关知识点,需要的朋友们学习下。...

    C#教程网4282022-07-11
  • C#C#编程简单实现生成PDF文档的方法示例

    C#编程简单实现生成PDF文档的方法示例

    这篇文章主要介绍了C#编程简单实现生成PDF文档的方法,结合实例形式分析了C#生成PDF文档的具体步骤与相关实现技巧,需要的朋友可以参考下...

    a7719485245882022-01-12
  • C#C#使用Aspose.Cells创建和读取Excel文件

    C#使用Aspose.Cells创建和读取Excel文件

    这篇文章主要为大家详细介绍了C#使用Aspose.Cells创建和读取Excel文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    在代码的世界里游走11012022-03-02