先用PS画好,然后贴图..如果要绘制的话,用FillPath来绘制,基本就是数学问题了,计算起始结束角度,算圆心位置

解决方案 »

  1.   

    一种比较简单的办法就是设置剪裁区域,画在该区域外的图形将被剪去,比如:
    protected override void OnPaint(PaintEventArgs e)
    {
        Rectangle box = this.ClientRectangle;
        box.Width = box.Height = Math.Min(box.Width, box.Height);    GraphicsPath circle = new GraphicsPath();
        circle.AddEllipse(box);
        e.Graphics.Clip = new Region(circle);  // 设置圆形的剪裁区域    e.Graphics.FillEllipse(Brushes.Blue, box);  // 画蓝色部分    box.Inflate(box.Width / 2, 0);
        box.Y += 30;
        e.Graphics.FillEllipse(Brushes.LawnGreen, box); // 画绿色部分    box.Y += 30;
        e.Graphics.FillEllipse(Brushes.Red, box);  // 画红色部分
    }
      

  2.   

      http://bbs.csdn.net/topics/390711618  大神给点指教吧!!   真心需求!!  
      

  3.   

    不好意思,我把问题再说清楚些。
    在pictureBox的Paint事件中发生。
    背景颜色不用管,明暗也不用管。就是一个球体上的图案如何绘制在一个二维平面上,球体上有各种颜色的彩带,有点象地球上的纬度线,上边一张图以一个倾斜的角度看这个球,不同的颜色的分界线变成了椭圆,但不是整个椭圆,只是一段椭圆弧,下边的图以与这些分界面重合的方向看球,所有的分界线都投影成了直线。
      

  4.   

    我所知道的语法就是。
    Graphics g = e.Graphics;
    g.FillPie();填充扇形
    g.FillEllipse();填充椭圆
    g.FillPolygon();填充多边形
    g.FillRectangle();填充矩形
    但是我感觉用以上这些方法不够用。谁能指点一下,感谢。不用考虑明暗,能实现象下这这张图就行。还有就是第一张图去掉明暗。
      

  5.   

    以下是我的代码,绘制一个没问题,但绘制第二个就出问题了。
    重复上面的操作,用更浅的蓝色填充更小的一块区域,发现第一次填充的颜色的中间部分被背景色修改掉了,这是我不希望的,我该怎么办?        private void pictureBox1_Paint(object sender, PaintEventArgs e)
            {
                float h, a, r;
                float[] dataP, dataR, dataE;
                h = 70;
                a = 40;
                r = 130;
                Graphics g = e.Graphics;
                g.TranslateTransform(140, 140);//坐标位于中心
                SolidBrush sb = new SolidBrush(Color.Blue);//背景为深蓝色
                Pen p = new Pen(Color.Black);
                g.DrawEllipse(p, -130, -130, 260, 260);//绘制一个大圆
                g.DrawLine(p, -135, 0, 135, 0);//绘制两条坐标线
                g.DrawLine(p, 0, -135, 0, 135);//绘制两条坐标线
                g.FillPie(sb, -r, -r, 2 * r, 2 * r, 180, 180);//用深蓝色填充上半圆
                dataP = this.Fill_Pie(r, h, a);
                sb.Color = Color.FromArgb(0, 192, 192);//前景为浅蓝色
                g.FillPie(sb, dataP[0], dataP[0], dataP[1], dataP[1], dataP[2], dataP[3]);
                dataR = this.Fill_Rectangle(r, h, a);//用浅蓝色填充一个扇形
                sb.Color = Color.Blue;//再次改为背景色
                g.FillRectangle(sb, dataR[0], dataR[1], dataR[2], dataR[3]);
                dataE = this.Fill_Ellipse(r, h, a);//用背景色填充一个矩形,去掉多余的部分
                sb.Color = Color.FromArgb(0, 192, 192);//再次改为前景色
                g.FillEllipse(sb, dataE[0], dataE[1], dataE[2], dataE[3]);//用前景色填充一个椭圆形            //重复上面的操作,用更浅的蓝色填充更小的一块区域,发现第一次填充的颜色被背景色修改掉了,这是我不希望的。            a = 30;
                dataP = this.Fill_Pie(r, h, a);
                sb.Color = Color.FromArgb(128, 255, 255);//前景为浅蓝色
                g.FillPie(sb, dataP[0], dataP[0], dataP[1], dataP[1], dataP[2], dataP[3]);
                dataR = this.Fill_Rectangle(r, h, a);//用浅蓝色填充一个扇形
                sb.Color = Color.Blue;//再次改为背景色
                g.FillRectangle(sb, dataR[0], dataR[1], dataR[2], dataR[3]);
                dataE = this.Fill_Ellipse(r, h, a);//用背景色填充一个矩形,去掉多余的部分
                sb.Color = Color.FromArgb(128, 255, 255);//再次改为前景色
                g.FillEllipse(sb, dataE[0], dataE[1], dataE[2], dataE[3]);//用前景色填充一个椭圆形
            }        private float[] Fill_Pie(float r, float h, float a)
            {
                float[] rtn = new float[4];
                rtn[0] = -r;
                rtn[1] = 2 * r;
                rtn[2] = (float)(270 - Math.Acos(Math.Cos(a * Math.PI / 180) / Math.Sin(h * Math.PI / 180)) * 180 / Math.PI);
                rtn[3] = (float)(2 * Math.Acos(Math.Cos(a * Math.PI / 180) / Math.Sin(h * Math.PI / 180)) * 180 / Math.PI);
                return rtn;
            }        private float[] Fill_Rectangle(float r, float h, float a)
            {
                float[] rtn = new float[4];
                rtn[0] = (float)(-r / Math.Sin(h * Math.PI / 180) * Math.Sqrt(Math.Sin(h * Math.PI / 180) * Math.Sin(h * Math.PI / 180) - Math.Cos(a * Math.PI / 180) * Math.Cos(a * Math.PI / 180)));
                rtn[1] = (float)(-r * Math.Cos(a * Math.PI / 180) / Math.Sin(h * Math.PI / 180));
                rtn[2] = -2 * rtn[0];
                rtn[3] = -rtn[1];
                return rtn;
            }        private float[] Fill_Ellipse(float r, float h, float a)
            {
                float[] rtn = new float[4];
                rtn[0] = (float)(-r * Math.Sin(a * Math.PI / 180));
                rtn[1] = (float)(-r * Math.Sin((h + a) * Math.PI / 180));
                rtn[2] = -2 * rtn[0];
                rtn[3] = (float)(r * (Math.Sin((h + a) * Math.PI / 180) - Math.Sin((h - a) * Math.PI / 180)));
                return rtn;
            }