计算机图形学--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();
【11RIA 闪客社区,评分公示】:
是否有价值:一般(银子 +10贡献 +1)
是否原创:是(金子 +1)
是否翻译:否
如对自己的评分有疑问,则咨询版主、管理员等。
页:
[1]