Added getBounds method
This commit is contained in:
parent
47372abdbd
commit
720136cd8b
43
csg.js
43
csg.js
|
@ -320,6 +320,38 @@ CSG.prototype = {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// returns an array of two CSG.Vector3Ds (minimum coordinates and maximum coordinates)
|
||||||
|
getBounds: function() {
|
||||||
|
if(!this.cachedBoundingBox)
|
||||||
|
{
|
||||||
|
var minpoint = new CSG.Vector3D(0,0,0);
|
||||||
|
var maxpoint = new CSG.Vector3D(0,0,0);
|
||||||
|
var polygons = this.polygons;
|
||||||
|
var numpolygons = polygons.length;
|
||||||
|
for(var i=0; i < numpolygons; i++)
|
||||||
|
{
|
||||||
|
var polygon = polygons[i];
|
||||||
|
var bounds = polygon.boundingBox();
|
||||||
|
if(i == 0)
|
||||||
|
{
|
||||||
|
minpoint = bounds[0].clone();
|
||||||
|
maxpoint = bounds[1].clone();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
minpoint.x = Math.min(minpoint.x, bounds[0].x);
|
||||||
|
minpoint.y = Math.min(minpoint.y, bounds[0].y);
|
||||||
|
minpoint.z = Math.min(minpoint.z, bounds[0].z);
|
||||||
|
maxpoint.x = Math.max(maxpoint.x, bounds[1].x);
|
||||||
|
maxpoint.y = Math.max(maxpoint.y, bounds[1].y);
|
||||||
|
maxpoint.z = Math.max(maxpoint.z, bounds[1].z);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.cachedBoundingBox = [minpoint, maxpoint];
|
||||||
|
}
|
||||||
|
return this.cachedBoundingBox;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// Parse an option from the options object
|
// Parse an option from the options object
|
||||||
|
@ -874,11 +906,18 @@ CSG.Plane = function(normal, w) {
|
||||||
// point is on the plane.
|
// point is on the plane.
|
||||||
CSG.Plane.EPSILON = 1e-5;
|
CSG.Plane.EPSILON = 1e-5;
|
||||||
|
|
||||||
CSG.Plane.fromPoints = function(a, b, c) {
|
CSG.Plane.fromVector3Ds = function(a, b, c) {
|
||||||
var n = b.minus(a).cross(c.minus(a)).unit();
|
var n = b.minus(a).cross(c.minus(a)).unit();
|
||||||
return new CSG.Plane(n, n.dot(a));
|
return new CSG.Plane(n, n.dot(a));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
CSG.Plane.fromPoints = function(a, b, c) {
|
||||||
|
a = new CSG.Vector3D(a);
|
||||||
|
b = new CSG.Vector3D(b);
|
||||||
|
c = new CSG.Vector3D(c);
|
||||||
|
return CSG.Plane.fromVector3Ds(a, b, c);
|
||||||
|
};
|
||||||
|
|
||||||
CSG.Plane.prototype = {
|
CSG.Plane.prototype = {
|
||||||
flipped: function() {
|
flipped: function() {
|
||||||
return new CSG.Plane(this.normal.negated(), -this.w);
|
return new CSG.Plane(this.normal.negated(), -this.w);
|
||||||
|
@ -1119,7 +1158,7 @@ CSG.Polygon = function(vertices, shared, plane) {
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
this.plane = CSG.Plane.fromPoints(vertices[0].pos, vertices[1].pos, vertices[2].pos);
|
this.plane = CSG.Plane.fromVector3Ds(vertices[0].pos, vertices[1].pos, vertices[2].pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(_CSGDEBUG)
|
if(_CSGDEBUG)
|
||||||
|
|
20
index.html
20
index.html
|
@ -283,7 +283,25 @@ var csg = cube1.subtract(cube2);
|
||||||
var rounded = csg.expand(0.2, 8);
|
var rounded = csg.expand(0.2, 8);
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<h2>2d shapes</h2>
|
<h2>Determining the bounds of an object</h2>
|
||||||
|
The getBounds() function can be used to retrieve the bounding box of an object.
|
||||||
|
This can be useful if you want to align two objects to each other. getBounds() returns
|
||||||
|
an array with two elements specifying the minimum x,y,z coordinate and the maximum x,y,z coordinate:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
var cube1 = CSG.cube({radius: 10});
|
||||||
|
var cube2 = CSG.cube({radius: 5});
|
||||||
|
|
||||||
|
// get the right bound of cube1 and the left bound of cube2:
|
||||||
|
var deltax = cube1.getBounds()[1].x - cube2.getBounds()[0].x;
|
||||||
|
|
||||||
|
// align cube2 so it touches cube1:
|
||||||
|
cube2 = cube2.translate([deltax, 0, 0]);
|
||||||
|
|
||||||
|
return cube1.union(cube2);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2>2D shapes</h2>
|
||||||
Two dimensional shapes can be defined through the Polygon2D class. Currently this requires the polygon to be convex
|
Two dimensional shapes can be defined through the Polygon2D class. Currently this requires the polygon to be convex
|
||||||
(i.e. all corners less than 180 degrees). Shapes can be transformed (rotation, translation, scaling).
|
(i.e. all corners less than 180 degrees). Shapes can be transformed (rotation, translation, scaling).
|
||||||
To actually use the shape it needs to be extruded into a 3D CSG object through the extrude() function. extrude()
|
To actually use the shape it needs to be extruded into a 3D CSG object through the extrude() function. extrude()
|
||||||
|
|
Loading…
Reference in a new issue