2013-04-18 13:16:18 +00:00
|
|
|
/// <reference path="../Game.ts" />
|
|
|
|
|
|
|
|
/**
|
2013-04-18 15:49:08 +00:00
|
|
|
* Phaser - Line
|
|
|
|
*
|
|
|
|
* A Line object is an infinte line through space. The two sets of x/y coordinates define the Line Segment.
|
|
|
|
*/
|
2013-04-18 13:16:18 +00:00
|
|
|
|
|
|
|
module Phaser {
|
|
|
|
|
|
|
|
export class Line {
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @constructor
|
|
|
|
* @param {Number} x1
|
|
|
|
* @param {Number} y1
|
|
|
|
* @param {Number} x2
|
|
|
|
* @param {Number} y2
|
|
|
|
* @return {Phaser.Line} This Object
|
|
|
|
*/
|
|
|
|
constructor(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0) {
|
|
|
|
|
|
|
|
this.setTo(x1, y1, x2, y2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @property x1
|
2013-05-11 16:26:30 +00:00
|
|
|
* @type {Number}
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public x1: number = 0;
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @property y1
|
2013-05-11 16:26:30 +00:00
|
|
|
* @type {Number}
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public y1: number = 0;
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @property x2
|
2013-05-11 16:26:30 +00:00
|
|
|
* @type {Number}
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public x2: number = 0;
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @property y2
|
2013-05-11 16:26:30 +00:00
|
|
|
* @type {Number}
|
2013-04-18 13:16:18 +00:00
|
|
|
*/
|
|
|
|
public y2: number = 0;
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method clone
|
|
|
|
* @param {Phaser.Line} [output]
|
|
|
|
* @return {Phaser.Line}
|
|
|
|
*/
|
|
|
|
public clone(output?: Line = new Line): Line {
|
|
|
|
|
|
|
|
return output.setTo(this.x1, this.y1, this.x2, this.y2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method copyFrom
|
|
|
|
* @param {Phaser.Line} source
|
|
|
|
* @return {Phaser.Line}
|
|
|
|
*/
|
|
|
|
public copyFrom(source: Line): Line {
|
|
|
|
|
|
|
|
return this.setTo(source.x1, source.y1, source.x2, source.y2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method copyTo
|
|
|
|
* @param {Phaser.Line} target
|
|
|
|
* @return {Phaser.Line}
|
|
|
|
*/
|
|
|
|
public copyTo(target: Line): Line {
|
|
|
|
|
|
|
|
return target.copyFrom(this);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method setTo
|
|
|
|
* @param {Number} x1
|
|
|
|
* @param {Number} y1
|
|
|
|
* @param {Number} x2
|
|
|
|
* @param {Number} y2
|
|
|
|
* @return {Phaser.Line}
|
|
|
|
*/
|
|
|
|
public setTo(x1: number = 0, y1: number = 0, x2: number = 0, y2: number = 0): Line {
|
|
|
|
|
|
|
|
this.x1 = x1;
|
|
|
|
this.y1 = y1;
|
|
|
|
this.x2 = x2;
|
|
|
|
this.y2 = y2;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public get width(): number {
|
|
|
|
|
|
|
|
return Math.max(this.x1, this.x2) - Math.min(this.x1, this.x2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public get height(): number {
|
|
|
|
|
|
|
|
return Math.max(this.y1, this.y2) - Math.min(this.y1, this.y2);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method length
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public get length(): number {
|
|
|
|
|
|
|
|
return Math.sqrt((this.x2 - this.x1) * (this.x2 - this.x1) + (this.y2 - this.y1) * (this.y2 - this.y1));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method getY
|
|
|
|
* @param {Number} x
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public getY(x: number): number {
|
|
|
|
|
|
|
|
return this.slope * x + this.yIntercept;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method angle
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public get angle(): number {
|
|
|
|
|
|
|
|
return Math.atan2(this.x2 - this.x1, this.y2 - this.y1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method slope
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public get slope(): number {
|
|
|
|
|
|
|
|
return (this.y2 - this.y1) / (this.x2 - this.x1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method perpSlope
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public get perpSlope(): number {
|
|
|
|
|
|
|
|
return -((this.x2 - this.x1) / (this.y2 - this.y1));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method yIntercept
|
|
|
|
* @return {Number}
|
|
|
|
*/
|
|
|
|
public get yIntercept(): number {
|
|
|
|
|
|
|
|
return (this.y1 - this.slope * this.x1);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method isPointOnLine
|
|
|
|
* @param {Number} x
|
|
|
|
* @param {Number} y
|
|
|
|
* @return {Boolean}
|
|
|
|
*/
|
|
|
|
public isPointOnLine(x: number, y: number): bool {
|
|
|
|
|
|
|
|
if ((x - this.x1) * (this.y2 - this.y1) === (this.x2 - this.x1) * (y - this.y1))
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method isPointOnLineSegment
|
|
|
|
* @param {Number} x
|
|
|
|
* @param {Number} y
|
|
|
|
* @return {Boolean}
|
|
|
|
*/
|
|
|
|
public isPointOnLineSegment(x: number, y: number): bool {
|
|
|
|
|
|
|
|
var xMin = Math.min(this.x1, this.x2);
|
|
|
|
var xMax = Math.max(this.x1, this.x2);
|
|
|
|
var yMin = Math.min(this.y1, this.y2);
|
|
|
|
var yMax = Math.max(this.y1, this.y2);
|
|
|
|
|
|
|
|
if (this.isPointOnLine(x, y) && (x >= xMin && x <= xMax) && (y >= yMin && y <= yMax))
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method intersectLineLine
|
|
|
|
* @param {Any} line
|
|
|
|
* @return {Any}
|
|
|
|
*/
|
|
|
|
public intersectLineLine(line): any {
|
|
|
|
//return Phaser.intersectLineLine(this,line);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method perp
|
|
|
|
* @param {Number} x
|
|
|
|
* @param {Number} y
|
|
|
|
* @param {Phaser.Line} [output]
|
|
|
|
* @return {Phaser.Line}
|
|
|
|
*/
|
|
|
|
public perp(x: number, y: number, output?: Line): Line {
|
|
|
|
|
|
|
|
if (this.y1 === this.y2)
|
|
|
|
{
|
|
|
|
if (output)
|
|
|
|
{
|
|
|
|
output.setTo(x, y, x, this.y1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return new Line(x, y, x, this.y1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var yInt: number = (y - this.perpSlope * x);
|
|
|
|
|
|
|
|
var pt: any = this.intersectLineLine({ x1: x, y1: y, x2: 0, y2: yInt });
|
|
|
|
|
|
|
|
if (output)
|
|
|
|
{
|
|
|
|
output.setTo(x, y, pt.x, pt.y);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
return new Line(x, y, pt.x, pt.y);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
intersectLineCircle (circle:Circle)
|
|
|
|
{
|
|
|
|
var perp = this.perp()
|
|
|
|
return Phaser.intersectLineCircle(this,circle);
|
2013-05-11 16:26:30 +00:00
|
|
|
|
2013-04-18 13:16:18 +00:00
|
|
|
}
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
2013-05-11 16:26:30 +00:00
|
|
|
*
|
2013-04-18 13:16:18 +00:00
|
|
|
* @method toString
|
|
|
|
* @return {String}
|
|
|
|
*/
|
|
|
|
public toString(): string {
|
|
|
|
|
|
|
|
return "[{Line (x1=" + this.x1 + " y1=" + this.y1 + " x2=" + this.x2 + " y2=" + this.y2 + ")}]";
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|