请问如何在pictureBox中绘制如下图形?

wangtong2010 2014-02-19 09:30:49

整个绘图范围限制在一个圆内,红色与绿色的分界线是一段椭圆弧,绿色与蓝勾搭分界线也是一段椭圆弧。
...全文
554 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangtong2010 2014-02-23
  • 打赏
  • 举报
回复
以下是我的代码,绘制一个没问题,但绘制第二个就出问题了。
重复上面的操作,用更浅的蓝色填充更小的一块区域,发现第一次填充的颜色的中间部分被背景色修改掉了,这是我不希望的,我该怎么办?



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;
}
wangtong2010 2014-02-22
  • 打赏
  • 举报
回复
我所知道的语法就是。
Graphics g = e.Graphics;
g.FillPie();填充扇形
g.FillEllipse();填充椭圆
g.FillPolygon();填充多边形
g.FillRectangle();填充矩形
但是我感觉用以上这些方法不够用。谁能指点一下,感谢。不用考虑明暗,能实现象下这这张图就行。还有就是第一张图去掉明暗。
wangtong2010 2014-02-22
  • 打赏
  • 举报
回复
引用 5 楼 liuchaolin 的回复:
以上是3D成像支术,算法比较复杂,包括打灯,色彩的变化
我说不考虑明暗变化,只认为是一种颜色。
md5e 2014-02-21
  • 打赏
  • 举报
回复
以上是3D成像支术,算法比较复杂,包括打灯,色彩的变化
wangtong2010 2014-02-21
  • 打赏
  • 举报
回复
不好意思,我把问题再说清楚些。
在pictureBox的Paint事件中发生。
背景颜色不用管,明暗也不用管。就是一个球体上的图案如何绘制在一个二维平面上,球体上有各种颜色的彩带,有点象地球上的纬度线,上边一张图以一个倾斜的角度看这个球,不同的颜色的分界线变成了椭圆,但不是整个椭圆,只是一段椭圆弧,下边的图以与这些分界面重合的方向看球,所有的分界线都投影成了直线。
  • 打赏
  • 举报
回复
http://bbs.csdn.net/topics/390711618 大神给点指教吧!! 真心需求!!
gomoku 2014-02-19
  • 打赏
  • 举报
回复
一种比较简单的办法就是设置剪裁区域,画在该区域外的图形将被剪去,比如: 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); // 画红色部分 }
assky124 2014-02-19
  • 打赏
  • 举报
回复
先用PS画好,然后贴图.. 如果要绘制的话,用FillPath来绘制,基本就是数学问题了,计算起始结束角度,算圆心位置

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧