怎么在C#项目中利用GDI绘制一个雷达图
这期内容当中小编将会给大家带来有关怎么在C#项目中利用GDI绘制一个雷达图,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
代码如下:
publicstaticclassRadarDemo { staticfloatmW=1200; staticfloatmH=1200; staticDictionary<string,float>mData=newDictionary<string,float> { //{"速度",77}, {"力量",72}, {"防守",110}, {"射门",50}, {"传球",80}, {"耐力",60} };//维度数据 staticfloatmCount=mData.Count;//边数 staticfloatmCenter=mW*0.5f;//中心点 staticfloatmRadius=mCenter-100;//半径(减去的值用于给绘制的文本留空间) staticdoublemAngle=(Math.PI*2)/mCount;//角度 staticGraphicsgraphics=null; staticintmPointRadius=5;//各个维度分值圆点的半径 staticinttextFontSize=18;//顶点文字大小px conststringtextFontFamily="MicrosoftYahei";//顶点字体 staticColorlineColor=Color.Green; staticColorfillColor=Color.FromArgb(128,255,0,0); staticColorfontColor=Color.Black; publicstaticvoidShow() { Bitmapimg=newBitmap((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(); } //绘制多边形边 privatestaticvoidDrawPolygon(Graphicsctx) { varr=mRadius/mCount;//单位半径 Penpen=newPen(lineColor); //画6个圈 for(vari=0;i<mCount;i++) { varpoints=newList<PointF>(); varcurrR=r*(i+1);//当前半径 //画6条边 for(varj=0;j<mCount;j++) { varx=(float)(mCenter+currR*Math.Cos(mAngle*j)); vary=(float)(mCenter+currR*Math.Sin(mAngle*j)); points.Add(newPointF{X=x,Y=y}); } ctx.DrawPolygon(pen,points.ToArray()); //break; } ctx.Save(); } //顶点连线 privatestaticvoidDrawLines(Graphicsctx) { for(vari=0;i<mCount;i++) { varx=(float)(mCenter+mRadius*Math.Cos(mAngle*i)); vary=(float)(mCenter+mRadius*Math.Sin(mAngle*i)); ctx.DrawLine(newPen(lineColor),newPointF{X=mCenter,Y=mCenter},newPointF{X=x,Y=y}); //break; } ctx.Save(); } //绘制文本 privatestaticvoidDrawText(Graphicsctx) { varfontSize=textFontSize;//mCenter/12; Fontfont=newFont(textFontFamily,fontSize,FontStyle.Regular); inti=0; foreach(variteminmData) { varx=(float)(mCenter+mRadius*Math.Cos(mAngle*i)); vary=(float)(mCenter+mRadius*Math.Sin(mAngle*i)-fontSize); if(mAngle*i>0&&mAngle*i<=Math.PI/2) { ctx.DrawString(item.Key,font,newSolidBrush(fontColor),x-ctx.MeasureString(item.Key,font).Width*0.5f,y+fontSize/*y+fontSize*/); } elseif(mAngle*i>Math.PI/2&&mAngle*i<=Math.PI) { ctx.DrawString(item.Key,font,newSolidBrush(fontColor),x-ctx.MeasureString(item.Key,font).Width,y/*y+fontSize*/); } elseif(mAngle*i>Math.PI&&mAngle*i<=Math.PI*3/2) { ctx.DrawString(item.Key,font,newSolidBrush(fontColor),x-ctx.MeasureString(item.Key,font).Width,y); } elseif(mAngle*i>Math.PI*3/2) { ctx.DrawString(item.Key,font,newSolidBrush(fontColor),x-ctx.MeasureString(item.Key,font).Width*0.5f,y-fontSize*0.5f); } else { ctx.DrawString(item.Key,font,newSolidBrush(fontColor),x,y/*y+fontSize*/); } i++; } ctx.Save(); } //绘制数据区域 privatestaticvoidDrawRegion(Graphicsctx) { inti=0; List<PointF>points=newList<PointF>(); foreach(variteminmData) { varx=(float)(mCenter+mRadius*Math.Cos(mAngle*i)*item.Value/100); vary=(float)(mCenter+mRadius*Math.Sin(mAngle*i)*item.Value/100); points.Add(newPointF{X=x,Y=y}); //ctx.DrawArc(newPen(lineColor),x,y,r,r,0,(float)Math.PI*2); i++; } //GraphicsPathpath=newGraphicsPath(); //path.AddLines(points.ToArray()); ctx.FillPolygon(newSolidBrush(fillColor),points.ToArray()); ctx.Save(); } //画点 privatestaticvoidDrawCircle(Graphicsctx) { //varr=mCenter/18; varr=mPointRadius; inti=0; foreach(variteminmData) { varx=(float)(mCenter+mRadius*Math.Cos(mAngle*i)*item.Value/100); vary=(float)(mCenter+mRadius*Math.Sin(mAngle*i)*item.Value/100); ctx.FillPie(newSolidBrush(fillColor),x-r,y-r,r*2,r*2,0,360); //ctx.DrawArc(newPen(lineColor),x,y,r,r,0,(float)Math.PI*2); i++; } ctx.Save(); } }
上述就是小编为大家分享的怎么在C#项目中利用GDI绘制一个雷达图了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
在Python中,将K添加到列元组列表中的最小元素
处理数据集涉及识别特定列中的最小值并通过添加常量值(K)来更新它。通过实施优化的解决方案,我们可以有效地执行此操作,这对于数据...
-
使用switch case语句编写的C程序,用于计算几何图形的面积
#includevoidmain(){intfig_code;floatside,base,length,...
-
如何使 C# 代码可重用?
要在C#中使代码可重用,请使用接口。接口定义属性、方法和事件,这些成员是接口的成员。接口只包含成员的声明。派生类负责定义成员。这通...
-
C# 中的覆盖和隐藏有什么区别?
方法隐藏在C#中也称为隐藏。父类的方法可供子类使用,无需在遮蔽中使用override关键字。子类有其自己版本的相同函数。在...
-
在Java中使用示例双倍longValue()函数
Java是一种强大的面向对象语言,可以对各种数据类型进行高度的控制和精确度。其中一种功能是doublelongValue(),...
-
如何在Java中定义JSON字段名称的命名约定?
TheFieldNamingPolicycanbeusedtodefineafewstandardnaming...
-
Servlet中的HttpSession接口
在JavaWeb开发领域,了解HttpSession接口是创建动态和响应式Web应用程序的关键。在本文中,我们将探讨...
-
使用while循环查找自然数之和的Java程序
自然数之和可以使用编程语言中的不同迭代语句来计算。迭代语句是执行一组特定代码行直到循环语句中的条件失败的语句。在本文中,我们将讨论...
-
我们可以将Java数组转换为列表吗?
我们可以使用Arrays.asList()方法轻松地将Java数组转换为List。语法publicstaticLi...
-
Java中如何在不使用任何外部库的情况下读取网页内容?
TheURLclassofthejava.netpackagerepresentsaUniformResour...