最近在研究AVL平衡二叉树AS3实现及BSP算法,以实现更好的深度排序,由于排序的物体包括如椅子这样的家具,所以希望能够通过某个算法获得物体的边缘,于是了解一些边缘检测算法,但是,发现边缘检测算法比较复杂,如果通过Bitmap来做的话,可能对于大的物体其效率不太可观. 便想到,如果在生成SWF的时候能够预处理好边缘直接获得一个边缘列表就好了.如果将这份工作交给美工,可能他们会非常痛苦,因为要记录每一个顶点的位置,中午的时候花了一点时间看了一下Flash JavaScript API ,有所收获,记录下来分享一下.
Flash JavaScript API 是什么?
取这个名字还真让人不太容易理解,初步一看,好像是Flash提供Javascript的API.让人太容易跟JavaScript混在一起. Flash JavaScript API 运行在Flash IDE中,类似ActionScription语法,用于扩展Flash IDE运行时的功能. 跟JavaScript一样Flash JavaScript API 提供了一个DOM, 这个DOM包括一些顶级函数和两个顶级对象[FLfile 对象和 flash 对象 (fl)]. 这样,Flash IDE好比浏览器,Flash JavaScript好比浏览器中的JavaScript,如果你比较清楚了解Js,理解起来就比较清楚了. 你可以在Flash IDE中编写和运行Flash JavaScript, 它的后缀名为
.jsfl .
Flash JavaScript能做什么呢?
"利用 JavaScript API,您可以编写有助于简化创作过程的 Flash 应用程序脚本。例如,您可以编写脚本来自动执行重复性任务、向"工具"面板添加自定义工具或者添加时间轴特效。" 官方文档上是这样说的. 正如我前面描述的需求一样,我希望能通过Flash JavaScript给我处理边缘顶点,只要美工直接描述出边缘,我通过Jsfl代码将顶点检测记录下来就OK了.
更详细的解释你可以去看看Help,里面决对又有新的东西了..
迟点发布AVL树的AS3版本.
下面发布一个检测边缘的DEMO.
1. 先用钢笔工具勾一个封闭多边形,然后选中右击变成元件.
2. 将元件命名为: Wills
新建一个jsfl文件,粘贴如下代码:
如果你的多边形没有曲面的话,在你的FlashIDE中将会出现一个跟你勾出来的多边形一样的多边形,不过是绿色的,这个就是上面的代码临时画的了. :) 效果如下:
JavaScript代码
- var nameToSearchFor = "Wills";
- var doc = fl.getDocumentDOM();
- var results = fl.findObjectInDocByName(nameToSearchFor, doc);
- getEdgesVertices(results[0].obj.libraryItem.timeline.layers[0].frames[0].elements[0]);
-
- function trace(item){
- var str="";
- for(var i in item){
- str=str+" "+(i+":"+item[i]);
- }
- fl.trace(str);
- }
-
- function getEdgesVertices(target){
- var str="[";
- var edges=target.edges;
- var arr=new Array();
- fl.trace(edges.length);
- for(var i=0;i<edges.length;i++){
- arr[i]=edges[i];
- }
-
- var point=new Array();
- var star,end,k,length=arr.length,ve;
- for(var i=0;i<length;i++){
- k=-1;
- for(var j=0;j<length;j++){
- if(arr[j]){
- if(star==null){
- star=arr[j].getHalfEdge(0).getVertex();
- end=arr[j].getHalfEdge(1).getVertex();
- arr[j]=null;
- k=j;
- break;
- }else{
- ve=arr[j].getHalfEdge(0).getVertex();
- if(ve.x==star.x&&ve.y==star.y){
- star=arr[j].getHalfEdge(1).getVertex()
- arr[j]=null;
- k=j;
- break;
- }
-
- ve=arr[j].getHalfEdge(1).getVertex();
- if(ve.x==star.x&&ve.y==star.y){
- star=arr[j].getHalfEdge(0).getVertex()
- arr[j]=null;
- k=j;
- break;
- }
- }
- }
- }
-
- if(k!=-1){
- point[i]=star;
- }
- }
-
- fl.drawingLayer.beginDraw( true );
- fl.drawingLayer.beginFrame();
- fl.drawingLayer.setColor( "#00ff00" );
- fl.drawingLayer.moveTo(point[0].x,point[0].y);
-
- for(var i=0;i<point.length;i++){
- fl.drawingLayer.lineTo(point[i].x,point[i].y);
- }
-
- fl.drawingLayer.lineTo(point[0].x,point[0].y);
-
- fl.drawingLayer.endFrame();
- fl.drawingLayer.endDraw();
- }
运行,效果如下: