11RIA 闪客社区 - 最赞 Animate Flash 论坛

搜索
查看: 2518|回复: 1
上一主题 下一主题

[数学] 计算机图形学--2D--多边形与多角星形的算法

[复制链接] TA的其它主题
发表于 2019-6-12 11:19:10 | 显示全部楼层 |阅读模式

【游客模式】——注册会员,加入11RIA 闪客社区吧!一起见证Flash的再次辉煌……

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 Leo 于 2019-6-12 11:20 编辑

/**
                 * 多边星形
                 * @param w 相对宽度
                 * @param h 相对高度
                 * @param num 边数
                 * @param isStar 是否显示为星形
                 * @param r 内径相对外径的比例,只有isStar为true时,该值才有效。
                 * @param maxNum 边数上限
                 * @return 返回点的集合
                 *
                 */
                public static function polygonStar(w:Number, h:Number, num:Number, isStar:Boolean=false, r:Number=0.5, maxNum:int=32):Vector.<Number>{
                        num = Math.max(num, 3);
                        num = Math.min(num, maxNum);
                        if(isStar) num = num*2;
                        
                        var points:Vector.<Number> = Vector.<Number>([]),
                                A:Number = 0, B:Number = 0, angle:Number=360/num;
                        
                        if(isStar){
                                A = w*0.5 / Math.cos( sideAngle(num, 0.25) - Math.PI*0.5 );
                                B = h / ( 1 + Math.sin(sideAngle(num, 0.5) - Math.PI*0.5) );
                        }else{
                                A = w*0.5 / Math.cos( sideAngle(num*2, 0.25) - Math.PI*0.5 );
                                B = h / ( 1 + Math.sin( sideAngle(num*2, 0.5) - Math.PI*0.5) );
                        }
                        
                        var toX:Number, toY:Number, a:Number, b:Number;
                        for(var i:int=0; i<num; i++){
                                a = A;
                                b = B;
                                
                                if (isStar && i%2>0) {
                                        a = a*r * Math.cos(Math.PI/num);
                                        b = b*r * Math.cos(Math.PI/num);
                                }
                                
                                toX = w*0.5 + a*Math.cos((angle*i-90)*Math.PI/180);
                                toY = B + b*Math.sin((angle*i-90)*Math.PI/180);
                                
                                points.push(toX, toY);
                        }
                        
                        return points;
                }
               
                private static function sideAngle(num:int, val:Number):Number{
                        var n:int = Math.floor(num*val);
                        n = n%2==0?n:n+1;
                        return n * Math.PI * 2 / num;
                }


=============================用法例子=============================
var commands:Vector.<int> = Vector.<int>([]);
                        var data:Vector.<Number> = polygonStar(300, 300, 5, true);
                        
                        data[data.length] = data[0];
                        data[data.length] = data[1];
                        for(var i:int=0; i<data.length; i+=2){
                                commands[commands.length] = i==0?1:2;
                        }
                        
                        var shape:Shape = new Shape();
                        canvas.addChild(shape);
                        
                        shape.graphics.clear();
                        shape.graphics.lineStyle(1, 0xff0000, 1);
                        shape.graphics.drawPath(commands, data);
                        shape.graphics.endFill();

评分

参与人数 1银子 +10 金子 +1 贡献 +1 收起 理由
TKCB + 10 + 1 + 1

查看全部评分

发表于 2019-6-12 13:24:39 | 显示全部楼层
【11RIA 闪客社区,评分公示】:
是否有价值:一般(银子 +10  贡献 +1)
是否原创:是(金子 +1)
是否翻译:否
如对自己的评分有疑问,则咨询版主、管理员等。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

感谢所有支持论坛的朋友:下面展示最新的5位赞助和充值的朋友……更多赞助和充值朋友的信息,请查看:永远的感谢名单

SGlW(66139)、 anghuo(841)、 whdsyes(255)、 longxia(60904)、 囫囵吞澡(58054)

下面展示总排行榜的前3名(T1-T3)和今年排行榜的前3名的朋友(C1-C3)……更多信息,请查看:总排行榜今年排行榜

T1. fhqu1462(969)、 T2. lwlpluto(14232)、 T3. 1367926921(962)  |  C1. anghuo(147)、 C2. fdisker(27945)、 C3. 囫囵吞澡(58054)



快速回复 返回顶部 返回列表