File: src\geom\Circle.ts
/**
*
* @module Kiwi
* @submodule Geom
*/
module Kiwi.Geom {
/**
* A Circle object is an area defined by its position,
* as indicated by its center point (x,y) and diameter.
*
* @class Circle
* @namespace Kiwi.Geom
* @constructor
* @param [x=0] {Number} The x coordinate of the center of the circle.
* @param [y=0] {Number} The y coordinate of the center of the circle.
* @param [diameter=0] {number} The diameter of the circle.
* @return {Kiwi.Geom.Circle} This circle object
*
*/
export class Circle {
constructor (x: number = 0, y: number = 0, diameter: number = 0) {
this.setTo(x, y, diameter);
}
/**
* The type of this object.
* @method objType
* @return {String} "Circle"
* @public
*/
public objType() {
return "Circle";
}
/**
* The diameter of the circle
* @property _diameter
* @type Number
* @default 0
* @private
*/
private _diameter: number = 0;
/**
* The radius of the circle
* @property _radius
* @type Number
* @default 0
* @private
*/
private _radius: number = 0;
/**
* The x coordinate of the center of the circle
* @property x
* @type Number
* @default 0
* @public
*/
public x: number = 0;
/**
* The y coordinate of the center of the circle
* @property y
* @type Number
* @default 0
* @public
*/
public y: number = 0;
/**
* The diameter of the circle.
* The largest distance between any two points on the circle.
* The same as the radius * 2.
*
* @property diameter
* @type number
* @public
*/
public set diameter(value: number) {
if (value > 0)
{
this._diameter = value;
this._radius = value * 0.5;
}
}
public get diameter(): number {
return this._diameter;
}
/**
* The radius of the circle.
* The length of a line extending from the center of the circle to any point on the circle itself.
* The same as half the diameter.
*
* @property radius
* @type number
* @public
*/
public set radius(value: number) {
if (value > 0)
{
this._radius = value;
this._diameter = value * 2;
}
}
public get radius(): number {
return this._radius;
}
/**
* The circumference of the circle. This is READ ONLY.
* @property circumference
* @type number
* @readOnly
* @public
*/
public get circumference(): number {
return 2 * (Math.PI * this._radius);
}
/**
* The sum of the y and radius properties.
* Changing the bottom property of a Circle object has no effect on the x and y properties,
* but does change the diameter.
* @property bottom
* @type number
* @public
*/
public set bottom(value: number) {
if (!isNaN(value))
{
if (value < this.y)
{
this._radius = 0;
this._diameter = 0;
}
else
{
this.radius = value - this.y;
}
}
}
public get bottom(): number {
return this.y + this._radius;
}
/**
* The x coordinate of the leftmost point of the circle.
* Changing the left property of a Circle object has no effect on the x and y properties.
* However it does affect the diameter, whereas changing the x value does not affect the diameter property.
*
* @property left
* @type number
* @public
*/
public set left(value: number) {
if (!isNaN(value))
{
if (value < this.x)
{
this.radius = this.x - value;
}
else
{
this._radius = 0;
this._diameter = 0;
}
}
}
public get left(): number {
return this.x - this._radius;
}
/**
* The x coordinate of the rightmost point of the circle.
* Changing the right property of a Circle object has no effect on the x and y properties.
* However it does affect the diameter, whereas changing the x value does not affect the diameter property.
*
* @property right
* @type number
* @public
*/
public set right(value: number) {
if (value && !isNaN(value))
{
if (value > this.x)
{
this.radius = value - this.x;
}
else
{
this._radius = 0;
this._diameter = 0;
}
}
}
public get right(): number {
return this.x + this._radius;
}
/**
* The sum of the y minus the radius property.
* Changing the top property of a Circle object has no effect on the x and y properties,
* but does change the diameter.
*
* @property top
* @type number
* @public
*/
public set top(value: number) {
if (value && !isNaN(value))
{
if (value > this.y)
{
this._radius = 0;
this._diameter = 0;
}
else
{
this.radius = this.y - value;
}
}
}
public get top(): number {
return this.y - this._radius;
}
/**
* Gets the area of this Circle. Note this is READ ONLY.
* @property area
* @type number
* @readOnly
* @public
*/
public get area(): number {
if (this._radius > 0)
{
return Math.PI * this._radius * this._radius;
}
else
{
return 0;
}
}
/**
* Determines whether or not this Circle object is empty.
* @method isEmpty
* @return {boolean} A value of true if the Circle objects diameter is less than or equal to 0; otherwise false.
* @public
*/
public get isEmpty(): boolean {
if (this._diameter <= 0)
{
return true;
}
return false;
}
/**
* Returns a new Circle object with the same values for the x, y, diameter, and radius properties as the original Circle object.
* @method clone
* @param [output=Circle] {Kiwi.Geom.Circle} If given the values will be set into the object, otherwise a brand new Circle object will be created and returned.
* @return {Kiwi.Geom.Circle}
* @public
*/
public clone(output: Circle = new Circle): Circle {
return output.setTo(this.x, this.y, this._diameter);
}
/**
* Copies all of circle data from a Circle object passed (the source) into this Circle object.
* @method copyFrom
* @param source {Kiwi.Geom.Circle} The source circle object to copy from
* @return {Kiwi.Geom.Circle} This circle object
* @public
*/
public copyFrom(source: Circle): Circle {
return this.setTo(source.x, source.y, source.diameter);
}
/**
* Copies all of circle data from this Circle object into a passed Circle object (destination).
* @method copyTo
* @param circle {Kiwi.Geom.Circle} The destination circle object to copy in to
* @return {Kiwi.Geom.Circle} The destination circle object
* @public
*/
public copyTo(target: Circle) {
return target.copyFrom(this);
}
/**
* Returns the distance from the center of this Circle object to the passed object.
* The passed object can be a Circle, Point, or anything with x/y values.
*
* @method distanceTo
* @param target {Any} The destination Point object.
* @param [round=false] {boolean} Round the distance to the nearest integer (default false)
* @return {Number} The distance between this Point object and the destination Point object.
* @public
*/
public distanceTo(target: any, round: boolean = false): number {
var dx = this.x - target.x;
var dy = this.y - target.y;
if (round === true)
{
return Math.round(Math.sqrt(dx * dx + dy * dy));
}
else
{
return Math.sqrt(dx * dx + dy * dy);
}
}
/**
* Determines whether a Circle passed is equal to this Circle.
* They are considered 'equal' if both circles have the same values for x, y, and diameter properties.
*
* @method equals
* @param toCompare {Kiwi.Geom.Circle} The circle to compare to this Circle object.
* @return {boolean} A value of true if the object has exactly the same values for the x, y and diameter properties as this Circle object; otherwise false.
* @public
*/
public equals(toCompare: Circle): boolean {
if (this.x === toCompare.x && this.y === toCompare.y && this.diameter === toCompare.diameter)
{
return true;
}
return false;
}
/**
* Determines whether a Circle passed intersects with this Circle.
* Returns a boolean indicating if the two circles intersect.
*
* @method intersects
* @param toIntersect {Kiwi.Geom.Circle} The Circle object to compare against to see if it intersects with this Circle object.
* @return {boolean} A value of true if the specified object intersects with this Circle object; otherwise false.
* @public
*/
public intersects(toIntersect: Circle): boolean {
if (this.distanceTo(toIntersect, false) < (this._radius + toIntersect._radius))
{
return true;
}
return false;
}
/**
* Returns a Point object containing the coordinates of a point on the circumference of this Circle based on the given angle.
*
* @method circumferencePoint
* @param angle {Number} The angle in radians (unless asDegrees is true) to return the point from.
* @param [asDegress=false] {boolean} Is the given angle in radians (false) or degrees (true)?
* @param [output] {Kiwi.Geom.Point} A Point object to put the result in to. If none specified a new Point object will be created.
* @return {Kiwi.Geom.Point} The Point object holding the result.
* @public
*/
public circumferencePoint(angle: number, asDegrees: boolean = false, output: Point = new Point): Point {
if (asDegrees === true)
{
angle = angle * (Math.PI / 180); // Radians to Degrees
//angle = angle * (180 / Math.PI); // Degrees to Radians
}
output.x = this.x + this._radius * Math.cos(angle);
output.y = this.y + this._radius * Math.sin(angle);
return output;
}
/**
* Adjusts the location of the Circle object, as determined by its center coordinate, by the specified amounts.
* @method offset
* @param dx {Number} Moves the x value of the Circle object by this amount.
* @param dy {Number} Moves the y value of the Circle object by this amount.
* @return {Kiwi.Geom.Circle} This Circle object.
* @public
*/
public offset(dx: number, dy: number): Circle {
if (!isNaN(dx) && !isNaN(dy))
{
this.x += dx;
this.y += dy;
}
return this;
}
/**
* Adjusts the location of the Circle object using a Point object as a parameter.
* This method is similar to the 'offset' method, except that it takes a Point object as a parameter.
*
* @method offsetPoint
* @param {Kiwi.Geom.Point} point A Point object to use to offset this Circle object.
* @return {Kiwi.Geom.Circle} This Circle object.
* @public
*/
public offsetPoint(point: Point): Circle {
return this.offset(point.x, point.y);
}
/**
* Sets the members of Circle to the specified values.
*
* @method setTo
* @param x {Number} The x coordinate of the center of the circle.
* @param y {Number} The y coordinate of the center of the circle.
* @param diameter {Number} The diameter of the circle in pixels.
* @return {Kiwi.Geom.Circle} This circle object
* @public
*/
public setTo(x: number, y: number, diameter: number): Circle {
this.x = x;
this.y = y;
this._diameter = diameter;
this._radius = diameter * 0.5;
return this;
}
/**
* Returns a string representation of this object.
* @method toString
* @return {string} a string representation of the instance.
* @public
*/
public toString(): string {
return "[{Circle (x=" + this.x + " y=" + this.y + " diameter=" + this.diameter + " radius=" + this.radius + ")}]";
}
}
}