内门弟子
阅读权限 1
积分 963
侠名
UID 860
主题
帖子
精华
好友
银子
金子
贡献
威望
推广
活跃
荣耀
注册时间 2018-6-19
最后登录 1970-1-1
在线时间 小时
个人主页
|
【游客模式】——注册会员,加入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();
|
评分
-
查看全部评分
|