怎样用c#画正多边形,求代码。。。。
5个回答
展开全部
比如你要把多边形画在一个Form窗体上,重写该窗体OnPaint函数,调用我给出的DrawRegularPoly函数即可。
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 示例为画一个圆心点在200,200处,半径为100的正7边形
DrawRegularPoly(e.Graphics, new Point(200, 200), 100, 7);
}
/// <summary>
/// 使用外切圆的方法绘制一个正多边形
/// </summary>
/// <param name="stage">要绘制图形的设备</param>
/// <param name="center">正多边形外切圆的圆心</param>
/// <param name="radius">正多边形外切圆的半径</param>
/// <param name="sideCount">正多边形的边数</param>
private void DrawRegularPoly(Graphics stage, Point center, int radius, int sideCount)
{
// 多边形至少要有3条边,边数不达标就返回。
if (sideCount < 3) return;
// 每条边对应的圆心角角度,精确为浮点数。使用弧度制,360度角为2派
double arc = 2 * Math.PI / sideCount;
// 为多边形创建所有的顶点列表
var pointList = new List<Point>();
for (int i = 0; i < sideCount; i++)
{
var curArc = arc * i; // 当前点对应的圆心角角度
var pt = new Point();
// 就是简单的三角函数正余弦根据圆心角和半径算点坐标。这里都取整就行
pt.X = center.X + (int)(radius * Math.Cos(curArc));
pt.Y = center.Y + (int)(radius * Math.Sin(curArc));
pointList.Add(pt);
}
// 在给出的场景中用黑笔把这个多边形画出来
stage.DrawPolygon(Pens.Black, pointList.ToArray());
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
// 示例为画一个圆心点在200,200处,半径为100的正7边形
DrawRegularPoly(e.Graphics, new Point(200, 200), 100, 7);
}
/// <summary>
/// 使用外切圆的方法绘制一个正多边形
/// </summary>
/// <param name="stage">要绘制图形的设备</param>
/// <param name="center">正多边形外切圆的圆心</param>
/// <param name="radius">正多边形外切圆的半径</param>
/// <param name="sideCount">正多边形的边数</param>
private void DrawRegularPoly(Graphics stage, Point center, int radius, int sideCount)
{
// 多边形至少要有3条边,边数不达标就返回。
if (sideCount < 3) return;
// 每条边对应的圆心角角度,精确为浮点数。使用弧度制,360度角为2派
double arc = 2 * Math.PI / sideCount;
// 为多边形创建所有的顶点列表
var pointList = new List<Point>();
for (int i = 0; i < sideCount; i++)
{
var curArc = arc * i; // 当前点对应的圆心角角度
var pt = new Point();
// 就是简单的三角函数正余弦根据圆心角和半径算点坐标。这里都取整就行
pt.X = center.X + (int)(radius * Math.Cos(curArc));
pt.Y = center.Y + (int)(radius * Math.Sin(curArc));
pointList.Add(pt);
}
// 在给出的场景中用黑笔把这个多边形画出来
stage.DrawPolygon(Pens.Black, pointList.ToArray());
}
追问
不好意思我的Vs2008的From的属性好像没Onpaint方法。。。其实我是想通过一个TextBox来确定多边形的边数的
就是先在TextBox里输入要画的边数再画多边形。麻烦再修改一下一定给分。。。谢了
追答
override是重载,你要自己去加,直接把我给你的OnPaint函数放在你的窗体代码中试试看久知道了:)所有的Form,Control都具有这个函数OnPaint的重载,别说2008,2005都有的。
你可以添加一个TextBox,然后再加个按钮,当按钮点击的时候响应函数,这个函数只需简单调用窗体的
Invalidate();
方法更新绘图。唯一的变化就是DrawRegularPoly的参数中最后一个边数的参数直接使用TextBox上即用户输入的数值来绘图即可。简单举例可以这样调用:
DrawRegularPoly(e.Graphics, new Point(200, 200), 100, int.Parse(this.textBox1.Text));
来获取控件中的数字。(这里面没考虑异常处理,为了不让程序报错,textbox里面你最好填写一个初始值比如7啊4啊什么的,并且不要后面修改数值的时候改成不是正整数的值)
展开全部
在窗体上方个picturebox
public Form1()
{
InitializeComponent();
paintdd(12);
}
void paintdd(int num)
{
const int size = 200;
const int R = size / 2;
Bitmap bmp = new Bitmap(size, size);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.Red);//绘制背景,可注释掉
g.TranslateTransform(R, R);
g.DrawEllipse(Pens.Yellow, -R, -R, size,size);//绘制外接圆,可注释掉
double fAngel = Math.PI*2 / num;
double fStartAngel = Math.PI / 2f + fAngel / 2f;
PointF ptfStart = new PointF(R * (float)Math.Cos(fStartAngel), -R * (float)Math.Sin(fStartAngel));
for (int i = 0; i < num; i++)
{
fStartAngel += fAngel;
PointF ptfEnd = new PointF(R * (float)Math.Cos(fStartAngel), -R * (float)Math.Sin(fStartAngel));
g.DrawLine(Pens.Black, ptfStart, ptfEnd);
ptfStart = ptfEnd;
}
g.Dispose();
pictureBox1.Image = bmp;
}
public Form1()
{
InitializeComponent();
paintdd(12);
}
void paintdd(int num)
{
const int size = 200;
const int R = size / 2;
Bitmap bmp = new Bitmap(size, size);
Graphics g = Graphics.FromImage(bmp);
g.Clear(Color.Red);//绘制背景,可注释掉
g.TranslateTransform(R, R);
g.DrawEllipse(Pens.Yellow, -R, -R, size,size);//绘制外接圆,可注释掉
double fAngel = Math.PI*2 / num;
double fStartAngel = Math.PI / 2f + fAngel / 2f;
PointF ptfStart = new PointF(R * (float)Math.Cos(fStartAngel), -R * (float)Math.Sin(fStartAngel));
for (int i = 0; i < num; i++)
{
fStartAngel += fAngel;
PointF ptfEnd = new PointF(R * (float)Math.Cos(fStartAngel), -R * (float)Math.Sin(fStartAngel));
g.DrawLine(Pens.Black, ptfStart, ptfEnd);
ptfStart = ptfEnd;
}
g.Dispose();
pictureBox1.Image = bmp;
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
思路就是运用解析几何的知识,先得到每个点的坐标,然后画直线
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
具体你可以参照一个 开源的系统 Diagram.NET
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
正N边行吗,有点高级,学习一下
我估计应该是根据是几边型先计算出角度,然后一条线段一条线段的画
我估计应该是根据是几边型先计算出角度,然后一条线段一条线段的画
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询