//设置五角星的宽cX,高cY
int cX=200;
int cY=200;
Point[] apt=new Point[5];
StringBuilder sb=new StringBuilder();for(int i=0;i<apt.Length;i++)
{
double dAngle=(i*0.8-0.5)*Math.PI;
apt[i]=new Point(
(int)(cX*(0.50+0.5*Math.Cos(dAngle))),
(int)(cY*(0.50+0.5*Math.Sin(dAngle)))
);
/*
产生五个顶点的坐标,但由此五顶点连线相交的另外五个点的坐标如何动态算出。
//有没有更好的解决办法呢?
*/
}

解决方案 »

  1.   

    找到直线方程(y-y1)(x2-x1)=(x-x1)(y2-y1)
      

  2.   

    两个半径的比例是sin54/sin18
    其角度序列分别是(0,72,144,216,288),(36,108,180,252,324)以上数字均指角度不知道这个是不是你要的算法
      

  3.   

    不知道你用什么方法算出来的
    我觉得上面已经是公式了
    如果中心点是(0,0),五角星有一个顶点在x轴,五角星外接圆半径r,五个凹陷点是
    (sin18/sin54*r*sin(i*72+36),sin18/sin54*r*cos(i*72+36))
    i从0到4上面数字均指角度
    当然你可以把中心点移到(x,y),坐标轴也可以旋转,做个坐标变换就是
      

  4.   

    试了一下,按你的方法画出来不是正五角星,如果将sin18改为sin14反而更象正五角星,不知为何?
    //设置五角星的半径
    int r=120;
    Point[] apt=new Point[5];
    for(int i=0;i<apt.Length;i++)
    {
    apt[i]=new Point(
    (int)(20+r/2+Math.Sin(Math.PI*54.0/180) * r * Math.Sin(Math.PI*(i*72.0+36)/180)),
    (int)(20+r/2+Math.Sin(Math.PI*54.0/180) * r * Math.Cos(Math.PI*(i*72.0+36)/180))
    );
    }Point[] aptA=new Point[5];
    for(int i=0;i<aptA.Length;i++)
    {
    aptA[i]=new Point(
    (int)(20+r/2+Math.Sin(Math.PI*14.0/180)/Math.Sin(Math.PI*54.0/180) * r * Math.Sin(Math.PI*(i*72.0+72)/180)),
    (int)(20+r/2+Math.Sin(Math.PI*14.0/180)/Math.Sin(Math.PI*54.0/180) * r * Math.Cos(Math.PI*(i*72.0+72)/180))
    );
    }Point[] arrPointStar=new Point[]
    {
    apt[0],aptA[0],
    apt[1],aptA[1],
    apt[2],aptA[2],
    apt[3],aptA[3],
    apt[4],aptA[4],
    //最后一个点也是与第一点相同
    apt[0]
    };
    GraphicsPath gpStar=new GraphicsPath();
    gpStar.AddLines(arrPointStar);
    ....