先用PS画好,然后贴图..如果要绘制的话,用FillPath来绘制,基本就是数学问题了,计算起始结束角度,算圆心位置
解决方案 »
- "winform"通过查询得到值怎么放入一个内存变量中
- 菜鸟DataGrid删除问题。。
- 可能是简单问题:WebClient中可否实现asp.net的Form身份验正?在线等待。
- 小问题,SQL里如何得到距离某个日期的天数?
- 文件流加密算法
- 如何用C#获取URL的HTML
- 贵求一个正则的算法,诸位高手哥哥帮帮忙。立刻给分
- 关于c#的小软件的安装程序制作问题
- 请教各位大哥,我下面的程序是 使 dataGrid1 显示数据,可是有错误啊~~!
- 在winform中嵌入Excel 报错:试图吊销一个未注册的拖放目标 (异常来自 HRESULT:0x80040100 (DRAGDROP_E_NOTREGISTERED))
- .net 2.0 连接SQLite数据库时,Unable to open the database file。
- C#怎么读取Xml的属性
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); // 画红色部分
}
在pictureBox的Paint事件中发生。
背景颜色不用管,明暗也不用管。就是一个球体上的图案如何绘制在一个二维平面上,球体上有各种颜色的彩带,有点象地球上的纬度线,上边一张图以一个倾斜的角度看这个球,不同的颜色的分界线变成了椭圆,但不是整个椭圆,只是一段椭圆弧,下边的图以与这些分界面重合的方向看球,所有的分界线都投影成了直线。
Graphics g = e.Graphics;
g.FillPie();填充扇形
g.FillEllipse();填充椭圆
g.FillPolygon();填充多边形
g.FillRectangle();填充矩形
但是我感觉用以上这些方法不够用。谁能指点一下,感谢。不用考虑明暗,能实现象下这这张图就行。还有就是第一张图去掉明暗。
重复上面的操作,用更浅的蓝色填充更小的一块区域,发现第一次填充的颜色的中间部分被背景色修改掉了,这是我不希望的,我该怎么办? 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;
}