zoukankan      html  css  js  c++  java
  • nape.geom.MarchingSquares

    Nape中的MarchingSquares类很简单,只有一个静态函数run,不过这对绘制那些简单的形状来说,已经足够了(当然MarchingSquares能做的不只这些)。下面是这个run方法的结构:

     run(iso:IsoFunctionDef, bounds:AABB, cellsize:Vec2, quality:Int = 2, subgrid:Vec2 = null, combine:Bool = true, output:GeomPolyList = null):GeomPolyList
    •  iso:IsoFunctionDef:这是run函数的核心部份,也是我们定义刚体形状的地方。在官方API中这个参数是IsoFunctionDef类型,不过这是针对Haxe语言的,针对Flash中这个iso是IsoFunction类型的。这里的IsoFunction并不是一个具体的类,而是接口。它的结构如下:
      interface IsoFunction{
          public iso(x:Number, y:Number):Number;
      }

      我们需要新建一个类,应用这个IsoFunction接口,在iso函数中编写刚体形状公式。然将这个类的实例化对象赋值给iso参数。iso的结果必须唯一,即给定x和y得到的值一定是同一个,符合数学里面函数的定义.iso函数还会返回一个Number值,这个返回值小于0,表示该点在形状内部,属于刚体一部份,大于0表示该点在形状外部,不在刚体范围内。

    • bounds:AABB:表示舞台中的某个区域,类似于AS3中的Rectangle类。这个区域和iso函数中遍历的区域相同
    • cellsize:Vec2:指定run方法在AABB区域遍历计算的间距,分解bounds区域的单元格尺寸,这个尺寸越小,iso函数仿真出来的形状越逼真,相应的CPU消耗也越大
    • quality:Int = 2:在单元格边缘应用递归进行插值运算的次数,当iso遍历的单元格尺寸较大时,可以通过增加整个值来提高边缘的精确度。
    • subgrid:Vec2 = null: 设置此参数后,bounds区域首先以subgrid的尺寸分割,然后分割后的单元格再以cellssize的尺寸进行分割。所以subgrid的尺寸一定要比cellsize的尺寸大。
    • combine:Bool = true: 当这个参数为true时,每个单元格里分割出来的多边形,会组合成一个大的多边形。
    • output:GeomPolyList = null:设置整个参数后,生成的GeomPolyList会自动添加到(通过GeomPolyList的add函数)output中,而不会新建一个GeomPolyList对象。得到这个GeomPolyList之后,根据我们学过的GeomPoly方法创建多边形。
    import nape.geom.IsoFunction;
    class SemiCircleIso implements IsoFunction{
        private var _px:Number,_py:Number,_r:Number;
        public function SemiCircleIso():void{
            
        }
        public function setUP(px:Number,py:Number,r:Number):void{
            _px = px;
            _py = py;
            _r = r;
        }
        public function iso(x:Number,y:Number):Number{
            var dis:Number,dx:Number,dy:Number;
            var isOK:Number;
            dx = x-_px;
            dy = y-_py;
            dis = dx*dx + dy*dy;
            //iso函数还会返回一个Number值,这个返回值小于0,表示该点在形状内部,属于刚体一部份,大于0表示该点在形状外部,不在刚体范围内
            if (dis< _r*_r){
                isOK=-1;
            }else{
                isOK=1;
            }
            return isOK;
        }
    }
    public function createMarchingSquareBody(e:MouseEvent=null) : void {
                myISO.setUP(275, 200, r);
                var geomList: GeomPolyList;
                geomList = MarchingSquares.run(myISO, aabb, cellsize,quality,null,combine);
                
                if(b !=null){
                    b.space = null;
                }
                b = new Body(BodyType.DYNAMIC);
                geomList.foreach(function (s:*):void{
                    b.shapes.push(new Polygon(s));
                });
                b.align();
                b.space = napeWorld;
            }
        }
  • 相关阅读:
    samdump2获取虚拟机密码
    PHP执行cmd方法若干
    Aircrack-ng学习笔记之无AP破解WiFi密码
    Python基础:extend与append的区别
    Python基础:dictionary
    UVALive 3177 长城守卫
    UVALive 3902 网络
    UVA 11520 填充正方形
    UVALive 3635 分派
    UVALive 3971 组装电脑
  • 原文地址:https://www.cnblogs.com/ddw1997/p/3189034.html
Copyright © 2011-2022 走看看