topical media & game development

talk show tell print

lib-as-de-polygonal-ds-Array3.ax

lib-as-de-polygonal-ds-Array3.ax (swf ) [ flash ] flex


  
Copyright (c) Michael Baczynski 2007 http://lab.polygonal.de/ds/ This software is distributed under licence. Use of this software implies agreement with all terms and conditions of the accompanying software licence.

  
  package de.polygonal.ds
  {
          import de.polygonal.ds.Collection;
          
          
A three-dimensonal array build upon a single linear array.

  
          public class @ax-lib-as-de-polygonal-ds-Array3 implements Collection
          {
                  private var _a:Array;
                  private var _w:int, _h:int, _d:int;
                  
                  
Initializes a three-dimensional array to match the given width, height and depth. width - The width (number of columns). height - The height (number of rows). depth - The depth (number of layers).

  
                  public function @ax-lib-as-de-polygonal-ds-Array3(w:int, h:int, d:int)
                  {
                          _a = new Array((_w = w) * (_h = h) * (_d = d));
                  }
                  
                  
Indicates the width (columns). If a new width is set, the structure is resized accordingly.

  
                  public function get width():int
                  {
                          return _w;
                  }
                  
                  public function set width(w:int):void
                  {
                          resize(w, _h, _d);
                  }
                  
                  
Indicates the height (rows). If a new height is set, the structure is resized accordingly.

  
                  public function get height():int
                  {
                          return _h;
                  }
                  
                  public function set height(h:int):void
                  {
                          resize(_w, h, _d);
                  }
                  
                  
Indicates the depth (layers). If a new depth is set, the structure is resized accordingly.

  
                  public function get depth():int
                  {
                          return _d;
                  }
                  
                  public function set depth(d:int):void
                  {
                          resize(_w, _h, d);
                  }
                  
                  
Sets each cell in the three-dimensional array to a given value.
parameter: obj The data.

  
                  public function fill(obj:*):void
                  {
                          var k:int = size;
                          for (var i:int = 0; i < k; i++)
                                  _a[i] = obj;
                  }
                  
                  
Reads the data at the given x/y/z index. No boundary check is performed, so you have to make sure the x, y and z index does not exceed the width, height or depth of the structure.
parameter: x The x index.
parameter: y The y index.
parameter: z The z index.

  
                  public function get(x:int, y:int, z:int):*
                  {
                          return _a[int((z * _w * _h) + (y * _w) + x)];
                  }
                  
                  
Writes data into the cell at the given x/y/z index. No boundary check is performed, so you have to make sure the x, y and z index does not exceed the width, height or depth of the structure.
parameter: x The x index.
parameter: y The y index.
parameter: z The z index.
parameter: obj The data to store.

  
                  public function set(x:int, y:int, z:int, obj:*):void
                  {
                          _a[int((z * _w * _h) + (y * _w) + x)] = obj;
                  }
                  
                  
Resizes the array to match the given width, height and depth while preserving existing values.
parameter: w The new width (columns)
parameter: h The new height (rows)
parameter: d The new depth (layers)

  
                  public function resize(w:int, h:int, d:int):void
                  {
                          var tmp:Array = _a.concat();
                          
                          _a.length = 0;
                          _a.length = w * h * d;
                          
                          if (_a.length == 0)
                                  return;
                          
                          var xMin:int = w < _w ? w : _w;
                          var yMin:int = h < _h ? h : _h;
                          var zMin:int = d < _d ? d : _d;
                          
                          var x:int, y:int, z:int;
                          var t1:int, t2:int, t3:int, t4:int;
                          
                          for (z = 0; z < zMin; z++)
                          {
                                  t1 = z *  w  * h;
                                  t2 = z * _w * _h;
                                  
                                  for (y = 0; y < yMin; y++)
                                  {
                                          t3 = y *  w;
                                          t4 = y * _w;
                                          
                                          for (x = 0; x < xMin; x++)
                                                  _a[t1 + t3 + x] = tmp[t2 + t4 + x];
                                  }
                          }
                          
                          _w = w;
                          _h = h;
                          _d = d;
                  }
                  
                  
Checks if a given item exists.
returns: True if the item is found, otherwise false.

  
                  public function contains(obj:*):Boolean
                  {
                          var k:int = size;
                          for (var i:int = 0; i < k; i++)
                          {
                                  if (_a[i] === obj)
                                          return true;
                          }
                          return false;
                  }
                  
                  
Clears all elements.

  
                  public function clear():void
                  {
                          _a = new Array(size);
                  }
                  
                  
Initializes an iterator object pointing to the first item (0, 0) in the first layer.

  
                  public function getIterator():Iterator
                  {
                          return new @fileIterator(this);
                  }
                  
                  
The total number of cells.

  
                  public function get size():int
                  {
                          return _w * _h * _d;
                  }
                  
                  
Checks if the 3d array is empty.

  
                  public function isEmpty():Boolean
                  {
                          return false;
                  }
                  
                  
                  
Converts the structure into an array.
returns: An array.

  
                  public function toArray():Array
                  {
                          var a:Array = _a.concat();
                          
                          var k:int = size;
                          if (a.length > k) a.length = k;
                          return a;
                  }
                  
                  
Returns a string representing the current object.

  
                  public function toString():String
                  {
                          return "[@ax-lib-as-de-polygonal-ds-Array3, size=" + size + "]";
                  }
          }
  }
  
  import de.polygonal.ds.Iterator;
  import de.polygonal.ds.@ax-lib-as-de-polygonal-ds-Array3;
  
  internal class @fileIterator implements Iterator
  {
          private var _values:Array;
          private var _length:int;
          private var _cursor:int;
          
          public function @fileIterator(a3:@ax-lib-as-de-polygonal-ds-Array3)
          {
                  _values = a3.toArray();
                  _length = _values.length;
                  _cursor = 0;
          }
          
          public function get data():*
          {
                  return _values [cursor];
          }
          
          public function set data(obj:*):void
          {
                  _values [cursor] = obj;
          }
          
          public function start():void
          {
                  _cursor = 0;
          }
          
          public function hasNext():Boolean
          {
                  return _cursor < _length;
          }
          
          public function next():*
          {
                  return _values[_cursor++];
          }
  }


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.