text: /**
   * @author bhouston / http://clara.io
   * @author mrdoob / http://mrdoob.com/
   */
  
  THREE.Sphere = function ( center, radius ) {
  
  	this.center = ( center !== undefined ) ? center : new THREE.Vector3();
  	this.radius = ( radius !== undefined ) ? radius : 0;
  
  };
  
  THREE.Sphere.prototype = {
  
  	constructor: THREE.Sphere,
  
  	set: function ( center, radius ) {
  
  		this.center.copy( center );
  		this.radius = radius;
  
  		return this;
  
  	},
  
  	setFromPoints: function () {
  
  		var box = new THREE.Box3();
  
  		return function ( points, optionalCenter ) {
  
  			var center = this.center;
  
  			if ( optionalCenter !== undefined ) {
  
  				center.copy( optionalCenter );
  
  			} else {
  
  				box.setFromPoints( points ).center( center );
  
  			}
  
  			var maxRadiusSq = 0;
  
  			for ( var i = 0, il = points.length; i < il; i ++ ) {
  
  				maxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );
  
  			}
  
  			this.radius = Math.sqrt( maxRadiusSq );
  
  			return this;
  
  		};
  
  	}(),
  
  	clone: function () {
  
  		return new this.constructor().copy( this );
  
  	},
  
  	copy: function ( sphere ) {
  
  		this.center.copy( sphere.center );
  		this.radius = sphere.radius;
  
  		return this;
  
  	},
  
  	empty: function () {
  
  		return ( this.radius <= 0 );
  
  	},
  
  	containsPoint: function ( point ) {
  
  		return ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );
  
  	},
  
  	distanceToPoint: function ( point ) {
  
  		return ( point.distanceTo( this.center ) - this.radius );
  
  	},
  
  	intersectsSphere: function ( sphere ) {
  
  		var radiusSum = this.radius + sphere.radius;
  
  		return sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );
  
  	},
  
  	intersectsBox: function ( box ) {
  
  		return box.intersectsSphere( this );
  
  	},
  
  	intersectsPlane: function ( plane ) {
  
  		// We use the following equation to compute the signed distance from
  		// the center of the sphere to the plane.
  		//
  		// distance = q * n - d
  		//
  		// If this distance is greater than the radius of the sphere,
  		// then there is no intersection.
  
  		return Math.abs( this.center.dot( plane.normal ) - plane.constant ) <= this.radius;
  
  	},
  
  	clampPoint: function ( point, optionalTarget ) {
  
  		var deltaLengthSq = this.center.distanceToSquared( point );
  
  		var result = optionalTarget || new THREE.Vector3();
  
  		result.copy( point );
  
  		if ( deltaLengthSq > ( this.radius * this.radius ) ) {
  
  			result.sub( this.center ).normalize();
  			result.multiplyScalar( this.radius ).add( this.center );
  
  		}
  
  		return result;
  
  	},
  
  	getBoundingBox: function ( optionalTarget ) {
  
  		var box = optionalTarget || new THREE.Box3();
  
  		box.set( this.center, this.center );
  		box.expandByScalar( this.radius );
  
  		return box;
  
  	},
  
  	applyMatrix4: function ( matrix ) {
  
  		this.center.applyMatrix4( matrix );
  		this.radius = this.radius * matrix.getMaxScaleOnAxis();
  
  		return this;
  
  	},
  
  	translate: function ( offset ) {
  
  		this.center.add( offset );
  
  		return this;
  
  	},
  
  	equals: function ( sphere ) {
  
  		return sphere.center.equals( this.center ) && ( sphere.radius === this.radius );
  
  	}
  
  };
  