From: Scott Worley Date: Sat, 29 Dec 2012 07:33:47 +0000 (-0800) Subject: Sphere primitive X-Git-Url: http://git.scottworley.com/nt3d/commitdiff_plain/efae2dc27628eb1c0d116b24418fc48cf48c14a3 Sphere primitive --- diff --git a/nt3d.js b/nt3d.js index 239b03c..2876698 100644 --- a/nt3d.js +++ b/nt3d.js @@ -62,6 +62,27 @@ nt3d = { return this.closed_trianglefan([apex].concat(base)).concat( this.trianglefan(base.reverse())); }, + sphere: function(center, radius, latitude_steps, longitude_steps) { + return this.oriented_sphere(center, radius, [0,0,1], [1,0,0], latitude_steps, longitude_steps); + }, + oriented_sphere: function(center, radius, north, greenwich, latitude_steps, longitude_steps) { + var unit_north = this.unit(north); + var north_pole = this.translate_point(this.scale(unit_north, radius), center); + var south_pole = this.translate_point(this.scale(unit_north, -radius), center); + return this.spheroid(north_pole, south_pole, radius, greenwich, latitude_steps, longitude_steps); + }, + spheroid: function(north_pole, south_pole, radius, greenwich, latitude_steps, longitude_steps) { + var delta = this.sub(north_pole, south_pole); + var path = []; + for (var i = 0; i < latitude_steps-1; i++) { + path.push(this.translate_point(south_pole, this.scale(delta, (1-Math.cos(Math.PI*i/(latitude_steps-1)))/2))); + } + path.push(north_pole); + function shape(i) { + return nt3d.circle(radius*Math.sin(Math.PI*i/(latitude_steps-1)), longitude_steps); + } + return this.extrude(path, shape, delta, greenwich); + }, shapenormals_from_closed_path: function(path) { return function(i) { var prev = (i == 0) ? path.length-1 : i-1; diff --git a/sphere_primitive.html b/sphere_primitive.html new file mode 100644 index 0000000..0e5095a --- /dev/null +++ b/sphere_primitive.html @@ -0,0 +1,18 @@ + + + Sphere primitive + + + + +

Sphere primitive

+

There's a sphere primitive.

+ +