c#畫一個(gè)五角星,最重要的就是計(jì)算哪些坐標(biāo)點(diǎn)出來,也是最難的一部分,這要涉及到一些數(shù)學(xué)方面的知識(shí).對數(shù)學(xué)坐標(biāo)知識(shí)不是很熟的人,如果想學(xué)畫圖,我建議多去看一下數(shù)學(xué)書,對我們寫程序的人來說是沒有什么壞處可言的.
想學(xué)習(xí)的朋友可以一起學(xué)習(xí),我覺得分享學(xué)習(xí)是一種快樂,所以把自己的一些心得分享給大家,我本人也是走了很多的彎路,所以也不希望一些朋友做一些吃力不討好的事.
廢話不多說,先看一下效果圖吧:
效果還可以吧,至少長得很像五角星,當(dāng)然你也可以說不像,可能我的口味和你的不同,不過我們的目的都是一樣的,就是怎么算這些坐標(biāo)出來并且把他畫出來.
好,現(xiàn)在我們開始來分析問題(在此之前,我建議不懂極坐標(biāo)的朋友先看看極坐標(biāo)方面的一些知識(shí),因?yàn)樗惴ǖ暮诵膯栴}主要在這里.):
程序分析步驟:
1.畫一個(gè)五角星,需要先確定五角星的十個(gè)點(diǎn),有朋友可能問:"為什么是十個(gè)點(diǎn)而不是五個(gè)點(diǎn)呢?",這種問題希望沒有學(xué)過c#的人都會(huì)知道,確定一個(gè)五角星需要十個(gè)點(diǎn),多邊形嘛!
2.如何獲得我們所需要的十個(gè)點(diǎn)呢?反問自己,經(jīng)常反問自己可以解決很多問題.要想確定十個(gè)點(diǎn),你可以觀察一下圖形,或自己畫一下,看一下圖形的特點(diǎn)(中心對稱圖形),對于中心對稱圖形,就可以確定其中心點(diǎn),其他所有的點(diǎn)都是圍繞著這個(gè)中心點(diǎn)轉(zhuǎn)的,我們可以根據(jù)三個(gè)條件來確定我們想要得到的點(diǎn):
1.中心點(diǎn)
2.中心點(diǎn)到目標(biāo)點(diǎn)的距離
3.目標(biāo)點(diǎn)和X軸(水平距離)的夾角
現(xiàn)在我們可以寫一個(gè)GetPoint的方法來獲得目標(biāo)點(diǎn),代碼如下:
/// <summary>
/// 獲得五角星的各個(gè)點(diǎn)
/// </summary>
/// <param name="ptCenter">中心點(diǎn)坐標(biāo)</param>
/// <param name="length">距離中心點(diǎn)的長度</param>
/// <param name="angle">和水平方向的夾角</param>
/// <returns></returns>
public PointF GetPoint(PointF ptCenter, double length, double angle)
{
return new PointF(
(float)(ptCenter.X + length * Math.Cos(angle)),
(float)(ptCenter.Y + length * Math.Sin(angle)));
}
方法很簡單,返回一個(gè)目標(biāo)點(diǎn),這個(gè)算是核心的一個(gè)方法,理解了這個(gè)方法,接下來的都迎刃而解.既然能夠得到一個(gè)點(diǎn)當(dāng)然也能夠得到一系列的點(diǎn),所以我們還可以寫一個(gè)獲得一系列點(diǎn)的方法GetPoints,代碼如下:
/// <summary>
/// 返回一個(gè)坐標(biāo)的數(shù)組
/// </summary>
/// <param name="ptCenter">中心點(diǎn)</param>
/// <param name="length">距離中心點(diǎn)的長度</param>
/// <param name="angles">兩點(diǎn)之間的夾角</param>
/// <returns></returns>
public PointF[] GetPoints(PointF ptCenter, double length, params double[] angles)
{
PointF[] points = new PointF[angles.Length];
for (int i = 0; i < points.Length; i++)
{
points[i] = GetPoint(ptCenter,length,angles[i]);
}
return points;
}
從我們的代碼中可以看到一個(gè)角度的參數(shù)(double angle),所以我們就需要確定目標(biāo)點(diǎn)和X軸(水平距離)的夾角,我們還是讓代碼來說話吧!
/// <summary>
/// 獲得所有角度的數(shù)組
/// </summary>
/// <param name="startAngle">開始的角度</param>
/// <param name="pointed">個(gè)數(shù)</param>
/// <returns></returns>
public double[] GetAngles(double startAngle,int pointed)
{
double[] angles = new double[pointed];
angles[0] = startAngle;
for (int i = 1; i < angles.Length; i++)
{
angles[i] =angles[i-1] + GetAngleLength(pointed);
}
return angles;
}
/// <summary>
/// 獲得角度的增量
/// </summary>
/// <param name="pointed"></param>
/// <returns></returns>
public double GetAngleLength(int pointed)
{
return 2*Math.PI/pointed;
}
可以看到我們定義了兩個(gè)方法,想要確定目標(biāo)點(diǎn)和X軸(水平距離)的夾角,就要確定多少個(gè)角(pointed),還有你的起始角的位置(startAngle,中心點(diǎn)之上的那個(gè)點(diǎn)),然后確定角度的增量就可以計(jì)算出所有的角度了!
3.萬事俱備,只欠一個(gè)DrawStar的方法,先看一下代碼:
/// <summary>
/// 畫五角星
/// </summary>
/// <param name="pointed">多少個(gè)角</param>
/// <param name="e">Graphics參數(shù)</param>
public void DrawStar(int pointed,PaintEventArgs e)
{
Graphics g = e.Graphics;//建立一個(gè)畫布
g.CompositingQuality = CompositingQuality.HighQuality;//設(shè)置圖像呈現(xiàn)的質(zhì)量
g.SmoothingMode = SmoothingMode.HighQuality;//對圖片進(jìn)行平滑處理
Pen p = new Pen(Color.Red);//畫筆的顏色
double[] angles1 = GetAngles(-Math.PI / 2, pointed);//五角星外圍的點(diǎn)角度的一個(gè)數(shù)組
double[] angles2 = GetAngles(-Math.PI / 2+Math.PI/pointed, pointed);//五角星內(nèi)圍的點(diǎn)角度的一個(gè)數(shù)組
PointF[] points1 = GetPoints(new PointF(300, 300), 100, angles1);//五角星外圍的點(diǎn)的一個(gè)數(shù)組
PointF[] points2 = GetPoints(new PointF(300, 300), 50, angles2);//五角星內(nèi)圍的點(diǎn)的一個(gè)數(shù)組
PointF[] points = new PointF[points1.Length+points2.Length];//最終合成多邊形所有點(diǎn)的數(shù)組
for (int i = 0,j=0; i < points.Length; i+=2,j++)
{
points[i] = points1[j];
points[i + 1] = points2[j];
}
g.DrawPolygon(p,points);//畫一個(gè)多邊形
g.FillPolygon(Brushes.Aqua,points);//填充顏色
}
這個(gè)方法也沒有什么好說的,就是c#一些常用的方法,上面本人也有注解!
我也就不解釋那么多了,相信你自己能夠看得懂!
其實(shí)上面的代碼不只是可以畫五角星,只要改一下六角,七角,八角,你喜歡的話一百角都行!看一下效果圖吧!
接下來一個(gè)一百角的,當(dāng)然看起來更像一個(gè)太陽,根據(jù)自己的喜好吧!
Ok!寫完,本人寫作水平和表達(dá)能力有點(diǎn)菜,有不足之處希望大家諒解!也希望對各位朋友有所幫助!
完整源代碼:
public class 五角星
{
/// <summary>
/// 畫五角星
/// </summary>
/// <param name="pointed">多少個(gè)角</param>
/// <param name="e">Graphics參數(shù)</param>
public void DrawStar(int pointed,Graphics g)
{
g.CompositingQuality = CompositingQuality.HighQuality;//設(shè)置圖像呈現(xiàn)的質(zhì)量
g.SmoothingMode = SmoothingMode.HighQuality;//對圖片進(jìn)行平滑處理
Pen p = new Pen(Color.Red);//畫筆的顏色
double[] angles1 = GetAngles(-Math.PI / 2, pointed);//五角星外圍的點(diǎn)角度的一個(gè)數(shù)組
double[] angles2 = GetAngles(-Math.PI / 2+Math.PI/pointed, pointed);//五角星內(nèi)圍的點(diǎn)角度的一個(gè)數(shù)組
PointF[] points1 = GetPoints(new PointF(300, 300), 100, angles1);//五角星外圍的點(diǎn)的一個(gè)數(shù)組
PointF[] points2 = GetPoints(new PointF(300, 300), 50, angles2);//五角星內(nèi)圍的點(diǎn)的一個(gè)數(shù)組
PointF[] points = new PointF[points1.Length+points2.Length];//最終合成多邊形所有點(diǎn)的數(shù)組
for (int i = 0,j=0; i < points.Length; i+=2,j++)
{
points[i] = points1[j];
points[i + 1] = points2[j];
}
g.DrawPolygon(p,points);//畫一個(gè)多邊形
g.FillPolygon(Brushes.Aqua,points);//填充顏色
}
/// <summary>
/// 獲得所有角度的數(shù)組
/// </summary>
/// <param name="startAngle">開始的角度</param>
/// <param name="pointed">個(gè)數(shù)</param>
/// <returns></returns>
public double[] GetAngles(double startAngle,int pointed)
{
double[] angles = new double[pointed];
angles[0] = startAngle;
for (int i = 1; i < angles.Length; i++)
{
angles[i] =angles[i-1] + GetAngleLength(pointed);
}
return angles;
}
/// <summary>
/// 獲得角度的增量
/// </summary>
/// <param name="pointed"></param>
/// <returns></returns>
public double GetAngleLength(int pointed)
{
return 2*Math.PI/pointed;
}
/// <summary>
/// 獲得五角星的各個(gè)點(diǎn)
/// </summary>
/// <param name="ptCenter">中心點(diǎn)坐標(biāo)</param>
/// <param name="length">距離中心點(diǎn)的長度</param>
/// <param name="angle">和水平方向的夾角</param>
/// <returns></returns>
public PointF GetPoint(PointF ptCenter, double length, double angle)
{
return new PointF(
(float)(ptCenter.X + length * Math.Cos(angle)),
(float)(ptCenter.Y + length * Math.Sin(angle)));
}
/// <summary>
/// 返回一個(gè)坐標(biāo)的數(shù)組
/// </summary>
/// <param name="ptCenter">中心點(diǎn)</param>
/// <param name="length">距離中心點(diǎn)的長度</param>
/// <param name="angles">兩點(diǎn)之間的夾角</param>
/// <returns></returns>
public PointF[] GetPoints(PointF ptCenter, double length, params double[] angles)
{
PointF[] points = new PointF[angles.Length];
for (int i = 0; i < points.Length; i++)
{
points[i] = GetPoint(ptCenter,length,angles[i]);
}
return points;
}
}