另一种巧妙的足球算法

在一个由20个六边形和12个五边形组成的足球中,如果我们把所有六边形的边都向两边延伸,我们就会发现足球变成了正二十面体:如图一所示下载文件 点击下载football.dwg文件

                   (图一)
此时我们想,如果我们先画出正二十面体,然后在正十二面体切出12个五边形,就可以得到我们所需要的足球。对于在何处切这个五边形,我们可以很容易证明,切入点恰恰在正十二面体的边长的1/3处。现在我们的问题就很简单了,就是如何画这个正二十面体。
通过旋转图一我们可以得到图二:

                   (图二)
由图二我们可以发现,在XY平面的投影上,5、8点重合,6、7点重合,9、10点重合,11、12点重合,1、2、3、4点位于XY平面,5、6、7、8位于XZ平面,9、10、11、12位于YZ平面。由于对称,我们只要求出一个点,那么其他所有点都能够全部求出。


                   (图三)
通过图三以及各边之间的关系,我们可以得出tan2a = 2,由此我们可以得到每一点的坐标在各轴投影的比例,这样就可以画出足球了。

下面是关键程序段:函数Initialize,传入球心,半径,以及输出参数六边形、五边形数组
我们可以发现这种方法求出所有五边形和六边形点的方法代码量非常少。 

 

         public   static   void  Initialize(Point3d footBallCenter,  double  radius, Point3d[,] polygon6, Point3d[,] polygon5)
        
{
            
double a = Math.Cos(Math.Atan(2/ 2* radius;
            
double b = Math.Sin(Math.Atan(2/ 2* radius;
            Point3d[] ptArry 
= new Point3d[13{ footBallCenter, new Point3d(-a, b, 0), new Point3d(-a, -b, 0), new Point3d(a, b, 0), new Point3d(a, -b, 0), new Point3d(-b, 0, a), new Point3d(b, 0, a), new Point3d(b, 0-a), new Point3d(-b, 0-a), new Point3d(0-a, b), new Point3d(0-a, -b), new Point3d(0, a, -b), new Point3d(0, a, b) };
            
int[,] triArry = new int[203
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值