//设置五角星的宽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)))
);
/*
产生五个顶点的坐标,但由此五顶点连线相交的另外五个点的坐标如何动态算出。
//有没有更好的解决办法呢?
*/
}
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)))
);
/*
产生五个顶点的坐标,但由此五顶点连线相交的另外五个点的坐标如何动态算出。
//有没有更好的解决办法呢?
*/
}
解决方案 »
- 怎么用一个对象封装下
- 请教如何在page_load执行javascript函数
- TreeView如何返回节点和选择节点下子节点的Value
- 算法问题
- 第 1 行: '=' 附近有语法错误。
- 请教个问题!AspNetPager分页控件可以添加传递参数吗?
- 新年好!先问个问题:win2000+asp.net+sqlserver2000,可sqlmangr.exe进程一直在向外发数据,弄得网站打不开,请问该怎么解决?
- 求助:类似于QQ或ICQ形式的组件(原码),谢谢!
- 大家看看这句怎么了,不好使了
- wcf消息拦截,AfterReceiveRequest中拦截,但调试或者获取元数据的时候不需要验证
- 怎么会这样?更新数据不一致!
- 初学者提问,关于<%# %>和<%= %>,请大家帮忙!麻烦高手们也来看看!
其角度序列分别是(0,72,144,216,288),(36,108,180,252,324)以上数字均指角度不知道这个是不是你要的算法
我觉得上面已经是公式了
如果中心点是(0,0),五角星有一个顶点在x轴,五角星外接圆半径r,五个凹陷点是
(sin18/sin54*r*sin(i*72+36),sin18/sin54*r*cos(i*72+36))
i从0到4上面数字均指角度
当然你可以把中心点移到(x,y),坐标轴也可以旋转,做个坐标变换就是
//设置五角星的半径
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);
....