Math and (Quasi) Physics in Action Script 3

drawTriangles

UVT mapping with Graphic.drawTriangle method

Main.as

package {
  import flash.display.*;
  import flash.events.*;
  import flash.geom.*;
  import flash.text.*;  
  public class Main extends Sprite {
    var points:Array;
    var xn:uint = 20, yn:uint = 20;
    var texture:BitmapData;
    var ang:Number = 0;
    var fl:Number = 600;
    var cx:Number, cy:Number;
    var canvas:Sprite;
    public function Main() {
      cx = stage.stageWidth / 2;
      cy = stage.stageHeight / 2;
      texture = new Curtain(0,0);
      
      addChild(canvas = new Sprite);
      
      points = new Array();
      var i:uint, j:uint;
      for (j = 0; j <= yn; j ++) {
        points[j] = new Vector.<Vector3D>();
        for (i = 0; i <= xn; i ++) {
          points[j].push(new Vector3D(  i * texture.width / xn- texture.width / 2,
                                200,
                                j * texture.width / yn + 200));
          
        }
      }
      addEventListener(Event.ENTER_FRAME, h_enterFrame);
    }
    
    public function h_enterFrame(evt:Event):void {
      var i:uint, j:uint;
      var vertices:Vector.<Number> = new Vector.<Number>;
      var indices:Vector.<int> = new Vector.<int>;
      var uvt:Vector.<Number> = new Vector.<Number>;
      var g:Graphics = canvas.graphics;
      
      ang += 0.1;
      for (j = 0; j <= yn; j ++) {
        for (i = 0; i <= xn; i ++) {
          var p3d = new Vector3D(points[j][i].x, points[j][i].y + Math.sin(ang + (j + i) / 2) * 20, points[j][i].z);
          var p:Point = p3dTo2d(p3d);
//          vertices.push(points[j][i].x, points[j][i].z);
          vertices.push(p.x + cx, p.y);
          uvt.push(1 / xn * i, 1/ yn * j, points[j][i].z);
        }
      }
      j = 1;
      for (j = 0; j < yn; j ++) {
        for (i = 0; i < xn; i ++) {
          indices.push(j * (xn + 1) + i, j * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i);
          indices.push( j * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i + 1, (j + 1) * (xn + 1) + i);
        }
      }
      
      g.clear();
      //g.lineStyle(0,0xff0000);
      g.beginBitmapFill(texture);
      g.drawTriangles(vertices, indices, uvt,TriangleCulling.POSITIVE); 
      g.endFill();
    }
    
    private function createTextField(s:String):TextField {
      var tx:TextField = new TextField();
      var tf:TextFormat = new TextFormat();
      tx.text = s;
      return tx
    }
    
    private function p3dTo2d(p3d:Vector3D):Point {
      var p2d:Point = new Point;
      var ratio:Number = fl / p3d.z; 
      p2d.x = p3d.x * ratio;
      p2d.y = p3d.y * ratio - 100;
      
      return p2d
    }
    
    
  }
}