西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)C#.NET → c#畫五角星數(shù)學(xué)方面的知識(shí)、完整代碼分享

c#畫五角星數(shù)學(xué)方面的知識(shí)、完整代碼分享

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時(shí)間:2012/11/25 18:32:02字體大。A-A+

作者:西西點(diǎn)擊:0次評論:1次標(biāo)簽: 數(shù)學(xué)

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;
        }
    }   

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)