日期:2014-05-17  浏览次数:20910 次

求教一个有关GDI+的问题,现在很困惑!

请问用C# GDI+如何实现该图形,用什么函数合理,实现思路是什么?万分感激!
GDI+ C# 图形

------解决方案--------------------
算法不是没有,比如秒钟指针那样只是计算秒针长度确定坐标在哪里开始画双圆就可以了,这里只跟你提示一下,应该不难的,有空来看你的代码,哈哈。
------解决方案--------------------
几个大圆不用说,直接就绘制填充,单个的内外两层的小圆也应该没问题,关键算法是计算小圆的位置.
1.最内层的6个小圆的坐标:x=R*sin(60/180*3.1415926),y=cos(60/180*3.1415926),角度分别是0,60,120,180,240,300.然后计算着六条线上可以绘制几个小圆.
2.由相邻的两个射线,(例如由中心开始的0度,60度),向内做等距线,距离是小圆的直径.由等距线的交点开始,计算新的小圆的位置.然后计算这两条等距线上可以绘制几个小圆
3.重复2.
综合以上:1.60度的平分线,在器上绘制相应的小圆,2 .两条60度平分线的等距线上绘制小圆.3.两条等距线再做等距线上绘制小圆.
------解决方案--------------------
写了一个函数,可以绘制出楼主问题中的同心圆,函数的实现方法和效率肯定不是很好的,只能参考参考。
void RenderEllipses(Graphics g, float x, float y, float radius, float angle, int layer);
函数:绘制同心圆
参数
g:绘图表面
x,y:绘制位置
radius:同心圆半径
angle:偏移角度(基于最内层同心圆)
layer:同心圆层数

public void RenderEllipses(Graphics g, float x, float y, float radius, float angle, int layer)
{
    for (int i = 1; i <= layer; i++)
    {
        float A = angle / i;
        int count = (int)Math.Floor(360 / A);
        for (int j = 0; j < count; j++)
        {
            float R = radius * i;
            float rx = (float)Math.Cos(A * Math.PI / 180 * j) * R + x;
            float ry = (float)Math.Sin(A * Math.PI / 180 * j) * R + y;

            RectangleF bound = new RectangleF(rx, ry, radius, radius);