| import { Box3 } from './Box3.js'; |
| import { Vector3 } from './Vector3.js'; |
|
|
| |
| |
| |
| |
|
|
| 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 }; |
|
|