2017-01-07 01:06:57 +00:00
|
|
|
var Polygon = function (points)
|
2017-01-06 23:59:45 +00:00
|
|
|
{
|
2017-01-07 01:06:57 +00:00
|
|
|
/**
|
|
|
|
* @property {number} area - The area of this Polygon.
|
|
|
|
*/
|
|
|
|
this.area = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @property {array} _points - An array of number pair objects that make up this polygon. I.e. [ {x,y}, {x,y}, {x,y} ]
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
this._points = [];
|
|
|
|
|
|
|
|
if (points)
|
|
|
|
{
|
|
|
|
this.setTo(points);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
Polygon.prototype.constructor = Polygon;
|
|
|
|
|
|
|
|
Polygon.prototype = {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Sets this Polygon to the given points.
|
|
|
|
*
|
|
|
|
* The points can be set from a variety of formats:
|
|
|
|
*
|
|
|
|
* - An array of Point objects: `[new Phaser.Point(x1, y1), ...]`
|
|
|
|
* - An array of objects with public x/y properties: `[obj1, obj2, ...]`
|
|
|
|
* - An array of paired numbers that represent point coordinates: `[x1,y1, x2,y2, ...]`
|
|
|
|
* - An array of arrays with two elements representing x/y coordinates: `[[x1, y1], [x2, y2], ...]`
|
|
|
|
*
|
|
|
|
* `setTo` may also be called without any arguments to remove all points.
|
|
|
|
*
|
|
|
|
* @method Phaser.Polygon#setTo
|
|
|
|
* @param {Phaser.Point[]|number[]|...Phaser.Point|...number} points - The points to set.
|
|
|
|
* @return {Phaser.Polygon} This Polygon object
|
|
|
|
*/
|
|
|
|
setTo: function (points)
|
|
|
|
{
|
|
|
|
this.area = 0;
|
|
|
|
this._points = [];
|
|
|
|
|
|
|
|
if (!Array.isArray(points))
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
var entry;
|
|
|
|
var y0 = Number.MAX_VALUE;
|
|
|
|
var p;
|
|
|
|
|
|
|
|
// The points argument is an array, so iterate through it
|
|
|
|
for (var i = 0; i < points.length; i++)
|
|
|
|
{
|
|
|
|
p = { x: 0, y: 0 };
|
|
|
|
|
|
|
|
if (typeof points[i] === 'number')
|
|
|
|
{
|
|
|
|
p.x = points[i];
|
|
|
|
p.y = points[i + 1];
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
else if (Array.isArray(entry))
|
|
|
|
{
|
|
|
|
// An array of arrays?
|
|
|
|
p.x = points[i][0];
|
|
|
|
p.y = points[i][1];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
p.x = points[i].x;
|
|
|
|
p.y = points[i].y;
|
|
|
|
}
|
|
|
|
|
|
|
|
this._points.push(p);
|
|
|
|
|
|
|
|
// Lowest boundary
|
|
|
|
if (p.y < y0)
|
|
|
|
{
|
|
|
|
y0 = p.y;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
this.calculateArea(y0);
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Calcuates the area of the Polygon. This is available in the property Polygon.area
|
|
|
|
*
|
|
|
|
* @method Phaser.Polygon#calculateArea
|
|
|
|
* @private
|
|
|
|
* @param {number} y0 - The lowest boundary
|
|
|
|
* @return {number} The area of the Polygon.
|
|
|
|
*/
|
|
|
|
calculateArea: function (y0)
|
|
|
|
{
|
|
|
|
var p1;
|
|
|
|
var p2;
|
|
|
|
var avgHeight;
|
|
|
|
var width;
|
|
|
|
|
|
|
|
for (var i = 0, len = this._points.length; i < len; i++)
|
|
|
|
{
|
|
|
|
p1 = this._points[i];
|
|
|
|
|
|
|
|
if (i === len - 1)
|
|
|
|
{
|
|
|
|
p2 = this._points[0];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
p2 = this._points[i + 1];
|
|
|
|
}
|
|
|
|
|
|
|
|
avgHeight = ((p1.y - y0) + (p2.y - y0)) / 2;
|
|
|
|
width = p1.x - p2.x;
|
|
|
|
this.area += avgHeight * width;
|
|
|
|
}
|
|
|
|
|
|
|
|
return this.area;
|
|
|
|
}
|
|
|
|
|
2017-01-06 23:59:45 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = Polygon;
|