 第一张图里面讲的是"定内径长"的情形,就是正多边形的外接圆的内径已经固定. 那么我们可以根据三角形的正弦和余弦来确定一个端点相对于与水平线的位置. 我们再开始的时候就画出(也可以用as来绘制,不用那么麻烦吧?要弄自己弄去) 水平的那条内径,这样有利于后面的确定计算公式. 第二张图里面讲的是定边长的情形,就是....就是定边长了,不会不懂吧? 为了节约时间,我们将边长转化为内径来求. 我们知道,正多边形每个端点到中心的距离是相同的(不要问我为什么,我不知道,直觉), 在边的数量和边长已经确定的情况下,我们可以确定内径的长度.也就是可以这样说: 对于已经固定边数和边长的正多边形,它的内径长是固定的. 于是我们利用余弦定理达到这个目的
那么反过来说,我们既然已经确定了其内径和边数,画出边的也就很简单了,举两个例子:

那么反过来说,我们既然已经确定了其内径和边数,画出边的也就很简单了,举两个例子: 我们的OA边是事先确定好位置的(具体可以用一个复制函数复制一条线段,然后指定新线段的位置) 利用复制函数复制出四条新的新的线段,然后用rotation旋转角度(以72为单位)这样我们就确定了 端点和中心点链接的内径的位置了,只需要求出各点x,y就可以使用linestyle和lineto,moveto来 画出边线----当然,还要限制角度,这个我们在后面会将到. 十边形的情形差不多.

为了避免后面的并非原创之嫌,我将第7楼的代码重新讲解一遍.
//创建一个新的电影夹子,命名为ban,放在1层 _root.createEmptyMovieClip("ban", 1); //为电影夹子ban添加onclipevent事件 ban.onEnterFrame = function() { with (ban) { //指定线条样式为5磅粗,黑色,100可见度 lineStyle(5, 0x000000, 100); //将起始画线点 移到(100,100) moveTo(100, 100); //画线到(200,100) lineTo(200, 100); } }; //其实就是从(100,100)到(200,100)的一条线段 *************************************** 画等便三角形就复扎一点点,你要先计算计算---怎么计算? 3的平方根好像大概可能也许是1.732........... _root.createEmptyMovieClip("ban", 1); ban.onEnterFrame = function() { with (ban) { lineStyle(5, 0x000000, 100); moveTo(100, 100); lineTo(100, 200); lineTo(13.4, 150); lineTo(100,100); } }; //等边三角形稍微复杂一点,我们事先要计算一下各个端点的位置 ************************************************** 然后是正方形,没有什么好讲的 _root.createEmptyMovieClip("ban",1); ban.onEnterFrame=function(){ with(ban){ lineStyle(5,0x000000,100); moveTo(100,100); lineTo(200,100); lineTo(200,200); lineTo(100,200); lineTo(100,100); } }; *********************************************************** 然后用curvto绘制曲线,这个我不好讲,因为curvto绘图的依据原理我还不知道, 在闪吧as区发贴,还没有回答. _root.createEmptyMovieClip("circle", 1); with (circle) { lineStyle(0, 0x000000, 100); moveTo(100, 150); curveTo(150, 150, 150, 100); curveTo(150, 50, 100, 50); curveTo(50, 50, 50, 100); curveTo(50, 150, 100, 150); }
可能你会问,为什么一定要先画出内径,再画出边线? 呵呵,不过是为了大家好理解,你不画出内径,多边形一样能够出来. 楼下的,呵呵,其实很简单的,请你们从第9楼开始看,就不是那么复杂了. 我试图用先举例,再由浅入深的方法来讲解这个新的函数, 最开始的几贴看不懂没有关系,事实上我也自己编写不出前面四种方 法里面的三种.那些都是超强的人.
当然,你不动也没有关系,因为,可以不用它,呵呵
下面继续: 我来讲一讲如何根据转动的角度来确定点的位置. 我们以上面的正五边形为例. 我们知道,如果转动的角度大于90度, 那么我们就因该重新考虑是否直接采用正弦和余弦. OB的转动角度是小于90度的,那么我们可以直接用正弦余弦.
那么可以知道:if(a<90){......} xB=xO+OB*cos(a); yB=yO+OB*sin(a); 但是OC的转动角度大于了90度,那么又的地方我们就应该用减号而不是加号了.为了方便, 我们用180-a来将钝角转换为锐角,相应的,就需要在as里面添加if(a>90){......}的语句. xC=xO-OC*cos(180-a); yC=yO+OC*sin(180-a); 当转动的角度大于了180度,也就是if(a>180) 这时候我们就用(a-180), xD=xO-OD*cos(a-180); yD=yO-OD*sin(a-180); 当转动的角度大于了270度,怎么计算相信不需要我再说了吧.
////////////////////////////////////////// 至于具体怎么实现,情大家在仔细看了我的教程之后自己动手实践一下. 关键在于if语句的应用.
当然,这上面讲的是比较笨的办法,如果采用弧度的话,要简单一些,我在以后再讲(嘻嘻,我还没有做那)还有比上面的方法更笨的办法,那就是用下一边的起始点连接上一条线段的末端,转动一定的角度...................呵呵,自己想吧,我可不想,又难做又复杂!
呵呵,我今天说错了一点,数学离得久了一点儿.正弦和余弦不用限制范围久可以直接用了. 我做了一个,如下. lengthNum是内径长度,lineNum是边的数目. on (release) { lengthNum = _root.lengthNum1; lineNum = _root.lineNum1; angle = 360/lineNum; for (i=1; i<=lineNum; i++) { dx = lengthNum*Math.cos(Math.PI*i*angle/180); dy = lengthNum*Math.sin(Math.PI*i*angle/180); hx = lengthNum*Math.cos(Math.PI*(i+1)*angle/180); hy = lengthNum*Math.sin(Math.PI*(i+1)*angle/180); createEmptyMovieClip("uu"+i, i); with ("uu"+i) { lineStyle(5, 0x000000, 100); moveTo(300+dx, 300+dy); lineTo(300+hx, 300+hy); } } } |