Leo 发表于 2019-6-12 11:19:10

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

本帖最后由 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;
                        data = data;
                        for(var i:int=0; i<data.length; i+=2){
                              commands = 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();

TKCB 发表于 2019-6-12 13:24:39

【11RIA 闪客社区,评分公示】:
是否有价值:一般(银子 +10贡献 +1)
是否原创:是(金子 +1)
是否翻译:否
如对自己的评分有疑问,则咨询版主、管理员等。
页: [1]
查看完整版本: 计算机图形学--2D--多边形与多角星形的算法

感谢所有支持论坛的朋友:下面展示最新的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)