ShadowEditor/THREE/Math/Sphere.cs
2018-12-08 07:44:06 +08:00

202 lines
3.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace THREE
{
public class Sphere
{
function Sphere(center, radius )
{
this.center = (center !== undefined) ? center : new Vector3();
this.radius = (radius !== undefined) ? radius : 0;
}
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);
}
}
}