第四章 渲染技术Ⅱ[FL 基理译]
2009-05-30 12:08:30 来源:WEB开发网请注意,在新代码中, for 循环从1开始到 points.length -2 结束,也就避开了第一个点和最后一个点。程序要做的是,创建新的 x,y 点,这个点是数组中后面两个点位的平均值。然后从数组下一个点位开始画一条曲线到新的平均点(中间点)。当循环结束时, i 变量指向倒数第二个元素,因此,可以穿过这里向最后一个点画条曲线。
这时,就得到一个非常平滑的图形,见图4-3。注意,这时原始点的数量不再受奇数个的限制。
再加一点小小的变化,使用同样的技术创建一条封闭的曲线。首先,计算一个初始的中间点,并移动到这里。然后,进行循环,获得每一个中间点,最后,将最后一条曲线画回初始中间点。图4-4 为显示结果
图4-3 多条平滑曲线
package {
import flash.display.Sprite;
public class MultiCurves3 extends Sprite {
private var numPoints:uint = 9;
public function MultiCurves3() {
init();
}
private function init():void {
var points:Array = new Array();
for (var i:int = 0; i < numPoints; i++) {
points[i] = new Object();
points[i].x = Math.random() * stage.stageHeight;
points[i].y = Math.random() * stage.stageHeight;
}
// find the first midpoint and move to it
var xc1:Number = (points[0].x + points[numPoints - 1].x) / 2;
var yc1:Number = (points[0].y + points[numPoints - 1].y) / 2;
graphics.lineStyle(1);
graphics.moveTo(xc1, yc1);
// curve through the rest, stopping at midpoints
for (i = 0; i < numPoints - 1; i ++) {
var xc:Number = (points[i].x + points[i + 1].x) / 2;
var yc:Number = (points[i].y + points[i + 1].y) / 2;
graphics.curveTo(points[i].x, points[i].y, xc, yc);
}
// curve through the last point, back to the first midpoint
graphics.curveTo(points[i].x, points[i].y, xc1, yc1);
}
}
}
更多精彩
赞助商链接