Spaces:
Running
Running
import { Box3 } from './Box3.js'; | |
import { Vector3 } from './Vector3.js'; | |
/** | |
* @author bhouston / http://clara.io | |
* @author mrdoob / http://mrdoob.com/ | |
*/ | |
function Sphere( center, radius ) { | |
this.center = ( center !== undefined ) ? center : new Vector3(); | |
this.radius = ( radius !== undefined ) ? radius : 0; | |
} | |
Object.assign( Sphere.prototype, { | |
set: function ( center, radius ) { | |
this.center.copy( center ); | |
this.radius = radius; | |
return this; | |
}, | |
setFromPoints: function () { | |
var box = new Box3(); | |
return function setFromPoints( points, optionalCenter ) { | |
var center = this.center; | |
if ( optionalCenter !== undefined ) { | |
center.copy( optionalCenter ); | |
} else { | |
box.setFromPoints( points ).getCenter( 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 ) { | |
return Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius; | |
}, | |
clampPoint: function ( point, target ) { | |
var deltaLengthSq = this.center.distanceToSquared( point ); | |
if ( target === undefined ) { | |
console.warn( 'THREE.Sphere: .clampPoint() target is now required' ); | |
target = new Vector3(); | |
} | |
target.copy( point ); | |
if ( deltaLengthSq > ( this.radius * this.radius ) ) { | |
target.sub( this.center ).normalize(); | |
target.multiplyScalar( this.radius ).add( this.center ); | |
} | |
return target; | |
}, | |
getBoundingBox: function ( target ) { | |
if ( target === undefined ) { | |
console.warn( 'THREE.Sphere: .getBoundingBox() target is now required' ); | |
target = new Box3(); | |
} | |
target.set( this.center, this.center ); | |
target.expandByScalar( this.radius ); | |
return target; | |
}, | |
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 ); | |
} | |
} ); | |
export { Sphere }; | |