From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- js/helper-classes/3D/Rectangle.js | 209 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 js/helper-classes/3D/Rectangle.js (limited to 'js/helper-classes/3D/Rectangle.js') diff --git a/js/helper-classes/3D/Rectangle.js b/js/helper-classes/3D/Rectangle.js new file mode 100644 index 00000000..e797eedf --- /dev/null +++ b/js/helper-classes/3D/Rectangle.js @@ -0,0 +1,209 @@ +/* +This file contains proprietary software owned by Motorola Mobility, Inc.
+No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ + +/////////////////////////////////////////////////////////////////////// +// Class Rectangle +// 2D rectangle +/////////////////////////////////////////////////////////////////////// +var Rectangle = exports.Rectangle = Object.create(Object.prototype, { + /////////////////////////////////////////////////////////////////////// + // Instance variables + /////////////////////////////////////////////////////////////////////// + m_top: { value: null, writable: true }, + m_left: { value: null, writable: true }, + m_width: { value: null, writable: true }, + m_height: { value: null, writable: true }, + + + /////////////////////////////////////////////////////////////////////// + // Property accessors + /////////////////////////////////////////////////////////////////////// + set: { value: function(l,t,w,h) { this.m_left = l; this.m_top = t; this.m_width = w; this.m_height = h; } }, + + getLeft: { value: function() { return this.m_left; } }, + setLeft: { value: function(l) { this.m_left = l; } }, + + getRight: { value: function() { return this.m_left + this.m_width; } }, + setRight: { value: function(r) { this.m_width = r - this.m_left; } }, + + getBottom: { value: function() { return this.m_top + this.m_height; } }, + setBottom: { value: function(b) { this.m_height = b - this.m_top; } }, + + getTop: { value: function() { return this.m_top; } }, + setTop: { value: function(t) { this.m_top = t; } }, + + getCenter: { value: function() { return Vector.create( [this.m_left + 0.5*this.m_width, this.m_top + 0.5*this.m_height] ); } }, + + getWidth: { value: function() { return this.m_width; } }, + setWidth: { value: function(w) { this.m_width = w; } }, + + getHeight: { value: function() { return this.m_height; } }, + setHeight: { value: function(h) { this.m_height = h; } }, + + geomType: { value: function() { return this.GEOM_TYPE_RECTANGLE; } }, + + /////////////////////////////////////////////////////////////////////// + // Methods + /////////////////////////////////////////////////////////////////////// + contains: { + value: function( x, y ) + { + if (x < this.getLeft()) return false; + if (x > this.getRight()) return false; + if (y < this.getTop()) return false; + if (y > this.getBottom()) return false; + + return true; + } + }, + + dup: { + value: function() + { + var rtnRec = Object.create(Rectangle, {}); + rtnRec.m_top = this.m_top; + rtnRec.m_left = this.m_left; + rtnRec.m_width = this.m_width; + rtnRec.m_height = this.m_height; + + return rtnRec; + } + }, + + onBoundary: { + value: function( x, y ) + { + if ((MathUtils.fpCmp(y,this.getTop()) >= 0) && (MathUtils.fpCmp(y,this.getBottom()) <= 0)) + { + if ((MathUtils.fpCmp(x, this.getLeft()) == 0) || (MathUtils.fpCmp(x, this.getRight()) == 0)) return true; + + if ((MathUtils.fpCmp(x,this.getLeft()) >= 0) && (MathUtils.fpCmp(x,this.getRight()) <= 0)) + { + if ((MathUtils.fpCmp(y, this.getTop()) == 0) || (MathUtils.fpCmp(y, this.getBottom()) == 0)) return true; + } + } + + return false; + } + }, + + setToPoint: { + value: function( pt ) + { + this.m_left = pt[0]; this.m_top = pt[1]; + this.m_width = 0; this.m_height = 0; + } + }, + + setToBounds: { + value: function( bounds ) + { + var pt = bounds[0]; + this.setToPoint( pt ); + for (var i=1; i<4; i++) + this.unionPoint( bounds[i] ); + } + }, + + getPoint: { + value: function(i) + { + if (i < 0) throw( "invalid point index in Rectangle.getPoint: " + i ); + + i = i % 4; + var pt = [0,0]; + switch (i) + { + case 0: + pt[0] = this.getLeft(); + pt[1] = this.getTop(); + break; + + case 1: + pt[0] = this.getLeft(); + pt[1] = this.getBottom(); + break; + + case 2: + pt[0] = this.getRight(); + pt[1] = this.getBottom(); + break; + + case 3: + pt[0] = this.getRight(); + pt[1] = this.getTop(); + break; + } + + return pt; + } + }, + + getQuadrant: { + value: function( iQuad ) + { + // quadrant ordering starts at upper left and continues around counter-clockwise + + var rtnQuad = this.dup(); + var hw = 0.5*this.m_width, hh = 0.5*this.m_height; + rtnQuad.m_width = hw; + rtnQuad.m_height = hh; + switch (iQuad) + { + case 0: + // no-op + break; + + case 1: + rtnQuad.m_top += hh; + break; + + case 2: + rtnQuad.m_left += hw; + rtnQuad.m_top += hh; + break; + + case 3: + rtnQuad.m_left += hw; + break; + + default: + throw new Error( "invalid quadrant to Rectangle.getQuadrant: " + iQuad ); + break; + } + + return rtnQuad; + } + }, + + unionPoint: { + value: function( pt ) + { + var x = pt[0]; + var xMin = this.getLeft(), xMax = this.getRight(); + if (x < xMin) xMin =x; + else if (x > xMax) xMax = x; + + var y = pt[1]; + var yMin = this.getTop(), yMax = this.getBottom(); + if (y < yMin) yMin = y; + else if (y > yMax) yMax = y; + + this.setLeft( xMin ); this.setWidth( xMax - xMin ); + this.setTop( yMin ); this.setHeight( yMax - yMin ); + } + }, + + + translate: { + value: function( dx, dy ) + { + this.m_left += dx; + this.m_top += dy; + } + } +}); + -- cgit v1.2.3